MyBatis Generator使用记录

2019-12-30  本文已影响0人  melith

在使用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>

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


有些时候我们想要自己生成注释,可以自己实现一个类继承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);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读