Mybatis逆向工程
1 逆向工程
逆向工程(代码生成器)就是根据数据库表生成与表对应的PO类和基于单表的增删改查的DAO(Mapper)类与映射文件(mapper.xml)等。用于提升开发效率。
MyBatis Generator(MBG)是Mybatis提供的一个逆向工程的实现。最新版本是1.3.7。
运行MBG有五种方式:
2 使用maven插件的方式
MBG重要的有两个:
- 生成代码的过程与规则等配置(一般由XML文件配置,也可以使用java代码配置)
- 实现代码生成(mybatis-generator-core-x.x.x.jar,最新的版本为1.3.7)
3 配置maven插件信息
<!--配置pom文件的全局属性,通过${varName}格式获取属性值-->
<properties>
<overwrite>true</overwrite>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<!-- 在maven构建阶段执行代码生成操作-->
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!--MBG配置属性-->
<configuration>
<!--生成代码的规则配置文件路径-->
<configurationFile>${basedir}/src/test/resources/generatorConfig.xml</configurationFile>
<overwrite>${overwrite}</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!--插件运行需要的依赖,这里必须要配置驱动包的依赖,generatorConfig配置文件中的<classPathEntry> 元素配置对maven插件方式没有效果-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
4 MBG配置属性详解
configurationFile:指定配置文件的名称。默认值:${basedir}/src/main/resources/generatorConfig.xml
contexts:参数值是generatorConfig.xml配置文件中
元素的id属性值(多个用逗号隔开),如果指定了该参数,指定的context才会被激活执行。默认是所有的context都会被激活执行。 sqlScript:要在生成代码之前运行的SQL脚本的位置。(指定了sqlScript参数需要指定jdbcDriver、jdbcURL、jdbcUserId 和 jdbcPassword)。值可以是文件的绝对路径或者是使用"classpath:"开头放在构建的类路径下的路径。
jdbcDriver:JDBC驱动类
jdbcPassword:数据库登录密码
jdbcURL:连接数据库的JDBC URL
jdbcUserId:连接数据库的账户名
outputDirectory:将放置 MBG 所生成文件的目录。这个目录是用于当targetProject在generatorConfig配置文件中设置特殊值的"MAVEN"时作为输出目录使用(大小写敏感),如果不存在则创建,而targetProject在generatorConfig配置文件中设置的值不为"MAVEN"时,则把targetProject设置的目录作为输出目录,而且该目录必须存在。默认值:${project.build.directory}/generated-sources/mybatis-generator。
overwrite:boolean类型参数,默认值为false,该参数的作用是生成的java文件存在已经同名的文件,是否覆盖源文件,如果值为true则会覆盖原文件。如果没有指定该参数或者值为false,MBG会给新生成的代码文件生成一个唯一的名字(例如: MyClass.java.1, MyClass.java.2)。 重要: 生成器一定会自动合并或覆盖已经生成的XML文件。
tableNames:参数的值是generatorConfig.xml配置文件中
<table>
元素的tableName属性值(多个用逗号隔开),如果指定了该参数,指定的表才会被激活执行。默认是所有的表都会被激活执行。verbose:boolean类型参数,默认false 执行过程是否输出到控制台
includeCompileDependencies:boolean类型参数,是否将具有范围"compile","provided"和"system"的依赖项添加到生成器的类路径中
includeAllDependencies:boolean类型参数,是否将任何范围的依赖项添加到生成器的类路径中
5 配置生成代码规则文件(generatorConfig.xml)
配置文件一般命名为generatorConfig.xml
。配置文件告诉MBG:
- 怎样连接数据库
- 生成什么对象,以及如何生成它们
- 那些表生成对象
来一个mysql的配置
<generatorConfiguration>
<context id="MysqlContext" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/smartfsc_company"
userId="root"
password="123456">
<property name="serverTimezone" value="Hongkong"/>
<property name="useUnicode" value="true"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="useSSL" value="true"/>
<property name="useJDBCCompliantTimezoneShift" value="true"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.test.mybatis.genterator.entity" targetProject="src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.test.mybatis.genterator.mapper" targetProject="src\main\java"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.test.mybatis.genterator.mapper"
targetProject="src\main\java"/>
<table tableName="%" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="Mysql"/>
<domainObjectRenamingRule searchString="^T" replaceString="" />
</table>
</context>
</generatorConfiguration>
6 配置文件详解
6.1 <generatorConfiguration>
元素
<generatorConfiguration>
元素是MyBatis Generator配置文件的根元素,这个配置文件必须包含下面的 DOCTYPE:
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
元素没有属性,它有三个子元素:
<properties>
(0 or 1)<classPathEntry>
(0..N)<context>
(1..N)
6.2 <properties>
元素
<properties>
元素是 <generatorConfiguration>
元素的子元素。用于指定一个需要在MBG配置中解析使用的外部属性文件(.properties)。属性配置文中的属性通过 ${varName}取值。可以有0或者1个
6.2.1 属性
<properties>
元素有两个必选属性(二选一),没有可选属性和子元素。必选属性为:
- resource:属性文件的全限定名称。当指定了resource属性,将会从classpath下面搜索属性文件
- url:属性文件的URL值
6.3 <classPathEntry>
元素
6.3.1 属性
<classPathEntry>
元素有一个必选属性,没有可选属性和子元素。必选属性为:
- location:要添加到类路径中的JAR/ZIP文件的完整路径
6.4 <context>
元素
<context>
元素用于指定生成一组对象的环境(包括连接数据库,生成代码的规则之类的)。可以有1个或者多个,多个 <context>
元素表示可以在同一个MyBatis Generator (MBG)从不同的数据库或者使用不同的生成器生成对象。这个元素很重要。
6.4.1 属性
<context>
元素有一个必选属性和三个可选属性。
6.4.1.1 必选属性
必选属性为:
- id:是
<context>
元素的唯一标识。
6.4.1.2 可选属性
可选属性:
- defaultModelType: 这个属性用来定义了MBG如何生成实体类,有3个值:
描述 |
---|
conditional(默认值): 如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。 |
flat: 每一张表只生成一个实体类。这个实体类包含表中的所有字段。 |
hierarchical: 如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。MBG会在所有生成的实体类之间维护一个继承关系(BLOB类继承其他字段类继承主键类)。 |
- targetRuntime: 用于指定生成的代码的代码生成器。有4个值:
描述 |
---|
MyBatis3(默认值): 会生成兼容MyBatis 3.0或更高版本,兼容JSE 5.0或更高版本的PO类对并且支持JavaSE 5.0特性(包含泛型和注解)。会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。 |
MyBatis3Simple: 上面的MyBatis3值类似,但是不会有*Example.java文件,只有少量的动态SQL。 |
Ibatis2Java2: 会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3),还有Java2的所有特性的对象。 会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。但是对象不能100%和原生的Abator或其他的代码生成器兼容。 |
Ibatis2Java5: 会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3),还有Java5或更高版本的对象并支持java5的特性(泛型、注解)。会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。但是对象不能100%和原生的Abator或其他的代码生成器兼容。 |
MBG还支持自定义代码生成器,(继承org.mybatis.generator.api.IntrospectedTable类)然后插入到代码生成器引擎中。 查阅扩展 MyBatis Generator页面获取更多信息。 |
- introspectedColumnImpl: 通过这个值指定一个继承org.mybatis.generator.api.IntrospectedColumn类的全类名, 可以修改代码生成器生成列信息的行为。 查阅扩展 MyBatis Generator页面获取更多信息。
6.4.2 子元素
<context>
元素有10个子元素:
<property> (0..N)
<plugin> (0..N)
<commentGenerator> (0 or 1)
<connectionFactory> (connectionFactory和jdbcConnection 二选一)
<jdbcConnection> (connectionFactory和jdbcConnection 二选一)
<javaTypeResolver> (0 or 1)
<javaModelGenerator> (1 Required)
<sqlMapGenerator> (0 or 1)
<javaClientGenerator> (0 or 1)
<table> (1..N)
6.5 <property>
元素
6.5.1 属性
6.5.1.1 必选属性
- name: 属性的名称(区分大小写)
- value:属性的值(通常是不区分大小写)
6.5.2 元素支持的属性
- autoDelimitKeywords: boolean类型,设置MBG是否需要给把数据库关键字作为名称的数据库表或者列加上分隔符。默认值是false
- beginningDelimiter: 设置起始分隔符的值,默认是双引号(")。MBG会自动分割包含空格的和
<table>
元素或<columnOverride>
元素中配置的标识符。 - endingDelimiter: 设置结束分隔符的值,默认是双引号(")。MBG会自动分割包含空格的和
<table>
元素或<columnOverride>
元素中配置的标识符。 - javaFileEncoding: 设置生成的Java文件的编码,默认使用当前平台的编码
- javaFormatter: 自定义java文件格式化的规则,需要继承
org.mybatis.generator.api.JavaFormatter
且必须有一个默认(不含参数)的构造方法。默认使用MBG的格式化规则。 - xmlFormatter: 自定义xml文件格式化的规则,需要继承
org.mybatis.generator.api.XmlFormatter
且必须有一个默认(不含参数)的构造方法。默认使用MBG的格式化规则。
由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`),配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
我在mysql中autoDelimitKeywords
、beginningDelimiter
、endingDelimiter
这三个属性没有体现出效果。
6.6 元素
<plugin>
元素用来定义一个插件。插件用于扩展或修改通过MBG代码生成器生成的代码。是 <context>
的子元素,可以定义任意个插件。插件按照配置中配置的顺序执行。
自己开发插件
MBG已有的插件介绍
6.6.1 属性
<plugin>
元素有一个必选属性,无可选属性,有一个子元素。
6.6.1.1 必选属性
必选属性为:
- type:实现插件接口
org.mybatis.generator.api.Plugin
的自定义插件类的全限定名。该实现类必须具有公共的默认构造函数。推荐扩展适配器类org.mybatis.generator.api.PluginAdapter
,这个适配器类比继承接口更容易扩展
6.6.1.2 子元素
子元素为 <property>
使用maven插件集成MBG的问题汇总
使用MBGsqlScript
属性生成表的中文注释乱码
使用MBGsqlScript
属性生成表的中文注释乱码的原因:
- mybatis-generator插件输出文件使用的是maven的默认编码,而maven的默认编码又是使用的是jdk,jdk又是根据操作系统(windows)的是GBK,而项目工程是utf-8。
解决方法:
- 在每次运行
mvn mybatis-generator:generate
前先运行set MAVEN_OPTS="-Dfile.encoding=UTF-8"
- 设置maven的默认编码:想一劳永逸可以配置环境变量
MAVEN_OPTS / -Dfile.encoding=UTF-8
- 设置JDK的默认编码:配置环境变量
JAVA_TOOL_OPTIONS / -Dfile.encoding=UTF-8
配置完环境变量之后遇到docs命令显示的maven编码为UTF-8,而IDEA的命令行编码还是为GBK的问题,关机重启机器即可。
没有设置UTF-8编码
解决方法:<jdbcURL>jdbc:mysql://127.0.0.1:3306/testsqlscript?characterEncoding=UTF-8</jdbcURL>
maven插件方式集成MBG<classPathEntry>
元素引入驱动包无效
解决方式:在pom文件中使用插件依赖引入的方式引入数据库驱动包
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>${basedir}/src/test/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>com.genterator</groupId>
<artifactId>commentplugin</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>E:/commentplugin-1.0.jar</systemPath>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
maven插件方式生成java文件的中文注释乱码
原因和问题1一样,maven编码问题
解决方法除了问题1的解决方法外还可以在generatorConfig.xml的<context>
元素加上<property name="javaFileEncoding" value="UTF-8"/>
属性