1.generatorConfig.xml (mybatis逆向工程核心配置类)
<?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="db.properties"/> <context id="testTables" targetRuntime="MyBatis3"> <!--自定义生成注解的方法,去掉就没有注释,@mapper @data等--> <plugin type="org.javaboy.demo.config.MyBatisPlugin" > <property name="hasLombok" value="true就是生成"/> </plugin> <plugin type="org.mybatis.generator.plugins.ToStringPlugin" /> <!-- <commentGenerator>--><!-- <!– 是否去除自动生成的注释 true:是 : false:否 –>--><!-- <property name="suppressAllComments" value="true"/>--><!-- <property name="suppressDate" value="false"/>--> <!--带序列化--><!-- <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />--><!-- <!–自动带toString方法–>--><!-- <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />--><!-- </commentGenerator>--> <!--type 是自定义的类,通过扩展CommentGenerator实现自定义生成注释--> <commentGenerator type="org.javaboy.demo.config.MyCommentGenerator"> <!-- 不要开启,否则将不会使用自定义注释 --> <property name="suppressAllComments" value="false"/> <property name="suppressDate" value="false"/> <!--带序列化--><!-- <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />--><!-- <!–自动带toString方法–>--><!-- <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />--> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="${jdbc.driverClassName}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="org.javaboy.demo.bean" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="org.javaboy.demo.mapper" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 指定数据库表 --> <!--<table tableName="userinfo"></table>--> <!--<table tableName="user"></table>--> <table tableName="adjustsalary" domainObjectName="AdjustSalary" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> </context></generatorConfiguration>
2.db.properties(数据库配置类)
jdbc.driverClassName=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaijdbc.username=rootjdbc.password=123456
3.MyCommentGenerator.java(自定义comment生成器自定义注释等)
package org.javaboy.demo.config;import static org.mybatis.generator.internal.util.StringUtility.isTrue;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties;import java.util.Set;import org.mybatis.generator.api.CommentGenerator;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.dom.java.*;import org.mybatis.generator.api.dom.xml.TextElement;import org.mybatis.generator.api.dom.xml.XmlElement;import org.mybatis.generator.config.MergeConstants;import org.mybatis.generator.config.PropertyRegistry;/** * @Title: MyCommentGenerator.java * @Package com.fendo.mybatis_generator_plus * @Description: mybatis generator 自定义comment生成器. 基于MBG 1.3.5 * @author findme * @date 2017年10月5日 下午3:07:26 * @version V1.0 */public class MyCommentGenerator implements CommentGenerator { /** * properties配置文件 */ private Properties properties; /** * properties配置文件 */ private Properties systemPro; /* * 父类时间 */ private boolean suppressDate; /** * 父类所有注释 */ private boolean suppressAllComments; /** * 当前时间 */ private String currentDateStr; public MyCommentGenerator() { super(); properties = new Properties(); systemPro = System.getProperties(); suppressDate = false; suppressAllComments = false; currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date()); } /** * Java类的类注释 */ public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); innerClass.addJavaDocLine("/**"); sb.append(" * "); sb.append(introspectedTable.getFullyQualifiedTable()); sb.append(" "); sb.append(getDateString()); innerClass.addJavaDocLine(sb.toString().replace("\n", " ")); innerClass.addJavaDocLine(" */"); } /** * 为类添加注释 */ public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); innerClass.addJavaDocLine("/**"); sb.append(" * "); sb.append(" * "); sb.append(introspectedTable.getFullyQualifiedTable()); innerClass.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @author "); sb.append(systemPro.getProperty("user.name")); sb.append(" "); sb.append(currentDateStr); innerClass.addJavaDocLine(" */"); } /** * Mybatis的Mapper.xml文件里面的注释 */ public void addComment(XmlElement xmlElement) { } /** * * @Title addConfigurationProperties @Description: * 从该配置中的任何属性添加此实例的属性CommentGenerator配置。 这个方法将在任何其他方法之前被调用。 @Author fendo @Date * 2017年10月5日 下午3:45:58 @return @throws */ 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)); } /** * * @Title getDateString @Description: 此方法返回格式化的日期字符串以包含在Javadoc标记中和XML注释。 * 如果您不想要日期,则可以返回null在这些文档元素中。 @Author fendo @Date 2017年10月5日 * 下午3:45:58 @return @throws */ protected String getDateString() { String result = null; if (!suppressDate) { result = currentDateStr; } return result; } /** * * @Title addJavadocTag @Description: 此方法为其添加了自定义javadoc标签。 @Author fendo @Date * 2017年10月5日 下午3:49:05 @param javaElement @param markAsDoNotDelete @throws */ protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) { javaElement.addJavaDocLine(" *"); StringBuilder sb = new StringBuilder(); sb.append(" * "); sb.append(MergeConstants.NEW_ELEMENT_TAG); if (markAsDoNotDelete) { sb.append(" do_not_delete_during_merge"); } String s = getDateString(); if (s != null) { sb.append(' '); sb.append(s); } javaElement.addJavaDocLine(sb.toString()); } /** * 为枚举添加注释 */ public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); innerEnum.addJavaDocLine("/**"); sb.append(" * "); sb.append(introspectedTable.getFullyQualifiedTable()); innerEnum.addJavaDocLine(sb.toString().replace("\n", " ")); innerEnum.addJavaDocLine(" */"); } /** * Java属性注释 */ public void addFieldComment(Field field, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); field.addJavaDocLine("/**"); sb.append(" * "); sb.append(introspectedTable.getFullyQualifiedTable()); field.addJavaDocLine(sb.toString().replace("\n", " ")); field.addJavaDocLine(" */"); } /** * 为字段添加注释 */ public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); field.addJavaDocLine("/**"); sb.append(" * "); // 如果注释为空则 则注释上的字段为字段名字 if(introspectedColumn.getRemarks().isEmpty()){ sb.append(introspectedColumn.getActualColumnName()); } else{ sb.append(introspectedColumn.getRemarks()); } field.addJavaDocLine(sb.toString().replace("\n", " ")); field.addJavaDocLine(" */"); } /** * 普通方法的注释,这里主要是XXXMapper.java里面的接口方法的注释 */ public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } method.addJavaDocLine("/**"); addJavadocTag(method, false); method.addJavaDocLine(" */"); } /** * 给getter方法加注释 */ public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {// if (suppressAllComments) {// return;// }// method.addJavaDocLine("/**");// StringBuilder sb = new StringBuilder();// sb.append(" * ");// sb.append(introspectedColumn.getRemarks());// method.addJavaDocLine(sb.toString().replace("\n", " "));// sb.setLength(0);// sb.append(" * @return ");// sb.append(introspectedColumn.getActualColumnName());// sb.append(" ");// sb.append(introspectedColumn.getRemarks());// method.addJavaDocLine(sb.toString().replace("\n", " "));// method.addJavaDocLine(" */"); return; } /** * 给Java文件加注释,这个注释是在文件的顶部,也就是package上面。 */ public void addJavaFileComment(CompilationUnit compilationUnit) {// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// compilationUnit.addFileCommentLine("/*");// compilationUnit.addFileCommentLine("*");// compilationUnit.addFileCommentLine("* " + compilationUnit.getType().getShortName() + ".java");// compilationUnit.addFileCommentLine("* Copyright(C) 2017-2020 fendo公司");// compilationUnit.addFileCommentLine("* @date " + sdf.format(new Date()) + "");// compilationUnit.addFileCommentLine("*/"); return; } /** * 为模型类添加注释 */ public void addModelClassComment(TopLevelClass arg0, IntrospectedTable arg1) { } /** * 为调用此方法作为根元素的第一个子节点添加注释。 */ public void addRootComment(XmlElement arg0) { } @Override public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } /** * 给setter方法加注释 */ public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {// if (suppressAllComments) {// return;// }// method.addJavaDocLine("/**");// StringBuilder sb = new StringBuilder();// sb.append(" * ");// sb.append(introspectedColumn.getRemarks());// method.addJavaDocLine(sb.toString().replace("\n", " "));// Parameter parm = method.getParameters().get(0);// sb.setLength(0);// sb.append(" * @param ");// sb.append(parm.getName());// sb.append(" ");// sb.append(introspectedColumn.getRemarks());// method.addJavaDocLine(sb.toString().replace("\n", " "));// method.addJavaDocLine(" */"); return; }}
4.MyBatisPlugin.java (此类可以实现自定义生成注解)
package org.javaboy.demo.config;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.PluginAdapter;import org.mybatis.generator.api.dom.java.*;import org.mybatis.generator.internal.util.StringUtility;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;/** * @ClassName 自定义生成注解的一些方法 * @Description * @Author find me * @Date 2020/7/5 0005 15:09 * @Version 1.0 */public class MyBatisPlugin extends PluginAdapter { @Override public boolean validate(List<String> list) { return true; } /** * 给实体类上生成注释 */ @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { //添加domain的import 如果不需要则注释掉 topLevelClass.addImportedType("lombok.Data"); //添加domain的注解 topLevelClass.addAnnotation("@Data"); topLevelClass.addJavaDocLine("/**"); String remarks = introspectedTable.getRemarks(); if (StringUtility.stringHasValue(remarks)) { String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { topLevelClass.addJavaDocLine(" * " + remarkLine); } }// StringBuilder sb = new StringBuilder(); topLevelClass.addJavaDocLine("/**"); sb.append(" * @ClassName "+topLevelClass.getType().getShortName()); topLevelClass.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Description "+topLevelClass.getType().getShortName()); topLevelClass.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Author "+"findme"); topLevelClass.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Date "+getDateString()); topLevelClass.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Version "+"1.0"); topLevelClass.addJavaDocLine(sb.toString().replace("\n", " ")); introspectedTable.getTableConfiguration().getDomainObjectName(); topLevelClass.addJavaDocLine(" */"); return true; } @Override public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {// field.addJavaDocLine("/**");// String remarks = introspectedColumn.getRemarks();// if (StringUtility.stringHasValue(remarks)) {// String[] remarkLines = remarks.split(System.getProperty("line.separator"));// for (String remarkLine : remarkLines) {// field.addJavaDocLine(" * " + remarkLine);// }// }// field.addJavaDocLine(" */"); return true; } /** * 为类添加注释 生成如下注释 */ /** * @Title: MyCommentGenerator.java * @Package com.fendo.mybatis_generator_plus * @Description: mybatis generator 自定义comment生成器. 基于MBG 1.3.5 * @author fendo * @date 2017年10月5日 下午3:07:26 * @version V1.0 */ @Override public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { //添加Mapper的import interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper")); interfaze.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Component;")); //添加Mapper的注解 StringBuilder sb = new StringBuilder(); interfaze.addJavaDocLine("/**"); sb.append(" * @ClassName "+interfaze.getType().getShortName()); interfaze.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Description "+interfaze.getType().getShortName()); interfaze.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Author "+"findme"); interfaze.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Date "+getDateString()); interfaze.addJavaDocLine(sb.toString().replace("\n", " ")); sb.setLength(0); sb.append(" * @Version "+"1.0"); interfaze.addJavaDocLine(sb.toString().replace("\n", " ")); introspectedTable.getTableConfiguration().getDomainObjectName(); interfaze.addJavaDocLine(" */"); /*为类添加注释*/ interfaze.addAnnotation("@Mapper"); interfaze.addAnnotation("@Component"); return true; } @Override public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { //不生成getter return true; } @Override public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { //不生成setter return true; } protected String getDateString() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(new Date()) ; }}
5.MyBatisGeneratorTest(程序入口)
package org.javaboy.demo;import org.junit.Test;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;import java.io.File;import java.util.ArrayList;import java.util.List;public class MyBatisGeneratorTest { @Test public void generatorTest() throws Exception{ try { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; // 指向逆向工程配置文件 File configFile = new File("src/main/resources/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); System.out.println("结束"); } catch (Exception e) { e.printStackTrace(); } }}
6.pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.javaboy</groupId> <artifactId>mybatis-generator</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--日志依赖--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--mybatis核心--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!--junit依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--数据库依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!--生成po、mapper.java、mapper.xml核心jar--> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.6</version> </dependency> </dependencies> <build> <plugins> <!-- mybatis-generator自动生成代码插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <!-- 配置generatorConfig.xml的路径和名称 --> <configuration> <configurationFile> ${basedir}\src\main\resources\generatorConfig.xml </configurationFile> </configuration> <!-- 配置generator运行插件,使maven执行generator --><!-- <executions>--><!-- <execution>--><!-- <id>Generate MyBatis Artifacts</id>--><!-- <goals>--><!-- <goal>generate</goal>--><!-- </goals>--><!-- </execution>--><!-- </executions>--> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>6</source> <target>6</target> </configuration> </plugin> </plugins> </build></project>