美文网首页
MyBatis 代码生成插件

MyBatis 代码生成插件

作者: SheHuan | 来源:发表于2021-06-14 21:20 被阅读0次

    maven 项目中,整合了 MyBatis 后,可以集成 mybatis generator 插件来生成数据库表对应的 Java Bean、 以及 MyBatis 的 mapper 文件。

    首先在pom.xml添加插件:

    <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.7</version>
        <configuration>
            <verbose>true</verbose>
            <!--生成文件时是否覆盖已有文件-->
            <overwrite>true</overwrite>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <!-- 根据自己的数据库版本修改 -->
                <version>8.0.15</version>
            </dependency>
        </dependencies>
    </plugin>
    

    然后将插件的配置文件generatorConfig.xml放在resources目录:

    <?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>
        <context id="mysql" defaultModelType="hierarchical"
                 targetRuntime="MyBatis3Simple">
    
            <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表; 一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
            <property name="autoDelimitKeywords" value="false"/>
            <!-- 生成的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"/>
    
            <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
    
            <property name="mergeable" value="flase"/>
    
            <!-- 配置表结构对应 Java Bean 的注解生成器 -->
            <commentGenerator>
                <property name="suppressDate" value="true"/>
                <property name="addRemarkComments" value="true"/>
            </commentGenerator>
    
            <!-- 配置数据库连接 -->
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=GMT%2B0"
                            userId="root"
                            password="shehuan">
                <property name="nullCatalogMeansCurrent" value="true"/>
            </jdbcConnection>
    
            <!-- java 类型处理器 用于处理 DB中的类型到 java 中的类型,默认使用 JavaTypeResolverDefaultImpl;
                 注意一点,默认会先尝试使用 Integer,Long,Short 等来对应 DECIMAL 和 NUMERIC 数据类型 -->
            <javaTypeResolver
                    type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
    
            <!-- 生成 mysql表对应的 Java Bean 类
                targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
                targetProject:目标项目,指定一个存在的目录,生成的类会放到指定目录中,如果目录不存在,生成器不会自动建目录 -->
            <javaModelGenerator targetPackage="com.sh.mybatis.bean"
                                targetProject="src/main/java">
                <!-- 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter; -->
                <property name="constructorBased" value="false"/>
    
                <!-- 是否创建一个不可变的类,如果为true,那么代码生成器会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 -->
                <property name="immutable" value="false"/>
    
                <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
                <property name="trimStrings" value="false"/>
            </javaModelGenerator>
    
            <!-- 生成 mapper.xml 文件,如果 javaClientGenerator中配置了 type="XMLMAPPER",这个元素就必须配置 -->
            <sqlMapGenerator targetPackage="com.sh.mybatis.mapper"
                             targetProject="src/main/java">
                <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
    
            <!-- 生成 mapper.java 接口文件,type可选的参数如下:
                1、ANNOTATEDMAPPER:会生成 mapper.java 接口,sql 以注解的形式出现在接口方法上,不会生成对应的 xml 文件
                2、XMLMAPPER:会生成 mapper.java 接口,以及包含 sql 的 mapper.xml 文件 -->
            <javaClientGenerator targetPackage="com.sh.mybatis.mapper"
                                 type="XMLMAPPER" targetProject="src/main/java">
                <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
                <property name="enableSubPackages" value="true"/>
    
                <!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查 -->
                <property name="rootInterface" value=""/>
            </javaClientGenerator>
    
            <!-- tableName的值为 % 表示给所有表生成 bean、mapper;或者单独指定表名也行 -->
            <table tableName="%" schema="SCOTT">
                <property name="constructorBased" value="false"/>
                <generatedKey column="id" sqlStatement="JDBC"/>
            </table>
        </context>
    </generatorConfiguration>
    

    jdbcConnection标签是用来配置数据库连接的。

    修改javaModelGeneratorsqlMapGeneratorjavaClientGenerator标签中的targetPackage属性来配置生成文件保存的目录即可。

    最后边的table标签用来配置生成单表的文件还是全部表的文件。

    最后编译项目,运行如下插件即可:


    生成的目标文件如下:

    但是里边的注释乱七八糟的,额外添加了许多没用的:


    这是由于插件生成注解时默认使用DefaultCommentGenerator类,我们理想的情况是只在生成数据库表对应的 Java Bean 时添加表以及字段的注释即可。

    所以就需要自定义注解生成的类,先添加依赖:

    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.7</version>
    </dependency>
    

    自定义的注解生成类如下,需要实现CommentGenerator接口:

    public class MyCommentGenerator implements CommentGenerator {
        private Properties properties;
    
        public MyCommentGenerator() {
            properties = new Properties();
        }
    
        @Override
        public void addConfigurationProperties(Properties properties) {
            // 获取自定义的 properties
            this.properties.putAll(properties);
        }
        // 字段注解
        @Override
        public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                    IntrospectedColumn introspectedColumn) {
            if (StringUtils.isEmpty(introspectedColumn.getRemarks())) {
                return;
            }
            // 获取字段注释
            String remarks = introspectedColumn.getRemarks();
    
            field.addJavaDocLine("/**");
            field.addJavaDocLine(" * " + remarks);
            field.addJavaDocLine(" */");
        }
    
        // 类注解
        @Override
        public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
            String author = properties.getProperty("author");
    
            // 获取表注释
            String remarks = introspectedTable.getRemarks();
    
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * " + remarks);
            topLevelClass.addJavaDocLine(" *");
            topLevelClass.addJavaDocLine(" * @author " + author);
            topLevelClass.addJavaDocLine(" */");
        }
    }
    

    然后在generatorConfig.xml中修改注解生成器的配置,指定我们自定义的注释生成类:

    <!-- 配置表结构对应 Java Bean 的注解生成器 -->
    <commentGenerator type="com.sh.mybatis.generator.MyCommentGenerator">
        <!-- 自定义属性 -->
        <property name="author" value="zhangsan"/>
    </commentGenerator>
    

    由于使用了自定义的注释生成类,所以无法像前边那样直接运行插件完成操作,需要我们通过代码来执行:

    public class MyGenerator {
        public static void main( String[] args ) throws Exception {
            List<String> warnings = new ArrayList<>();
            File configFile = new File("src/main/resources/generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configFile);
            DefaultShellCallback callback = new DefaultShellCallback(true);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        }
    }
    

    运行后,再看User类的注释,就符合我们的预期了:

    相关文章

      网友评论

          本文标题:MyBatis 代码生成插件

          本文链接:https://www.haomeiwen.com/subject/omaqsltx.html