美文网首页
MyBatis Generator使用记录

MyBatis Generator使用记录

作者: melith | 来源:发表于2019-12-30 17:31 被阅读0次

    在使用MyBatis过程中,每个表可能会对应一个实体。如果表结构很多,表中字段很多,手动在项目中再把表结构敲一遍确实很费劲。
    MyBatis Generator可以帮助我们自动根据表结构生成model,mapper和xml,为了记录一下使用过程,专门记录一下。
    关于更多的MyBatis Generator相关内容,请查阅官方文档,此外提供一篇介绍得很详细的博客

    运行MyBatis Generator的方式有命令行、Ant、Maven以及Java这四种方式,这里主要采用Maven方式,并且使用Idea。其它方式可以参阅上方文档。

    1. pom中添加引用
    <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <!-- 版本号 -- >
        <version>1.4.0</version>
        <configuration>
            <!-- MBG配置文件路径 ${basedir}表示本项目路径 -->
            <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.18</version>
            </dependency>
        </dependencies>
    </plugin>
    

    添加完插件后,可以在Idea的Maven插件中看到mybatis-generator

    1. 编写配置文件
      配置文件地址及文件名需要与第一步中配置的相同
    <?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>
        <!-- 引入当前目录下的generator.properties文件>
        <properties resource="generator.properties"/>
    
        <context id="context" targetRuntime="MyBatis3">
            <!-- MBG生成的注释 -->
            <commentGenerator>
                <property name="suppressAllComments" value="false"/>
                <property name="suppressDate" value="true"/>
            </commentGenerator>
            <!-- 数据库连接 -->
            <jdbcConnection driverClass="${jdbc.driverClass}"
                            connectionURL="${jdbc.connectionURL}"
                            userId="${jdbc.userId}"
                            password="${jdbc.password}">
                <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
                <property name="nullCatalogMeansCurrent" value="true"/>
            </jdbcConnection>
            <!--生成model-->
            <javaModelGenerator targetPackage="com.melith.mall.mbg.model" targetProject="E:\MyProjects\MyMall\src\main\java">
                <property name="enableSubPackages" value="false"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!--生成xml文件-->
            <sqlMapGenerator targetPackage="mapper"
                             targetProject="E:\MyProjects\MyMall\src\main\resources">
                <property name="enableSubPackages" value="false"/>
            </sqlMapGenerator>
            <!--生成mapper java文件,type不能漏-->
            <javaClientGenerator
                    type="XMLMAPPER"
                    targetPackage="com.melith.mall.mbg.mapper"
                    targetProject="E:\MyProjects\MyMall\src\main\java">
                <property name="enableSubPackages" value="false"/>
            </javaClientGenerator>
    
            <!-- 根据哪一张表来生成 -- >
            <table tableName="dl_user" enableCountByExample="true"
                   enableDeleteByExample="true"
                   enableSelectByExample="true"
                   enableUpdateByExample="true"/>
        </context>
    </generatorConfiguration>
    

    下面来详细解释一下这里的配置:

    • context 指定一组生成对象的环境,可以使MBG从不同的数据库,或者根据不同的配置生成对象
    • commentGenerator 元素用来定义注释生成器,可以不要,下面解释下属性及其值:
      • suppressAllComments 是否关闭自动生成注释
        • true 不生成注释
        • false 会生成注释,默认为false
      • suppressDate 是否关闭自动生成时间戳
        • true 不添加时间戳
        • false 添加时间戳,默认为false
      • addRemarkComments 是否添加数据库内的注释
        • true
        • false
    • jdbcConnection 数据库连接所需属性
      • driverClass 用于访问数据库的JDBC驱动程序的完全限定类名称
      • connectionURL 用于访问数据库的JDBC连接URL
      • userId 数据库用户名
      • password 数据库密码
      • 任何子元素将添加到JDBC驱动程序的属性中
    • javaModelGenerator 生成model/entity
      • targetPackage 生成的model存放放的包的名称
      • targetProject 包所在项目,这里需要填绝对路径
      • enableSubPackages 在targetPackage的基础上再生成一层package,最终model存放在这个package下
        • true 生成新package
        • false 不生成新package,默认false
          比如targetPackage的值为com.mycompany,值为true时,model会放在com.mycompany.myschema下;为false是就放在com.mycompany下
      • trimStrings getter方法对String字段调用trim()方法
        • true 设置
        • false 不设置,默认false
    • sqlMapGenerator 生成sql
      • targetPackage 目标包
      • targetProject 目标项目,绝对地址
    • javaClientGenerator 生成mapper接口
      • type 怎么生成接口
        • ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
        • MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;、
        • XMLMAPPER:会生成Mapper接口,接口完全依赖XML
          context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
    • table 选择一个或多个table来生成相关文件
      1. SQL map文件
      2. 生成一个主键类
      3. 除了BLOB和主键的其他字段的类
      4. 包含BLOB的类
      5. 一个用户生成动态查询的条件类(selectByExample,deleteByExample),可选
      6. Mapper接口(可选)
      • tableName 要生成对象的表名,所有表可以用%
      • enableDeleteByExample 是否生成动态删除语句,其它的类似
      • generatedKey MBG会在生成的<insert>元素中生成一条正确的<selectKey>元素
        • true
        • false
          <generatedKey column="id" sqlStatement="MySql" identity="true"/>
      • columnOverride 修改表中某个列的属性
      <columnOverride column="username">
          <property name="property" value="userName"/>
      </columnOverride>
      
      username改为userName

    有些时候我们想要自己生成注释,可以自己实现一个类继承DefaultCommentGenerator

    <commentGenerator type="com.melith.mall.mbg.CommentGenerator">
        <property name="suppressAllComments" value="true"/>
        <property name="suppressDate" value="true"/>
        <property name="addRemarkComments" value="true"/>
    </commentGenerator>
    

    配置文件的commentGenerator元素加上type属性,值为自己实现的类的
    但是,这个时候不能使用插件生成,原因和解决方法可以参考博客

    public class CommentGenerator extends DefaultCommentGenerator {
    
        private static final String EXAMPLE_SUFFIX = "Example";
        private static final String MAPPER_SUFFIX = "Mapper";
        private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";
    
        /**
         * 给字段添加注释
         *
         * @param field
         * @param introspectedTable
         * @param introspectedColumn
         */
        @Override
        public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
            String remarks = introspectedColumn.getRemarks();
            //根据参数和备注信息判断是否添加备注信息
            if (StringUtility.stringHasValue(remarks)) {
                //数据库中特殊字符需要转义
                if (remarks.contains("\"")) {
                    remarks = remarks.replace("\"", "'");
                }
                //给model的字段添加swagger注解
                field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\")");
            }
        }
    
        /**
         * 给Model文件添加注释,Mapper和Example文件不添加
         *
         * @param compilationUnit
         */
        @Override
        public void addJavaFileComment(CompilationUnit compilationUnit) {
            super.addJavaFileComment(compilationUnit);
            if (!compilationUnit.getType().getFullyQualifiedName().endsWith(MAPPER_SUFFIX)
                    && !compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
                compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
            }
        }
    
    }
    
    public class Generator {
        public static void main(String[] args) throws Exception {
            //MBG 执行过程中的警告信息
            List<String> warnings = new ArrayList<String>();
            //当生成的代码重复时,覆盖原代码
            boolean overwrite = true;
            //读取我们的 MBG 配置文件
            InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(is);
            is.close();
    
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            //创建 MBG
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            //执行生成代码
            myBatisGenerator.generate(null);
            //输出警告信息
            for (String warning : warnings) {
                System.out.println(warning);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:MyBatis Generator使用记录

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