1,在pom.xml裏添加以下內容:
<build>
<plugins>
<!--mybatis自動生成代碼插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!-- 是否覆蓋,true表示會替換生成的JAVA文件,false則不覆蓋 -->
<overwrite>true</overwrite>
</configuration>
<dependencies>
<!--mysql驅動包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
2,在resource目錄下新建文件generatorConfig.xml,複製網上找來的配置代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 導入配置文件 -->
<properties resource="jdbc.properties"/>
<!-- defaultModelType="flat" 設置複合主鍵時不單獨爲主鍵創建實體 -->
<context id="mysql" defaultModelType="flat" targetRuntime="MyBatis3">
<!-- 生成的 Java 文件的編碼 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化 Java 代碼 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化 XML 代碼 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--覆蓋生成XML文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<!-- 生成的POJO實現java.io.Serializable接口 -->
<!--<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>-->
<!-- 生成的POJO toString方法插件 -->
<!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>-->
<!-- 分頁 -->
<plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
<!--optional,旨在創建class時,對註釋進行控制-->
<!--<commentGenerator>
<property name="suppressDate" value="true" />
<property name="addRemarkComments" value="true"/>
</commentGenerator>-->
<!-- 自定義註釋生成器 -->
<commentGenerator type="com.sy.ssm.plugin.MyCommentGenerator">
<property name="author" value="linss"/>
<property name="dateFormat" value="yyyy/MM/dd"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!-- 數據庫連接,直接通過${}jdbc.properties裏的配置 -->
<jdbcConnection
driverClass="${ssm.druid.datasource.driverClassName}"
connectionURL="${ssm.druid.datasource.url}"
userId="${ssm.druid.datasource.username}"
password="${ssm.druid.datasource.password}">
<!-- 設置 useInformationSchema 屬性爲 true 以便獲取表的註釋 -->
<property name="useInformationSchema" value="true"/>
</jdbcConnection>
<!--非必須,類型處理器,在數據庫類型和java類型之間的轉換控制-->
<javaTypeResolver>
<!-- 默認情況下數據庫中的 decimal,bigInt 在 Java 對應是 sql 下的 BigDecimal 類 -->
<!-- 不是 double 和 long 類型 -->
<!-- 使用常用的基本類型代替 sql 包下的引用類型 -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成POJO對象,並將類放到com.sy.ssm.entity.ssm包下 -->
<javaModelGenerator targetPackage="com.sy.ssm.entity.ssm" targetProject="src/main/java">
<!--enableSubPackages: value爲true時,包不存在會自動創建-->
<property name="enableSubPackages" value="true"/>
<!-- 是否對modal添加構造函數 -->
<property name="constructorBased" value="true"/>
<!-- 是否清理從數據庫中查詢出的字符串左右兩邊的空白字符 -->
<property name="trimStrings" value="true"/>
<!-- 建立model對象是否不可改變 即生成的model對象不會有setter方法,只有構造方法 -->
<property name="immutable" value="false"/>
<property name="rootClass" value="com.sy.ssm.services.vo.BaseVo"/>
</javaModelGenerator>
<!-- 生成mapper xml文件,並放到resources下的mapper/ssm文件夾下 -->
<sqlMapGenerator targetPackage="mapper.ssm" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成mapper xml對應dao接口,com.sy.ssm.mapper.ssm包下-->
<javaClientGenerator targetPackage="com.sy.ssm.mapper.ssm" targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- useActualColumnNames:如果爲true,則MBG將使用從數據庫元數據返回的列名作爲生成的域對象的屬性。
如果爲false(默認),則MBG將嘗試以駝峯式表示返回的名稱。
默認值爲false。-->
<!-- table標籤可以有多個,至少一個,tableName指定表名,可以使用_和%通配符 -->
<table tableName="sm_regist_channel"
enableCountByExample="true" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="true"
selectByExampleQueryId="false">
<!-- 是否只生成POJO對象 -->
<property name="modelOnly" value="false"/>
<!-- generatedKey用於生成生成主鍵的方法 -->
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
<domainObjectRenamingRule searchString="^Sm" replaceString=""/>
</table>
</context>
</generatorConfiguration>
3,很巧妙地發現"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"這一行報紅,於是在pom中添加依賴如下:
<dependency>
<groupId>org.mybatis.generator</groupId
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
4,刷新maven配置,在External Libraries列表中找到這個包並複製path。
5,如圖添加配置信息
6,解決自動生成註釋的問題,自定義註釋生成器(maven執行插件會有問題,通過執行如下代碼中main方法)
package com.sy.ssm.plugin;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.mybatis.generator.internal.util.StringUtility;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import static org.mybatis.generator.internal.util.StringUtility.isTrue;
/**
* @author linss
* @program sy-smart-marketing
* @create 2019-12-19 19:15
*/
public class MyCommentGenerator implements CommentGenerator {
public static void main(String[] args) {
List<String> warnings = new ArrayList<>();
// 覆蓋
boolean overwrite = true;
// 給出generatorConfig.xml文件的位置
File configFile = new File("C:\\D\\projects\\02upgrade\\sy-smart-marketing\\src\\main\\resources\\generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
try {
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
} catch (Exception e) {
e.printStackTrace();
}
}
private Properties properties;
/**
* 抑制日期 默認false:不抑制
*/
private boolean suppressDate = false;
/**
* 抑制註釋 默認false:不抑制
*/
private boolean suppressAllComments = false;
/**
* 顯示數據庫comments 默認false:不顯示
*/
private boolean addRemarkComments = true;
/**
* 日期格式
*/
private SimpleDateFormat dateFormat;
public MyCommentGenerator() {
super();
properties = new Properties();
suppressDate = false;
suppressAllComments = false;
addRemarkComments = false;
}
/**
* 讀取配置文件
*
* @param properties
*/
@Override
public void addConfigurationProperties(Properties properties) {
this.properties.putAll(properties);
suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
addRemarkComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT);
if (StringUtility.stringHasValue(dateFormatString)) {
dateFormat = new SimpleDateFormat(dateFormatString);
}
}
/**
* 日期格式化
*
* @return 格式化後的日期
*/
protected String getDateString() {
if (this.suppressDate) {
return null;
} else {
return this.dateFormat != null ? this.dateFormat.format(new Date()) : (new Date()).toString();
}
}
/**
* 創建的數據表對應的類添加的註釋
*
* @param topLevelClass
* @param introspectedTable
*/
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
if (!this.suppressAllComments) {
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @author "+ properties.getProperty("author"));
topLevelClass.addJavaDocLine(" * @version V1.0 ");
topLevelClass.addJavaDocLine(" * @description MyBatis Generator 自動創建,對應數據表爲:" + introspectedTable.getFullyQualifiedTable());
topLevelClass.addJavaDocLine(" * @create " + this.getDateString());
topLevelClass.addJavaDocLine(" */");
}
}
/**
* <p>生成xx.java文件(model)屬性的註釋</p>
*
* @param field
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (!this.suppressAllComments) {
// 註釋開始的地方
field.addJavaDocLine("/**");
String remarks = introspectedColumn.getRemarks();
// 開啓註釋,並且數據庫中comment有值
if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
// 通過換行符分割 System.getProperty("line.separator"):換行符 ,屏蔽了 Windows和Linux的區別
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
int length = remarkLines.length;
// 如果有多行,就換行顯示
for (int i = 0; i < length; i++) {
String remarkLine = remarkLines[i];
field.addJavaDocLine(" * " + remarkLine);
}
}
// 註釋結束
field.addJavaDocLine(" */");
}
}
/**
* xxxMapper接口和xxxExample類方法註解
*
* @param method
* @param introspectedTable
*/
@Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
if (!this.suppressAllComments) {
method.addJavaDocLine("/**");
method.addJavaDocLine(" * " + method.getName());
List<Parameter> parameters = method.getParameters();
parameters.forEach(parameter -> method.addJavaDocLine(" * @param " + parameter.getName()));
// 如果有返回類型,添加@return
String returnType = "void";
if (!returnType.equals(method.getReturnType())) {
method.addJavaDocLine(" * @return ");
}
method.addJavaDocLine(" */");
}
}
/**
* 數據庫對應實體類的Getter方法註解
*
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
/**
* 數據庫對應實體類的Setter方法註解
*
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
/**
* 生成xxMapper.XML文件的註釋
*
* @param xmlElement
*/
@Override
public void addComment(XmlElement xmlElement) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
}
@Override
public void addRootComment(XmlElement rootElement) {
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
}
@Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
}
}
7,檢查修改配置內容,比如application.properties中配置信息,按實際情況獲取配置。