MyBatis代码生成器

亦凉 2022-11-24 14:27 366阅读 0赞

一:序言

mybatis代码生成器官网地址:http://mybatis.org/generator/index.html

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息。

上面这一段话来自Mybatis官网的介绍, 初用Mybatis时感觉这个框架相比于JDBC优雅多了, 用起来也如官网说的非常简单。但是用了一段时间之后, 弊端就慢慢凸显出来了

使用Mybatis时不得不为每个表创建一个Entity.javaMapper.xml(Mapper可以融合入Dao中)Dao.java,Service.java 层次很清晰, 但是太多重复性的工作了, 费时间且易于出错,并且当数据库发生一点改动的时候… 苦不堪言

详情使用方法可以查看官网。这里总结一下主要使用过程

二:介绍使用方式

对于MyBatis Generator运行方式,官网给出了如下几种

MyBatis Generator (MBG) can be run in the following ways:

  • From the command prompt with an XML configuration
  • As an Ant task with an XML configuration
  • As a Maven Plugin
  • From another Java program with an XML configuration
  • From another Java program with a Java based configuration
  • As an Eclipse Feature
  • 基于mybatis-generator-core-x.x.x.jar和其XML配置文件,通过命令行运行。
  • 通过AntTask结合其XML配置文件运行。
  • 通过Maven插件运行。
  • 通过Java代码和其XML配置文件运行。
  • 通过Java代码和编程式配置运行。
  • 通过Eclipse Feature运行。

这里介绍两种:通过编码和配置文件运行+通过Maven插件运行

两种方式有个特点:都要提前编写好XML配置文件。个人感觉XML配置文件相对直观,后文会花大量篇幅去说明XML配置文件中的配置项及其作用。这里先注意一点:默认的配置文件为ClassPath:generatorConfig.xml

1、通过编码和配置文件运行

这里简单说下创建和使用过程,通过编码方式去运行插件先需要引入mybatis-generator-core依赖,编写本文的时候最新的版本为:1.4.0


org.mybatis.generator
mybatis-generator-core
1.4.0

假设编写好的XML配置文件是ClassPath下的generator-configuration.xml,那么使用代码生成器的编码方式大致如下

  1. List<String> warnings = new ArrayList<>();
  2. // 如果已经存在生成过的文件是否进行覆盖
  3. boolean overwrite = true;
  4. File configFile = new File("ClassPath路径/generator-configuration.xml");
  5. ConfigurationParser cp = new ConfigurationParser(warnings);
  6. Configuration config = cp.parseConfiguration(configFile);
  7. DefaultShellCallback callback = new DefaultShellCallback(overwrite);
  8. MyBatisGenerator generator = new MyBatisGenerator(config, callback, warnings);
  9. generator.generate(null);

2、通过Maven插件+配置文件使用

大多数开发人员可能选择这种方式

如果使用Maven插件,那么不需要引入mybatis-generator-core依赖,在自己ssm项目或者springboot项目或者自己独立得maven项目只需要引入一个Maven的插件mybatis-generator-maven-plugin

  1. <plugin>
  2. <groupId>org.mybatis.generator</groupId>
  3. <artifactId>mybatis-generator-maven-plugin</artifactId>
  4. <version>1.4.0</version>
  5. <executions>
  6. <execution>
  7. <id>Generate MyBatis Artifacts</id>
  8. <goals>
  9. <goal>generate</goal>
  10. </goals>
  11. </execution>
  12. </executions>
  13. <configuration>
  14. <!-- 输出详细信息 -->
  15. <verbose>true</verbose>
  16. <!-- 覆盖生成文件 -->
  17. <overwrite>true</overwrite>
  18. <!-- 定义配置文件 -->
  19. <configurationFile>${basedir}/src/main/resources/generator-configuration.xml</configurationFile>
  20. </configuration>
  21. </plugin>

配置文件(案例配置)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <!-- 驱动包绝对路径 -->
  7. <classPathEntry
  8. location="E:\tool\mysql-connector-java-5.1.49.jar"/>
  9. <context id="default" targetRuntime="MyBatis3">
  10. <property name="javaFileEncoding" value="UTF-8"/>
  11. <!-- 不输出注释 -->
  12. <commentGenerator>
  13. <property name="suppressDate" value="true"/>
  14. <property name="suppressAllComments" value="true"/>
  15. </commentGenerator>
  16. <jdbcConnection driverClass="com.mysql.jdbc.Driver"
  17. connectionURL="jdbc:mysql://localhost:3306/demo"
  18. userId="root"
  19. password="root">
  20. </jdbcConnection>
  21. <!-- 不强制把所有的数字类型转化为BigDecimal -->
  22. <javaTypeResolver>
  23. <property name="forceBigDecimals" value="false"/>
  24. </javaTypeResolver>
  25. <javaModelGenerator targetPackage="com.sysconfig.pojo.po" targetProject="src/main/java">
  26. <property name="enableSubPackages" value="true"/>
  27. </javaModelGenerator>
  28. <sqlMapGenerator targetPackage="mapper.sysconfig" targetProject="src/main/resources">
  29. <property name="enableSubPackages" value="true"/>
  30. </sqlMapGenerator>
  31. <javaClientGenerator type="XMLMAPPER" targetPackage="com.sysconfig.dao" targetProject="src/main/java">
  32. <property name="enableSubPackages" value="true"/>
  33. </javaClientGenerator>
  34. <table tableName="sys_config"
  35. enableCountByExample="false"
  36. enableDeleteByExample="false"
  37. enableSelectByExample="false"
  38. enableUpdateByExample="false"
  39. domainObjectName="SysConfig"
  40. mapperName="SysConfigMapper">
  41. <generatedKey column="id" sqlStatement="MySql"/>
  42. </table>
  43. </context>
  44. </generatorConfiguration>

插件配置完毕之后,使用下面的命令即可运行:

mvn mybatis-generator:generate

或者在开发工具,这里用得idea。直接maven projects按钮,弹窗里选择

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NDkxNTA4_size_16_color_FFFFFF_t_70

mybatis-generator-maven-plugin的更详细配置和可选参数可以参考:

http://mybatis.org/generator/running/runningWithMaven.html

三:配置文件详解

XML配置文件才是Mybatis-Generator的核心,它用于控制代码生成的所有行为。所有非标签独有的公共配置的Key可以在mybatis-generator-corePropertyRegistry类中找到。下面是一个相对完整的

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <properties resource="db.properties"/>
  7. <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
  8. <context id="DB2Tables" targetRuntime="MyBatis3">
  9. <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
  10. connectionURL="jdbc:db2:TEST"
  11. userId="db2admin"
  12. password="db2admin">
  13. </jdbcConnection>
  14. <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
  15. <commentGenerator>
  16. <property name="suppressDate" value="true"/>
  17. <property name="suppressAllComments" value="true"/>
  18. </commentGenerator>
  19. <javaTypeResolver>
  20. <property name="forceBigDecimals" value="false" />
  21. </javaTypeResolver>
  22. <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
  23. <property name="enableSubPackages" value="true" />
  24. <property name="trimStrings" value="true" />
  25. </javaModelGenerator>
  26. <sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
  27. <property name="enableSubPackages" value="true" />
  28. </sqlMapGenerator>
  29. <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
  30. <property name="enableSubPackages" value="true" />
  31. </javaClientGenerator>
  32. <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
  33. <property name="useActualColumnNames" value="true"/>
  34. <generatedKey column="ID" sqlStatement="DB2" identity="true" />
  35. <columnOverride column="DATE_FIELD" property="startDate" />
  36. <ignoreColumn column="FRED" />
  37. <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
  38. </table>
  39. </context>
  40. </generatorConfiguration>

配置文件中,最外层的标签为<generatorConfiguration>,它的子标签包括:

  • 0或者1个<properties>标签,用于指定全局配置文件,下面可以通过占位符的形式读取<properties>指定文件中的值。
  • 0或者N个<classPathEntry>标签,<classPathEntry>只有一个location属性,用于指定数据源驱动包(jar或者zip)的绝对路径,具体选择什么驱动包取决于连接什么类型的数据源。
  • 1或者N个<context>标签,用于运行时的解析模式和具体的代码生成行为,所以这个标签里面的配置是最重要的。

下面分别列举和分析一下<context>标签和它的主要子标签的一些属性配置和功能。

context标签

<context>标签在mybatis-generator-core中对应的实现类为org.mybatis.generator.config.Context,它除了大量的子标签配置之外,比较主要的属性是:

  • idContext示例的唯一ID,用于输出错误信息时候作为唯一标记。
  • targetRuntime:用于执行代码生成模式。
  • defaultModelType:控制Domain类的生成行为。执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置,可选值:

    • conditional:默认值,类似hierarchical,但是只有一个主键的时候会合并所有属性生成在同一个类。
    • flat:所有内容全部生成在一个对象中。
    • hierarchical:键生成一个XXKey对象,Blob等单独生成一个对象,其他简单属性在一个对象中。

targetRuntime属性的可选值比较多,这里做个简单的小结:






























属性 功能描述
MyBatis3DynamicSql 默认值,兼容JDK8+MyBatis 3.4.2+,不会生成XML映射文件,忽略<sqlMapGenerator>的配置项,也就是Mapper全部注解化,依赖于MyBatis Dynamic SQL类库
MyBatis3Kotlin 行为类似于MyBatis3DynamicSql,不过兼容Kotlin的代码生成
MyBatis3 提供基本的基于动态SQLCRUD方法和XXXByExample方法,会生成XML映射文件
MyBatis3Simple 提供基本的基于动态SQLCRUD方法,会生成XML映射文件
MyBatis3DynamicSqlV1 已经过时,不推荐使用

<context>标签支持0或N个<property>标签,<property>的可选属性有:


































































property属性 功能描述 默认值 备注
autoDelimitKeywords 是否使用分隔符号括住数据库关键字 false 例如MySQL中会使用反引号括住关键字
beginningDelimiter 分隔符号的开始符号  
endingDelimiter 分隔符号的结束号  
javaFileEncoding 文件的编码 系统默认值 来源于java.nio.charset.Charset
javaFormatter 类名和文件格式化器 DefaultJavaFormatter JavaFormatterDefaultJavaFormatter
targetJava8 是否JDK8和启动其特性 true  
kotlinFileEncoding Kotlin文件编码 系统默认值 来源于java.nio.charset.Charset
kotlinFormatter Kotlin类名和文件格式化器 DefaultKotlinFormatter KotlinFormatterDefaultKotlinFormatter
xmlFormatter XML文件格式化器 DefaultXmlFormatter XmlFormatterDefaultXmlFormatter

jdbcConnection标签

<jdbcConnection>标签用于指定数据源的连接信息,它在mybatis-generator-core中对应的实现类为org.mybatis.generator.config.JDBCConnectionConfiguration,主要属性包括:































属性 功能描述 是否必须
driverClass 数据源驱动的全类名 Y
connectionURL JDBC的连接URL Y
userId 连接到数据源的用户名 N
password 连接到数据源的密码 N

commentGenerator标签

<commentGenerator>标签是可选的,用于控制生成的实体的注释内容。它在mybatis-generator-core中对应的实现类为org.mybatis.generator.internal.DefaultCommentGenerator,可以通过可选的type属性指定一个自定义的CommentGenerator实现。<commentGenerator>标签支持0或N个<property>标签,<property>的可选属性有:































property属性 功能描述 默认值
suppressAllComments 是否生成注释 false
suppressDate 是否在注释中添加生成的时间戳 false
dateFormat 配合suppressDate使用,指定输出时间戳的格式 java.util.Date#toString()
addRemarkComments 是否输出表和列的Comment信息 false

建议保持默认值,也就是什么注释都不输出,生成代码干净的实体。

javaTypeResolver标签

<javaTypeResolver>标签是<context>的子标签,用于解析和计算数据库列类型和Java类型的映射关系,该标签只包含一个type属性,用于指定org.mybatis.generator.api.JavaTypeResolver接口的实现类。<javaTypeResolver>标签支持0或N个<property>标签,<property>的可选属性有:





















property属性 功能描述 默认值
forceBigDecimals 是否强制把所有的数字类型强制使用java.math.BigDecimal类型表示 false
useJSR310Types 是否支持JSR310,主要是JSR310的新日期类型 false

如果useJSR310Types属性设置为true,那么生成代码的时候类型映射关系如下(主要针对日期时间类型):






























数据库(JDBC)类型 Java类型
DATE java.time.LocalDate
TIME java.time.LocalTime
TIMESTAMP java.time.LocalDateTime
TIME_WITH_TIMEZONE java.time.OffsetTime
TIMESTAMP_WITH_TIMEZONE java.time.OffsetDateTime

引入mybatis-generator-core后,可以查看JavaTypeResolver的默认实现为JavaTypeResolverDefaultImpl,从它的源码可以得知一些映射关系:

  1. BIGINT --> Long
  2. BIT --> Boolean
  3. INTEGER --> Integer
  4. SMALLINT --> Short
  5. TINYINT --> Byte
  6. ......

有些时候,我们希望INTEGERSMALLINTTINYINT都映射为Integer,那么我们需要覆盖JavaTypeResolverDefaultImpl的构造方法:

  1. public class DefaultJavaTypeResolver extends JavaTypeResolverDefaultImpl {
  2. public DefaultJavaTypeResolver() {
  3. super();
  4. typeMap.put(Types.SMALLINT, new JdbcTypeInformation("SMALLINT",
  5. new FullyQualifiedJavaType(Integer.class.getName())));
  6. typeMap.put(Types.TINYINT, new JdbcTypeInformation("TINYINT",
  7. new FullyQualifiedJavaType(Integer.class.getName())));
  8. }
  9. }

注意一点的是这种自定义实现JavaTypeResolver接口的方式使用编程式运行MBG会相对方便,如果需要使用Maven插件运行,那么需要把上面的DefaultJavaTypeResolver类打包到插件中。

javaModelGenerator标签

<javaModelGenerator标签>标签是<context>的子标签,主要用于控制实体(Model)类的代码生成行为。它支持的属性如下:
























属性 功能描述 是否必须 备注
targetPackage 生成的实体类的包名 Y 例如club.throwable.model
targetProject 生成的实体类文件相对于项目(根目录)的位置 Y 例如src/main/java

<javaModelGenerator标签>标签支持0或N个<property>标签,<property>的可选属性有:






















































property属性 功能描述 默认值 备注
constructorBased 是否生成一个带有所有字段属性的构造函数 false MyBatis3Kotlin模式下忽略此属性配置
enableSubPackages 是否允许通过Schema生成子包 false 如果为true,例如包名为club.throwable,如果Schemaxyz,那么实体类文件最终会生成在club.throwable.xyz目录
exampleTargetPackage 生成的伴随实体类的Example类的包名 - -
exampleTargetProject 生成的伴随实体类的Example类文件相对于项目(根目录)的位置 - -
immutable 是否不可变 false 如果为true,则不会生成Setter方法,所有字段都使用final修饰,提供一个带有所有字段属性的构造函数
rootClass 为生成的实体类添加父类 - 通过value指定父类的全类名即可
trimStrings Setter方法是否对字符串类型进行一次trim操作 false -

javaClientGenerator标签

<javaClientGenerator>标签是<context>的子标签,主要用于控制Mapper接口的代码生成行为。它支持的属性如下:






























属性 功能描述 是否必须 备注
type Mapper接口生成策略 Y <context>标签的targetRuntime属性为MyBatis3DynamicSql或者MyBatis3Kotlin时此属性配置忽略
targetPackage 生成的Mapper接口的包名 Y 例如club.throwable.mapper
targetProject 生成的Mapper接口文件相对于项目(根目录)的位置 Y 例如src/main/java

type属性的可选值如下:

  • ANNOTATEDMAPPERMapper接口生成的时候依赖于注解和SqlProviders(也就是纯注解实现),不会生成XML映射文件。
  • XMLMAPPERMapper接口生成接口方法,对应的实现代码生成在XML映射文件中(也就是纯映射文件实现)。
  • MIXEDMAPPERMapper接口生成的时候复杂的方法实现生成在XML映射文件中,而简单的实现通过注解和SqlProviders实现(也就是注解和映射文件混合实现)。

注意两点:

  • <context>标签的targetRuntime属性指定为MyBatis3Simple的时候,type只能选用ANNOTATEDMAPPER或者XMLMAPPER
  • <context>标签的targetRuntime属性指定为MyBatis3的时候,type可以选用ANNOTATEDMAPPERXMLMAPPER或者MIXEDMAPPER

<javaClientGenerator>标签支持0或N个<property>标签,<property>的可选属性有:






























property属性 功能描述 默认值 备注
enableSubPackages 是否允许通过Schema生成子包 false 如果为true,例如包名为club.throwable,如果Schemaxyz,那么Mapper接口文件最终会生成在club.throwable.xyz目录
useLegacyBuilder 是否通过SQL Builder生成动态SQL false  
rootInterface 为生成的Mapper接口添加父接口 - 通过value指定父接口的全类名即可

sqlMapGenerator标签

<sqlMapGenerator>标签是<context>的子标签,主要用于控制XML映射文件的代码生成行为。它支持的属性如下:
























属性 功能描述 是否必须 备注
targetPackage 生成的XML映射文件的包名 Y 例如mappings
targetProject 生成的XML映射文件相对于项目(根目录)的位置 Y 例如src/main/resources

<sqlMapGenerator>标签支持0或N个<property>标签,<property>的可选属性有:


















property属性 功能描述 默认值 备注
enableSubPackages 是否允许通过Schema生成子包 false -

plugin标签

<plugin>标签是<context>的子标签,用于引入一些插件对代码生成的一些特性进行扩展,该标签只包含一个type属性,用于指定org.mybatis.generator.api.Plugin接口的实现类。内置的插件实现见Supplied Plugins。例如:引入org.mybatis.generator.plugins.SerializablePlugin插件会让生成的实体类自动实现java.io.Serializable接口并且添加serialVersionUID属性。

table标签

<table>标签是<context>的子标签,主要用于配置要生成代码的数据库表格,定制一些代码生成行为等等。它支持的属性众多,列举如下:










































































































































属性 功能描述 是否必须 备注
tableName 数据库表名称 Y 例如t_order
schema 数据库Schema N -
catalog 数据库Catalog N -
alias 表名称标签 N 如果指定了此值,则查询列的时候结果格式为alias_column
domainObjectName 表对应的实体类名称,可以通过.指定包路径 N 如果指定了bar.User,则包名为bar,实体类名称为User
mapperName 表对应的Mapper接口类名称,可以通过.指定包路径 N 如果指定了bar.UserMapper,则包名为barMapper接口类名称为UserMapper
sqlProviderName 动态SQL提供类SqlProvider的类名称 N -
enableInsert 是否允许生成insert方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableSelectByPrimaryKey 是否允许生成selectByPrimaryKey方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableSelectByExample 是否允许生成selectByExample方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableUpdateByPrimaryKey 是否允许生成updateByPrimaryKey方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableDeleteByPrimaryKey 是否允许生成deleteByPrimaryKey方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableDeleteByExample 是否允许生成deleteByExample方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableCountByExample 是否允许生成countByExample方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
enableUpdateByExample 是否允许生成updateByExample方法 N 默认值为true,执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
selectByPrimaryKeyQueryId value指定对应的主键列提供列表查询功能 N 执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
selectByExampleQueryId value指定对应的查询ID提供列表查询功能 N 执行引擎为MyBatis3DynamicSql或者MyBatis3Kotlin时忽略此配置
modelType 覆盖<context>defaultModelType属性 N <context>defaultModelType属性
escapeWildcards 是否对通配符进行转义 N -
delimitIdentifiers 标记匹配表名称的时候是否需要使用分隔符去标记生成的SQL N -
delimitAllColumns 是否所有的列都添加分隔符 N 默认值为false,如果设置为true,所有列名会添加起始和结束分隔符

<table>标签支持0或N个<property>标签,<property>的可选属性有:
































































































property属性 功能描述 默认值 备注
constructorBased 是否为实体类生成一个带有所有字段的构造函数 false 执行引擎为MyBatis3Kotlin的时候此属性忽略
ignoreQualifiersAtRuntime 是否在运行时忽略别名 false 如果为true,则不会在生成表的时候把schemacatalog作为表的前缀
immutable 实体类是否不可变 false 执行引擎为MyBatis3Kotlin的时候此属性忽略
modelOnly 是否仅仅生成实体类 false -
rootClass 如果配置此属性,则实体类会继承此指定的超类 - 如果有主键属性会把主键属性在超类生成
rootInterface 如果配置此属性,则实体类会实现此指定的接口 - 执行引擎为MyBatis3Kotlin或者MyBatis3DynamicSql的时候此属性忽略
runtimeCatalog 指定运行时的Catalog - 当生成表和运行时的表的Catalog不一样的时候可以使用该属性进行配置
runtimeSchema 指定运行时的Schema - 当生成表和运行时的表的Schema不一样的时候可以使用该属性进行配置
runtimeTableName 指定运行时的表名称 - 当生成表和运行时的表的表名称不一样的时候可以使用该属性进行配置
selectAllOrderByClause 指定字句内容添加到selectAll()方法的order by子句之中 - 执行引擎为MyBatis3Simple的时候此属性才适用
trimStrings 实体类的字符串类型属性会做trim处理 - 执行引擎为MyBatis3Kotlin的时候此属性忽略
useActualColumnNames 是否使用列名作为实体类的属性名 false -
useColumnIndexes XML映射文件中生成的ResultMap使用列索引定义而不是列名称 false 执行引擎为MyBatis3Kotlin或者MyBatis3DynamicSql的时候此属性忽略
useCompoundPropertyNames 是否把列名和列备注拼接起来生成实体类属性名 false -

<table>标签还支持众多的property的子标签:

0或1个<generatedKey>用于指定主键生成的规则,指定此标签后会生成一个<selectKey>标签:

  1. <!-- column:指定主键列 -->
  2. <!-- sqlStatement:查询主键的SQL语句,例如填写了MySql,则使用SELECT LAST_INSERT_ID() -->
  3. <!-- type:可选值为pre或者post,pre指定selectKey标签的order为BEFORE,post指定selectKey标签的order为AFTER -->
  4. <!-- identity:true的时候,指定selectKey标签的order为AFTER -->
  5. <generatedKey column="id" sqlStatement="MySql" type="post" identity="true" />

0或1个<domainObjectRenamingRule>用于指定实体类重命名规则:

  1. <!-- searchString中正则命中的实体类名部分会替换为replaceString -->
  2. <domainObjectRenamingRule searchString="^Sys" replaceString=""/>
  3. <!-- 例如 SysUser会变成User -->
  4. <!-- 例如 SysUserMapper会变成UserMapper -->

0或1个<columnRenamingRule>用于指定列重命名规则:

  1. <!-- searchString中正则命中的列名部分会替换为replaceString -->
  2. <columnRenamingRule searchString="^CUST_" replaceString=""/>
  3. <!-- 例如 CUST_BUSINESS_NAME会变成BUSINESS_NAME(useActualColumnNames=true) -->
  4. <!-- 例如 CUST_BUSINESS_NAME会变成businessName(useActualColumnNames=false) -->

0或N个<columnOverride>用于指定具体列的覆盖映射规则:

  1. <!-- column:指定要覆盖配置的列 -->
  2. <!-- property:指定要覆盖配置的属性 -->
  3. <!-- delimitedColumnName:是否为列名添加定界符,例如`{column}` -->
  4. <!-- isGeneratedAlways:是否一定生成此列 -->
  5. <columnOverride column="customer_name" property="customerName" javaType="" jdbcType="" typeHandler="" delimitedColumnName="" isGeneratedAlways="">
  6. <!-- 覆盖table或者javaModelGenerator级别的trimStrings属性配置 -->
  7. <property name="trimStrings" value="true"/>
  8. <columnOverride/>

0或N个<ignoreColumn>用于指定忽略生成的列:

  1. <ignoreColumn column="version" delimitedColumnName="false"/>

四: 编程式自定义类型映射

如果把所有得非长整型的数字,统一使用Integer接收,因此需要自定义类型映射。编写映射器如下:

  1. public class DefaultJavaTypeResolver extends JavaTypeResolverDefaultImpl {
  2. public DefaultJavaTypeResolver() {
  3. super();
  4. typeMap.put(Types.SMALLINT, new JdbcTypeInformation("SMALLINT",
  5. new FullyQualifiedJavaType(Integer.class.getName())));
  6. typeMap.put(Types.TINYINT, new JdbcTypeInformation("TINYINT",
  7. new FullyQualifiedJavaType(Integer.class.getName())));
  8. }
  9. }

此时最好使用编程式运行代码生成器,修改XML配置文件:

  1. <javaTypeResolver type="club.throwable.mbg.DefaultJavaTypeResolver">
  2. <property name="forceBigDecimals" value="false"/>
  3. </javaTypeResolver>
  4. ...

运行方法代码如下:

  1. public class Main {
  2. public static void main(String[] args) throws Exception {
  3. List<String> warnings = new ArrayList<>();
  4. // 如果已经存在生成过的文件是否进行覆盖
  5. boolean overwrite = true;
  6. ConfigurationParser cp = new ConfigurationParser(warnings);
  7. Configuration config = cp.parseConfiguration(Main.class.getResourceAsStream("/generator-configuration.xml"));
  8. DefaultShellCallback callback = new DefaultShellCallback(overwrite);
  9. MyBatisGenerator generator = new MyBatisGenerator(config, callback, warnings);
  10. generator.generate(null);
  11. }
  12. }

数据库的order_statusTINYINT类型,生成出来的文件中的orderStatus字段全部替换使用Integer类型定义。

小结#

本文相对详尽地介绍了Mybatis Generator的使用方式,具体分析了XML配置文件中主要标签以及标签属性的功能。因为MybatisJavaORM框架体系中还会有一段很长的时间处于主流地位,了解Mybatis Generator可以简化CRUD方法模板代码、实体以及Mapper接口代码生成,从而解放大量生产力。Mybatis Generator有不少第三方的扩展,例如tk.mapper或者mybatis-plus自身的扩展,可能附加的功能不一样,但是基本的使用是一致的。

参考地址:https://www.cnblogs.com/throwable/p/12046848.html#%E5%B0%8F%E7%BB%93

发表评论

表情:
评论列表 (有 0 条评论,366人围观)

还没有评论,来说两句吧...

相关阅读