美文网首页
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