MyBatis从入门到精通(第5章):MyBatis代码生成器
jdk1.8、MyBatis3.4.6、MySQL数据库5.6.45、Eclipse Version: 2019-12 M2 (4.14.0)
MyBatis从入门到精通(第5章):MyBatis代码生成器
MyBatis Generator ,后文中会使用缩写MBG来代替。MBG下载
MBG 通过丰富的配置可以生成不同类型的代码,代码包含了数据库表对应的实体类 、Mapper 接口类、 Mapper XML 文件和 Example 对象等,
这些代码文件中几乎包含了全部的单表操作方法 。如果大家更喜欢看中文文档,也可以查看由作者组织翻译的中文文档,链接是 http ://
MyBatis Generator解决了对数据库操作有最大影响的
一些简单的 CRUD(插入,查询,更新,删除)操作,
你仍然需要对联合查询和存储过程手写 SQL 和 对象 。
5.1 XML 配置详解
MBG 具有丰富的配置可供使用 , 这些配置需要以 XML 形式的标签和属性来实现,所以本节就对 MBG 的 XML 配置进行详细介绍。
generatorConfig.xml 首先按照 MBG 的要求添加 XML 的文件头。在文件头之后,需要写上 XML 文件的根节点 generatorConfiguration 。
<?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 标签下的3个子级标签,分别是:properties、classPathEntry 、context 。在配置这3个标签的时候,必须严格按照举例这些标签的顺序进行配置。
第一个是 properties 标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}这种形式的引用,通过这种方式引用属性文件中的属性值,对于后面需要配置的 JDBC 信息会很有用。properties 标签包含 resource 和 url 两个属性,只能使用其中一个属性来指定,同时出现则会报错。
- resource:指定 classpath 下的属性文件,类似 com/myproject/generatorConfig.properties 这样的属性值。
- url:指定文件系统上的特定位置,例如 file:///C:/myfolder/generatorConfig.properties 。
第二个是 classPathEntry 标签。这个标签可以配置多个,也可以不配置。classPathEntry 标签最常见的用法是通过属性 location 指定驱动的路径,代码如下。
< classPathEntry location= "E:\mysql\ mysql-connector-java- 5.1.29.jar"/>
第三个是 context 标签。这个标签是要重点讲解的,该标签至少配置 1 个,可以配置多个。
< context id= "Mysql" targetRuntime= "MyBatis3Simple" defaultModelType= "flat">
5.1.1 property标签
数据库 字段中的分隔符。在MySQL中可以使用反单引号“ ` ”作为分隔符,例如
`user info`
通过分隔符可以将其中的内容作为一个整体的字符串进行处理,当SQL中有数据库关键字时,使用反单引号括住关键字,可以避免数据库产生错误。
MBG 中维护了一个关键字列表,当数据库的字段或表与这些关键字一样时, MBG 会自动给这些字段或表添加分隔符。关键字列表可以查看 MBG 中的 org.mybatis.generator.internal.db.SqlReservedWords 类。
<property name="autoDelimitKeywords" value="true"/> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/>
5.1.2 plugin 标签
plugin 标签可以配置 0 个或者多个,个数不受限制。
plugin 标签用来定义一个插件,用于扩展或修改通过 MBG 生成的代码 。 该插件将按在配置中配置的顺序执行。
下面要介绍的缓存插件的全限定名称为 org.mybatis.generator.plugins.CachePlugin 。这个插件可以在生成的 SQL XML 映射文件中增加一个 cache 标签。只有当 targetRuntime 为 MyBatis3 时,该插件才有效。
在 MBG 默认包含的插件中,除了缓存插件外,还有序列化插件、 RowBounds 插件、ToString 插件等,关于这些插件的介绍可以查看 MBG 文档。查看英文文档:http://www.mybatis.org/generator/reference/plugins.html
5.1.3 commentGenerator 标签
该标签用来配置如何生成注释信息,最多可以配置 l 个 。
一般情况下,由于 MBG 生成的注释信息没有实用任何价值 ,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因而一般情况下都会屏蔽注释信息,可以如下配置。
<commentGenerator> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator>
5.1.4 jdbcConnection 标签
jdbcConnection 用于指定 MBG 要连接的数据库信息,该标签必选,并且只能有一个 。
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" userId="root" password=""> </jdbcConnection>
5.1.5 javaTypeResolver 标签
该标签的配置用来指定 JDBC 类型和 Java 类型如何转换,最多可以配置一个。
该标签提供了一个可选的属性 type。另外,和 commentGenerator 类似,该标签提供了默认的实现 DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他标签配置来解决,不建议修改该属性。
5.1.6 javaModelGenerator 标签
该标签必须配置一个,并且最多配置一个。
一个表对应多个类时使用并不方便,所以前面推荐使用 flat ,保证一个表对应一个实体类。
该标签还支持以下几个 property 子标签属性。
<javaModelGenerator targetPackage="test.model" targetProject="src\main\java"> <property name="trimStrings" value="true" /> <property name="rootClass" value="tk.mybatis.simple.model.BaseEntity" /> </javaModelGenerator>
5.1.7 sqlMapGenerator 标签
该标签用于配置 SQL 映射生成器 ( Mapper.xml 文件)的属性,该标签可选,最多配置一个 。
如果 targetRuntime 设置为 MyBatis3 ,则只有当 javaClientGenerator 配置需要 XML时,该标签才必须配置一个 。
该标签还有一个可选的 property 子标签属性 enableSubPackages ,如果为 true ,
MBG 会根据 catalog 和 schema 来生成子包。如果为 false 就会直接用 targetPackage
属性,默认为 false 。
sqlMapGenerator 配置示例如下。
<sqlMapGenerator targetPackage="test.xml" targetProject="src\main\resources"/>
5.1.8 javaClientGenerator 标签
该标签用于配置 Java 客户端生成器( Mapper 接口)的属性 , 该标签可选 , 最多配置一个 。
如果不配置该标签,就不会生成 Mapper 接口。该标签还有一个可选属性 implementationPackage ,如果指定了该属性,Mapper 接口的实现类就会生成在这个属性指定的包中。
javaClientGenerator 标签配置示例如下。
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="src\main\java"/>
5.1.9 table 标签
只有在 table 中配置过的表,才能经过上述其他配置生成最终的代码,该标签至少要配置一个,可以配置多个 。
table 标签有一个必选属性 tableName ,该属性指定要生成的表名,可以使用 SQL 通配符匹配多个表。
例如要生成全部的表,可以如下配置。<table tableName="%"> <generatedKey column="id" sqlStatement="MySql"/> </table>
除了 property 子标签外, table 还包含以下子标签。
• generatedKey ( 0 个或 1个)
- columnRenamingRule ( 0 个或 1个)
- columnOverride ( 0 个或多个)
- ignoreColumn ( 0 个或多个)
5.1.9.1 generatedKey 标签
该标签用来指定自动生成主键的属性( identity 字段或者 sequences 序列)。如果指定这个标签, MBG 将在生成 insert 的 SQL 映射文件中插入一个 selectKey 标签。这个标签非常重要,而且只能配置一个 。
该标签包含以下两个必选属性。
· column:生成列的列名。
· sqlStatement :返回新值的 SQL 语句。如果这是一个 identity 列,则可以使用其中一个预定义的的特殊值,预定义值如下。
<generatedKey column="id" sqlStatement="MySql"/>
5.1.9.2 columnRenamingRule 标签
该标签最多可以配置一个,使用该标签可以在生成列之前对列进行重命名。这对于那些由于存在同一前缀的字段因此想在生成属性名时去除前缀的表非常有用。假设一个表包含以下列。
· CUST_BUSINESS_NAME
· CUST_STREET_ADDRESS
· CUST_CITY
· CUST_STATE
生成的所有属性名中如果都包含 CUST 的前缀可能会让人感觉不舒服。这些前缀可以通过如下方式定义重命名规则。
< columnRenamingRule searchString= "^CUST_" replaceString= ""/>
注意,MBG 内部使用 java.util.regex.Matcher.replaceAll 方法实现这个功能。请参阅有关该方法的文档和在 Java 中使用正则表达式的例子。
当 columnOverride 匹配一列时, columnRenamingRule 标签会被忽略。 columnOverride 优先于重命名的规则。
该标签有一个必选属性 searchString ,用于定义将要被替换的字符串的正则表达式。
该标签有一个可选属性 replaceString ,用于替换搜索字符串列每一个匹配项的字符串。如果没有指定,就使用空字符串。
关于 table 的 property 属性 useActualColumnNames 对此标签的影响,可以查看完整文档。
5.1.9.3 columnOverride 标签
该标签用于将某些默认计算的属性值更改为指定的值,标签可选,可以配置多个。
该标签有一个必选属性 column,表示要重写的列名。
该标签有多个可选属性,具体如下。
· property:要使用的 Java 属性的名称。如果没有指定,MBG 会根据列名生成。例如,如果一个表的一列名为 STRT_DTE,MBG 会根据 table 的 useActualColumnNames 属性生成 STRT_DTE 或 strtDte。
· javaType:列的属性值为完全限定的 Java 类型。如果需要,可以覆盖由 JavaTypeResolver 计算出的类型。
· jdbcType:列的 JDBC 类型(如 INTEGER、DECIMAL、NUMERIC、VARCHAR 等)。如果需要,可以覆盖由 JavaTypeResolver 计算出的类型。
· typeHandler :根据用户定义的需要用来处理列的类型处理器。必须是一个继承自 TypeHandler 接口的全限定的类名。如果没有指定或者是空白,MyBatis 会用默认的类型处理器来处理类型。 切记 :MBG 不会校验这个类型处理器是否存在或可用,MGB 只是简单地将值插入到已生成的 SQL 映射的配置文件中。
· delimitedColumnName :指定是否应在生成的 SQL 的列名称上增加分隔符。如果列的名称中包含空格,MGB 会自动添加分隔符,所以只有当列名需要被强制为一个合适的名字或者列名是数据库中的保留字时,才是必要的。
columnOverride 配置示例如下。
5.1.9.4 ignoreColumn 标签
该标签可以用来屏蔽不需要生成的列,该标签可选,可以配置多个。
该标签有一个必选属性 column,表示要忽略的列名。
该标签还有一个可选属性 delimitedColumnName ,标识匹配列名的时候是否区分大小写。如果为 true 则区分,默认值为 false,表示不区分大小写。
5.2 一个配置参考示例
在项目的 src/main/resources 中创建一个 generator 文件夹(Folder),在该目录下创建一个
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> <properties resource="jdbc.properties"/> <classPathEntry location="C:\Users\kangy\.m2\repository\mysql\mysql-connector-java\5.1.45\mysql-connector-java-5.1.45.jar"/> <!-- targetRuntime="MyBatis3Simple"就不会生成与Example相关的代码和方法 --> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <!-- 当数据库的字段或表与这些关键字一样时, MBG会自动给这些字段或表添加分隔符。 关键字列表可以查看 MBG中的 org.mybatis.generator.internal.db.SqlReservedWords 类。 --> <property name="autoDelimitKeywords" value="true"/> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <commentGenerator> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/o2o" userId="${jdbc.username}" password="${jdbc.password}"> </jdbcConnection> <!-- 实体类 --> <javaModelGenerator targetPackage="test.model" targetProject="src\main\java"> <property name="trimStrings" value="false" /> <!-- 设置所有实体类的基类 --> <!-- <property name="rootClass" value="cn.bjut.model.BaseEntity" /> --> </javaModelGenerator> <!-- XML文件 --> <sqlMapGenerator targetPackage="test.xml" targetProject="src\main\resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- DAO接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="src\main\java"/> <table tableName="%"> <generatedKey column="id" sqlStatement="MySQL"/> </table> </context> </generatorConfiguration>
5.3 运行Mybatis Generator
5.3.1 使用Java编写代码运行
使用Java编码不方便的地方在于,它和当前项目是绑定在一起的。
综合来说,这种方式出现的问题最少,配置最容易,因此推荐使用。
generatorConfig.xml配置的一些特殊的类,只要在当前项目中,或者在当前项目的classpath中,就可以直接使用。
5.3.4 使用Eclipse插件运行
安装Eclipse插件
从 MBG 的发布页面中,下载插件,此处使用1.3.7版本 。
下载插件后,在 Eclipse 中选择菜单 Help 中的 Install New Software ,打开如图 5-3 所示的窗口 。
点击 Add 按钮 , 在弹出的窗口中选择 Archive,选择下载完成的 MBG 插件,输入 Name MBG后,点击 OK。
从下拉列表中选择全部的 MyBatis Generator,点击 Next , 一步步完成安装,安装完成后重启 Eclipse 。
注意:配图安装的详细过程,可以点击上方超链接查看。
使用 Eclipse 插件
打开之前在 src/main/resources 下面创建的 generator/generatorConfig.xml 文件,对这个文件
做一些简单修改 。
Eclipse 插件的运行方式有点特殊, JDBC 驱动需要通过 classPathEntry 进行配置,其他定制的类只要在当前项目或当前项目的 classpath 中即可使用 。
<?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> <classPathEntry location="C:\Users\kangy\.m2\repository\mysql\mysql-connector-java\8.0.17\mysql-connector-java-8.0.17.jar"/> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> </context> </generatorConfiguration>
===========================================================================================
参考的资料:MyBatis Generator中文文档
MyBatis从入门到精通(第5章):5.4 Example 介绍
Intellij IDEA中mybatis-generator自动生成
end