MyBatis Generator 学习记录

发布时间 2023-08-09 15:04:44作者: 不安分的黑娃

参考资料

什么是 MyBatis Generator ?

MyBatis Generator 是 MyBatis 代码生成工具。

运行 MyBatis Generator 方式

  1. 命令行
  2. ant
  3. maven 运行
  4. java 代码运行
  5. eclipse 插件

maven plugin 方式

  1. pom.xml - build 域引入
    <build>
        ...
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.2</version>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <!-- 需要自行引入 jdbc 驱动依赖  -->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

  1. src/main/resources 增加 generatorConfig.xml 文件,文件内容:
<?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>
  <!-- mybatis code generator 配置文件 -->
  <!-- xml 配置参考地址:https://mybatis.org/generator/configreference/xmlconfig.html -->

  <!--  properties : 加载 properties 文件,其他地方可通过 ${property} 引用文件中的属性配置
    <properties resource="com/myproject/generatorConfig.properties"></properties>
    <properties url="file:///C:/myfolder/generatorConfig.properties"></properties>
  -->
  <!-- classPathEntry : 指定 jar包位置,例如 jdbc驱动包
    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
  -->
  <!-- context。targetRuntime:指定代码模板,这里指定 MyBatis3  -->
  <context id="context1" targetRuntime="MyBatis3">
    <!-- javaFileEncoding: 指定生成的 java 文件编码 -->
    <property name="javaFileEncoding" value="UTF-8"></property>
    <property name="projectPath" value="C:\work\code\gitee\demo\mybatis\generator"></property>

    <!-- jdbcConnection : 定义数据库连接信息 -->
    <jdbcConnection
            connectionURL="jdbc:mysql://localhost:3306/psychometricsdev"
            driverClass="com.mysql.cj.jdbc.Driver"
            password="black"
            userId="black"/>
    <javaTypeResolver>
      <!-- forceBigDecimals: 是否数据库类型为数值时强制使用 BigDecimal -->
      <property name="forceBigDecimals" value="false" />
      <!-- useJSR310Types : 是否使用 JSR-310 标准的日期类型 -->
      <property name="useJSR310Types" value="false" />
    </javaTypeResolver>

    <!--
        targetProject: java 模型代码存放于哪个项目
        targetPackage: java 模型代码存放于哪个包下
     -->
    <javaModelGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.model" >
      <!-- constructorBased: 是否生成全惨构造器 -->
      <property name="constructorBased" value="false" />
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.mybatis.model.blackdb.*Mapper.java -->
      <property name="enableSubPackages" value="false" />

      <!-- immutable: 生成的 java class 是不可变对象,即没有 setter 方法并且所有参数只能从构造器传入 -->
      <property name="immutable" value="false" />
      <!-- rootClass: java model 对象的父类
        <property name="rootClass" value="com.mycompany.MyRootClass" />
      -->
      <!-- trimStrings: 对数据库返回的 CHAR 进行 trim 操作 -->
      <property name="trimStrings" value="false" />
      <!-- exampleTargetPackage,exampleTargetProject : 示例代码是否需要和 model 分离,单独存放
      <property name="exampleTargetPackage" value="false" />
      <property name="exampleTargetProject" value="false" />
       -->
    </javaModelGenerator>

    <!-- sqlMapGenerator : 生成 mapper.xml 文件 -->
    <sqlMapGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\resources" targetPackage="mapper" >
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Mapper.xml -->
      <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>

    <!-- javaClientGenerator : 生成 MessageMapper 接口类
         javaClientGenerator.type: 当 targetRuntime=MyBatis3 时,可选值 ANNOTATEDMAPPER( mybatis 3.0.4+)、MIXEDMAPPER、XMLMAPPER
    -->
    <javaClientGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.mapper" type="XMLMAPPER">
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Interface.java -->
      <property name="enableSubPackages" value="false" />
      <!-- rootInterface:为生成的接口类生成一个父类(需自行定义编写父类)
      <property name="rootInterface" value="study.lihw.demo.mybatis.MyRootInterface"/>
      -->
    </javaClientGenerator>

    <!-- table; 表信息-->
    <table schema="psychometricsdev" tableName="message"
           domainObjectName="Message"
           mapperName="MessageMapper"
           enableInsert="true"
           enableSelectByPrimaryKey="true"
           enableUpdateByPrimaryKey="true"
           enableDeleteByPrimaryKey="true"
           enableSelectByExample="false"
           enableDeleteByExample="false"
           enableCountByExample="false"
           enableUpdateByExample="false"
           modelType="flat"
           escapeWildcards="false"
           delimitIdentifiers="false"
           delimitAllColumns="false">
      <!-- constructorBased: 是否生成全惨构造器 -->
      <property name="constructorBased" value="false" />

      <property name="ignoreQualifiersAtRuntime" value="false" />
      <property name="immutable" value="false" />
      <!-- modelOnly: 仅生成 java model 文件,不生成 sql mapper xml 文件-->
      <property name="modelOnly" value="false" />

      <!--  在生成 mapper xml 文件时,使用 run*设置的数据库、表名名组织 SQL 语句
        <property name="runtimeCatalog" value="false" />
        <property name="runtimeSchema" value="false" />
        <property name="runtimeTableName" value="false" />
      -->
      <!-- useActualColumnNames: 使用列名,不进行小驼峰转换 -->
      <property name="useActualColumnNames" value="false" />

      <property name="useCompoundPropertyNames" value="false" />

      <!-- generatedKey : 在 insert 语句中插入 <selectKey>
         <generatedKey column ="" sqlStatement="MySql" identity="false"></generatedKey>
      -->
      <!--
         domainObjectRenamingRule : 实体类名重命名规则,一般上可用于去掉前缀
        <domainObjectRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></domainObjectRenamingRule>
      -->
      <!-- columnRenamingRule : 列名重命名规则,一般上可用于去掉前缀
          <columnRenamingRule  searchString="正则表达式" replaceString="替换后的字符串"></columnRenamingRule>
      -->

      <!--
      <columnOverride column="列名"
                      property="domain 属性名的重命名" javaType="全限定名" jdbcType="JDBC使用的数据类型" typeHandler="实现 TypeHandler 接口的实现类"
                      isGeneratedAlways = "false">
         forceJavaTypeIntoMapping : 增加 java 类型到映射中
        <property name="forceJavaTypeIntoMapping" value="false" />
        trimStrings: 对数据库返回的 CHAR 进行 trim 操作
        <property name="trimStrings" value="false" />
      </columnOverride>
      -->

      <!-- ignoreColumn : 忽略某些列,不进行生成
        <ignoreColumn column="列名"></ignoreColumn>
      -->
    </table>
  </context>
</generatorConfiguration>
  1. 运行
    配置 maven 运行:
    image
    image

选择项目,并输入运行命令:

-Dmybatis.generator.overwrite=true mybatis-generator:generate -f pom.xml

image

点击【OK】,配置完成。然后,点击运行
image

  1. 运行结果:
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< study.lihw:generator >------------------------
[INFO] Building generator 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- mybatis-generator-maven-plugin:1.4.2:generate (default-cli) @ generator ---
[WARNING] Existing file C:\work\code\gitee\demo\mybatis\generator\src\main\java\study\lihw\demo\mybatis\model\Message.java was overwritten
[WARNING] Existing file C:\work\code\gitee\demo\mybatis\generator\src\main\java\study\lihw\demo\mybatis\mapper\MessageMapper.java was overwritten
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.681 s
[INFO] Finished at: 2023-08-09T14:23:06+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

java代码方式

  1. 引入jar
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
  1. 添加 src/main/resources/generatorConfig.xml
点击查看 generatorConfig.xml 详细配置
<?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>
  <!-- mybatis code generator 配置文件 -->
  <!-- xml 配置参考地址:https://mybatis.org/generator/configreference/xmlconfig.html -->

  <!--  properties : 加载 properties 文件,其他地方可通过 ${property} 引用文件中的属性配置
    <properties resource="com/myproject/generatorConfig.properties"></properties>
    <properties url="file:///C:/myfolder/generatorConfig.properties"></properties>
  -->
  <!-- classPathEntry : 指定 jar包位置,例如 jdbc驱动包
    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
  -->
  <!-- context。targetRuntime:指定代码模板,这里指定 MyBatis3  -->
  <context id="context1" targetRuntime="MyBatis3">
    <!-- javaFileEncoding: 指定生成的 java 文件编码 -->
    <property name="javaFileEncoding" value="UTF-8"></property>
    <property name="projectPath" value="C:\work\code\gitee\demo\mybatis\generator"></property>

    <!-- jdbcConnection : 定义数据库连接信息 -->
    <jdbcConnection
            connectionURL="jdbc:mysql://localhost:3306/psychometricsdev"
            driverClass="com.mysql.cj.jdbc.Driver"
            password="black"
            userId="black"/>
    <javaTypeResolver>
      <!-- forceBigDecimals: 是否数据库类型为数值时强制使用 BigDecimal -->
      <property name="forceBigDecimals" value="false" />
      <!-- useJSR310Types : 是否使用 JSR-310 标准的日期类型 -->
      <property name="useJSR310Types" value="false" />
    </javaTypeResolver>

    <!--
        targetProject: java 模型代码存放于哪个项目
        targetPackage: java 模型代码存放于哪个包下
     -->
    <javaModelGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.model" >
      <!-- constructorBased: 是否生成全惨构造器 -->
      <property name="constructorBased" value="false" />
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.mybatis.model.blackdb.*Mapper.java -->
      <property name="enableSubPackages" value="false" />

      <!-- immutable: 生成的 java class 是不可变对象,即没有 setter 方法并且所有参数只能从构造器传入 -->
      <property name="immutable" value="false" />
      <!-- rootClass: java model 对象的父类
        <property name="rootClass" value="com.mycompany.MyRootClass" />
      -->
      <!-- trimStrings: 对数据库返回的 CHAR 进行 trim 操作 -->
      <property name="trimStrings" value="false" />
      <!-- exampleTargetPackage,exampleTargetProject : 示例代码是否需要和 model 分离,单独存放
      <property name="exampleTargetPackage" value="false" />
      <property name="exampleTargetProject" value="false" />
       -->
    </javaModelGenerator>

    <!-- sqlMapGenerator : 生成 mapper.xml 文件 -->
    <sqlMapGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\resources" targetPackage="mapper" >
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Mapper.xml -->
      <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>

    <!-- javaClientGenerator : 生成 MessageMapper 接口类
         javaClientGenerator.type: 当 targetRuntime=MyBatis3 时,可选值 ANNOTATEDMAPPER( mybatis 3.0.4+)、MIXEDMAPPER、XMLMAPPER
    -->
    <javaClientGenerator targetProject="C:\work\code\gitee\demo\mybatis\generator\src\main\java" targetPackage="study.lihw.demo.mybatis.mapper" type="XMLMAPPER">
      <!-- enableSubPackages:是否生成数据库名文件夹,比如:study.lihw.demo.mybatis.model.blackdb.*Interface.java -->
      <property name="enableSubPackages" value="false" />
      <!-- rootInterface:为生成的接口类生成一个父类(需自行定义编写父类)
      <property name="rootInterface" value="study.lihw.demo.mybatis.MyRootInterface"/>
      -->
    </javaClientGenerator>

    <!-- table; 表信息-->
    <table schema="psychometricsdev" tableName="message"
           domainObjectName="Message"
           mapperName="MessageMapper"
           enableInsert="true"
           enableSelectByPrimaryKey="true"
           enableUpdateByPrimaryKey="true"
           enableDeleteByPrimaryKey="true"
           enableSelectByExample="false"
           enableDeleteByExample="false"
           enableCountByExample="false"
           enableUpdateByExample="false"
           modelType="flat"
           escapeWildcards="false"
           delimitIdentifiers="false"
           delimitAllColumns="false">
      <!-- constructorBased: 是否生成全惨构造器 -->
      <property name="constructorBased" value="false" />

      <property name="ignoreQualifiersAtRuntime" value="false" />
      <property name="immutable" value="false" />
      <!-- modelOnly: 仅生成 java model 文件,不生成 sql mapper xml 文件-->
      <property name="modelOnly" value="false" />

      <!--  在生成 mapper xml 文件时,使用 run*设置的数据库、表名名组织 SQL 语句
        <property name="runtimeCatalog" value="false" />
        <property name="runtimeSchema" value="false" />
        <property name="runtimeTableName" value="false" />
      -->
      <!-- useActualColumnNames: 使用列名,不进行小驼峰转换 -->
      <property name="useActualColumnNames" value="false" />

      <property name="useCompoundPropertyNames" value="false" />

      <!-- generatedKey : 在 insert 语句中插入 <selectKey>
         <generatedKey column ="" sqlStatement="MySql" identity="false"></generatedKey>
      -->
      <!--
         domainObjectRenamingRule : 实体类名重命名规则,一般上可用于去掉前缀
        <domainObjectRenamingRule searchString="正则表达式" replaceString="替换后的字符串"></domainObjectRenamingRule>
      -->
      <!-- columnRenamingRule : 列名重命名规则,一般上可用于去掉前缀
          <columnRenamingRule  searchString="正则表达式" replaceString="替换后的字符串"></columnRenamingRule>
      -->

      <!--
      <columnOverride column="列名"
                      property="domain 属性名的重命名" javaType="全限定名" jdbcType="JDBC使用的数据类型" typeHandler="实现 TypeHandler 接口的实现类"
                      isGeneratedAlways = "false">
         forceJavaTypeIntoMapping : 增加 java 类型到映射中
        <property name="forceJavaTypeIntoMapping" value="false" />
        trimStrings: 对数据库返回的 CHAR 进行 trim 操作
        <property name="trimStrings" value="false" />
      </columnOverride>
      -->

      <!-- ignoreColumn : 忽略某些列,不进行生成
        <ignoreColumn column="列名"></ignoreColumn>
      -->
    </table>
  </context>
</generatorConfiguration>
  1. 创建 study.lihw.demo.mybatis.generator.Generator.java
package study.lihw.demo.mybatis.generator;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
 * 通过 java code 配置 generator
 * @author limo
 * @date 2023-08-06 12:56
 * @since 1.0.0
 */
public class Generator {

    /**
     * 使用 xml 文件配置,生成代码
     * @param configFilePath
     * @throws XMLParserException
     * @throws IOException
     * @throws InvalidConfigurationException
     * @throws SQLException
     * @throws InterruptedException
     */
    public void generate(String configFilePath) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
        if(configFilePath.startsWith("classpath:")){
            ClassLoader clazzLoader = Generator.class.getClassLoader();
            String path = configFilePath.replace("classpath:","");
            InputStream stream = clazzLoader.getResourceAsStream(path);
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(stream);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        }else{
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(new File(configFilePath));
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        }
    }
}
  1. 创建 study.lihw.demo.mybatis.GeneratorTest.java
package study.lihw.demo.mybatis;

import org.junit.Test;
import study.lihw.demo.mybatis.generator.Generator;

/**
 * @author limo
 * @date 2023-08-07 23:20
 * @since
 */
public class GeneratorTest {

    @Test
    public void testGenerator(){
        Generator generator = new Generator();
        String configFilePath = "classpath:generatorConfig.xml";
        try {
            generator.generate(configFilePath);
        }catch (Throwable ex){
           ex.printStackTrace();
        }
    }
}

  1. 运行 testGenerator 方法即可。