文章目录
1 MyBatis Generator简介
MyBatis Generator (MBG) 是MyBatis的代码生成器,其内部关联一张或者多张数据库表,生成可访问表的模块。减轻了开发初期数据库表映射对象生成与配置的工作。
MyBatis Generator可以生成:
- 生成与表结构匹配的Java POJO。
- MyBatis兼容的SQL Map XML文件,并配置简单的CRUD生成SQL。
- 可选的Java客户端类,例如符合Spring框架的DAO。
[INFO] Saving file UserDO.java
[INFO] Saving file UserDOMapper.java
[INFO] Saving file UserDOMapper.xml
迭代运行MBG时,需要注意的是:
- MBG会自动合并同名的XML文件,但是不会覆盖开发人员对XML的自定义修改。
- MBG不会合并Java文件,而是选择覆盖现有文件(此处是要特别注意的点,容易导致代码丢失)。
2 运行MyBatis Generator
2.1 MBG运行方式
运行MBG有多种方式,例如通过命令行、Ant、Maven等。本文主要介绍Maven相关配置。
MBG包含一个Maven插件,可以集成到Maven构建中。
<project ...>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
</plugin>
</plugins>
</build>
</project>
当然,事情并非如此简单。
2.2 Maven目标与执行
MBG Maven插件包含一个目标:mybatis-generator:generate,这个目标不是由Maven自动执行,可以通过以下两种方式。
方式1:通过命令行执行目标。
mvn mybatis-generator:generate
方式2:使用标准Maven命令行属性将参数传递给目标。使用该命令,将会运行MBG,覆盖已有的Java文件。
mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
如果存在连续的环境构建,你可能想要MBG作为Maven构建的一部分自动执行。我们可以将目标配置为自动执行来实现。例如,
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
如上配置,MBG插件绑定到Maven构建的generate-sources阶段,因此它将在编译步骤之前执行。还要注意,MBG会生成Java源文件和XML资源,并将两者放入到构建生成的JAR包中。
2.3 MBG插件添加依赖
当前插件类路径仅包含了MBG自身,如果想要为MBG插件添加JDBC驱动,可以增加dependencies标签。
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
</plugin>
如果所需的依赖已经包含在项目的依赖项中,则可以使用与插件类路径相关的配置参数。
includeCompileDependencies或includeAllDependencies。
2.4 pom.XML配置参数
所有的参数是可选的,并且大多数有默认值。
-
configurationFile
表达式:${mybatis.generator.configurationFile}
类型:java.io.File
XML配置文件默认存放在${basedir}/src/main/resources/generatorConfig.xml
。 -
contexts
表达式:${mybatis.generator.contexts}
类型:java.lang.String
用于当前运行的context列表,以逗号分隔。列表中的任何指定id必须与context标签id属性值直接匹配。列表中指定的id在此次运行中是生效的。如果没有指定该参数,默认所有context生效。 -
jdbcDriver
表达式:${mybatis.generator.jdbcDriver}
类型:java.lang.String
如果指定sqlScript,则这是数据库要用到的标准JDBC驱动名称。 -
jdbcPassword
表达式:${mybatis.generator.jdbcPassword}
类型:java.lang.String
如果指定sqlScript,则这是数据库密码。 -
jdbcURL
表达式:${mybatis.generator.jdbcURL}
类型:java.lang.String
如果指定sqlScript,则这是连接数据库的URL。 -
jdbcUserId
表达式:${mybatis.generator.jdbcUserId}
类型:java.lang.String
如果指定sqlScript,则这是连接到数据库的用户id。 -
ouputDirectory
表达式:${mybatis.generator.outputDirectory}
类型:java.io.File
MBG生成文件的存放目录。只要将配置文件中的targetProject设置为特殊值“MAVEN”(区分大小写),就使用此目录。
默认为${project.build.directory}/generated-sources/mybatis-generator
。
注:MBG配置文件中每个Generator后缀的标签都有targetProject属性。 -
overwrite
表达式:${mybatis.generator.overwrite}
类型:boolean
如果为true,则如果发现现有Java文件的名称与生成的文件的名称相同,则现有Java文件将被覆盖。如果未指定,并且Java文件已经与生成的文件同名,则MBG会将新生成的Java文件以唯一的名称(例如MyClass.java.1,MyClass.java.2)。 重要提示:MBG将始终合并和覆盖XML文件,不会覆盖开发人员自定义的内容。
默认值:false -
sqlScript
表达式:${mybatis.generator.sqlScript}
类型:java.lang.String
生成代码之前要运行的SQL脚本文件的位置。如果为null,则不会运行任何脚本。如果不为null,则还必须提供jdbcDriver, jdbcURL。此外, 如果数据库需要身份验证,则可以提供jdbcUserId和jdbcPassword。
值可以指定为文件系统中的位置,或者如果前缀为“ classpath:”,则指定为构建类路径上的位置。 -
tableNames
配置元素中指定的标准表名完全匹配。仅此列表中指定的表将在此运行中处于活动状态。如果未指定此参数,则所有表都将处于活动状态。
表达式:${mybatis.generator.tableNames}
类型:java.lang.String
如果指定,则这是在当前运行中使用的以逗号分隔的表列表。列表中指定的任何表必须与 -
verbose
表达式:${mybatis.generator.verbose}
类型:boolean
如果为true,则MBG会将进度消息写入构建日志。 -
includeCompileDependencies
表达式:${mybatis.generator.includeCompileDependencies}
类型:boolean
如果为true,则范围为“ compile”,“ provided”和“ system”的依赖项将添加到生成器的类路径中。 -
includeAllDependencies
表达式:${mybatis.generator.includeAllDependencies}
类型:boolean
如果为true,则具有任何作用域的依赖项将添加到生成器的类路径中。
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<!--mybatis-generator插件依赖-->
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!--针对于重复生成文件的配置-->
<configuration>
<!-- 允许移动生成的文件 -->
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
3 编写MBG配置文件
MBG是通过XML配置文件来驱动的,我们通过配置文件告诉MBG怎样连接数据库、生成什么样的对象以及怎么生成、哪些表通过MBG生成对象。
如果在POM配置了configurationFile属性,则使用指定文件名;否则文件为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="generatorConfig.properties"></properties>
<classPathEntry location="${db.driverLocation}"/>
<context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- optional,旨在创建class时,对注释进行控制 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--MySQL数据库驱动、URL、账号、密码-->
<jdbcConnection driverClass="${db.driverClassName}"
connectionURL="${db.url}"
userId="${db.username}"
password="${db.password}">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--声明DataObject类存放位置-->
<javaModelGenerator targetPackage="com.seckill.dataobject" targetProject="src/main/java">
<!--是否对Model类添加构造函数,默认false-->
<property name="constructorBased" value="true"/>
<!--是否对CHAR类的列数据进行trim操作,默认false-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件的存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"></sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.seckill.dao" targetProject="src/main/java">
</javaClientGenerator>
<!--生成表与类名映射-->
<table tableName="seckill_user" domainObjectName="UserDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
<table tableName="seckill_password" domainObjectName="UserPasswordDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
generatorConfig.properties
db.driverLocation=/home/ac/.m2/repository/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306
db.username=root
db.password=123456
3.1 generatorConfiguration元素
MBG配置文件的根元素。文件包含以下文档声明:
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
子元素可以是properties(0-1)、classPathEntry(0-N)、context(1-N)。
3.2 properties元素–可选
将属性配置到外部文件中,通过properties标签引入。
<properties resource="generatorConfig.properties"></properties>
3.3 classPathEntry元素–可选
添加类路径到MBG运行的类路径中。当载入JDBC驱动,或者当载入JavaModelGenerator根类校验重写方法时,MBG从这些位置载入类。如果JDBC驱动已经在classpath下,不再需要引入该驱动jar包。
<classPathEntry location="${db.driverLocation}"/>
3.4 context 元素
指定生成一组对象的环境,例如指定数据库、生成对象和XML位置等。后面的元素都是context的子元素。
<context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
...
</context>
其中,
defaultModelType属性表示MBG如何生成实体类,flat表示为每张表只生成一个实体类。
targetRuntime用于指定生成代码的运行时环境,默认值为MyBatis3。
<property>
(0个或多个)
通常与父元素一起使用。例如,
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin>
(0个或多个)
<commentGenerator>
(0个或1个)
用于控制注释。
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection>
(1个)
用于指定数据库连接信息,有且只能有一个。下面4个属性中驱动和URL必选,用户名和密码可选。
<!--MySQL数据库驱动、URL、账号、密码-->
<jdbcConnection driverClass="${db.driverClassName}"
connectionURL="${db.url}"
userId="${db.username}"
password="${db.password}">
</jdbcConnection>
<javaTypeResolver>
(0个或1个)
用来指定JDBC类型和Java类型如何转换。
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
forceBigDecimals是可配置属性,可以强制DECIMAL和NUMERIC类型转换为Java的BigDecimal类型,默认为false,一般不需要配置。
<javaModelGenerator>
(1个)
用于控制生成的实体类。
<!--声明DataObject类存放位置-->
<javaModelGenerator targetPackage="com.seckill.dataobject" targetProject="src/main/java">
<!--是否允许子包,默认false-->
<property name="enableSubPackages" value="false"/>
<!--是否对CHAR类的列数据进行trim操作,默认false-->
<property name="trimStrings" value="true"/>
<!--生成的Model对象是否不可变,默认false-->
<property name="immutable" value="false"/>
<!--是否对Model类添加构造函数,默认false-->
<property name="constructorBased" value="true"/>
</javaModelGenerator>
还有一个属性是rootClass,用于设置所有实体类的基类。
<sqlMapGenerator>
(0个或1个)
<!--生成映射文件的存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator>
(0个或1个)
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.seckill.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<table>
(1个或多个)
配置表与POJO类的映射,只有配置的表才能生成实体类和其他文件。
<!--生成表与类名映射-->
<table tableName="seckill_user" domainObjectName="UserDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
table的属性有很多,下面简单介绍其中几个。
generatedKey 属性:指定自动生成主键。
columnRenamingRule 属性:生成列前,对列重命名。
columnOverride 属性:修改数据库列的某些属性。
columnOverride column="detail" jdbcType="VARCHAR"/>
ignoreColumn属性:屏蔽不需要生成的列。
参考文档
- http://mybatis.org/generator/index.html
- https://blog.csdn.net/u014365133/article/details/78884751