通用 Mapper 专用代码生成器
使用该插件可以很方便的生成实体类、Mapper接口以及对应的XML文件。
本篇文档就是讲述如何在 MBG 中使用该插件。
首先对MBG不太了解的可以先阅读下面的文档
Mybatis Geneator 详解
http://blog.csdn.net/isea533/article/details/42102297
4.1.1 简单介绍
通用 Mapper 专用代码生成器生成的 Model 会在原有基础上增加 @Table,@Id,@Column
等注解,方便自动会数据库字段进行映射。
运行MBG有多种方法,这里只介绍两种比较常见的方法。并且有关的内容会针对这样的运行方式进行配置。
4.1.2 使用Java编码方式运行MBG
在 generatr 项目测试代码中包含这个例子。
https://github.com/abel533/Mapper/blob/master/generator/src/test/java/tk/mybatis/mapper/generator/Generator.java
使用这种方式,需要引入 MBG 的依赖,同时项目中应该已经有通用 Mapper 的依赖了。
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version>
</dependency>
<!-- 通用 Mapper -->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>4.0.0</version>
</dependency>
<!-- 如果你只需要用到通用 Mapper 中的插件,可以只引入 mapper-generator -->
<!-- 注意,这个包不需要和上面的 mapper 同时引入,mapper 中包含 generator -->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-generator -->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-generator</artifactId><version>1.0.0</version>
</dependency>
Java代码很容易,和测试中的一样:
public static void main(String[] args) throws Exception {List<String> warnings = new ArrayList<String>();boolean overwrite = true;ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(getResourceAsStream("generatorConfig.xml"));DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);for (String warning : warnings) {System.out.println(warning);}}
注意,测试中还有
startDB
等方法,这是因为测试中使用的 hsqldb 内存数据库。
这段代码容易,最主要的一个内容是"generatorConfig.xml"
,我们应该如何配置该类。
下面是一个generatorConfig.xml
的例子:
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!--suppress MybatisGenerateCustomPluginInspection -->
<generatorConfiguration><context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"><property name="javaFileEncoding" value="UTF-8"/><property name="useMapperCommentGenerator" value="false"/><plugin type="tk.mybatis.mapper.generator.MapperPlugin"><property name="mappers" value="tk.mybatis.mapper.common.Mapper"/><property name="caseSensitive" value="true"/><property name="forceAnnotation" value="true"/><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/></plugin><jdbcConnection driverClass="org.hsqldb.jdbcDriver"connectionURL="jdbc:hsqldb:mem:generator"userId="sa"password=""></jdbcConnection><!--MyBatis 生成器只需要生成 Model--><javaModelGenerator targetPackage="test.model" targetProject="generator/src/test/java"/><table tableName="user_info"><generatedKey column="id" sqlStatement="JDBC"/></table><table tableName="country"><generatedKey column="id" sqlStatement="JDBC"/></table></context>
</generatorConfiguration>
和一般的配置相比,这里只是多了一个插件的配置:
<plugin type="tk.mybatis.mapper.generator.MapperPlugin"><property name="mappers" value="tk.mybatis.mapper.common.Mapper"/><property name="caseSensitive" value="true"/><property name="forceAnnotation" value="true"/><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/>
</plugin>
这里最关键的参数就是 mappers
,配置后生成的 Mapper 接口都会自动继承上改接口,如果你定义了一个自己的基础接口,例如:
package xxx.base;import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;/*** 继承自己的MyMapper*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {//TODO//FIXME 特别注意,该接口不能被扫描到,否则会出错
}
在配置插件时,可以配置为:
<property name="mappers" value="xxx.base.MyMapper"/>
其他参数的含义:
- caseSensitive 是否区分大小写,默认值
false
。如果数据库区分大小写,这里就需要配置为true
,这样当表名为USER
时,会生成@Table(name = "USER")
注解,否则使用小写user
时会找不到表。 - forceAnnotation 是否强制生成注解,默认
false
,如果设置为true
,不管数据库名和字段名是否一致,都会生成注解(包含@Table
和@Column
)。 - beginningDelimiter 和 endingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。
- useMapperCommentGenerator 是否使用通用 Mapper 提供的注释工具,默认
true
使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置false
后会用默认的,或者你可以配置自己的注释插件。
在上面<table
的配置中是针对 MySql 这种自增数据库的,如果使用 ORACLE 序列方式,可以参考下面的配置:
<table tableName="country"><generatedKey column="id" sqlStatement="select SEQ_{1}.nextval from dual" identity="false" type="pre"/>
</table>
SQL 中的 {1}
代表的是对应表的大写形式,{0}
是小写形式,这个配置生成的代码会像下面这样:
public class Country {@Id@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "select SEQ_COUNTRY.nextval from dual")private Integer id;// 省略其他
}
这段配置介绍完了,之后运行前面的JAVA方法,就会生成对应的文件。该文件的样式在最后贴个例子。
4.1.3 使用 Maven 执行MBG
这里有一个完整的例子,MyBatis-Spring,下面讲解的内容出自这个例子。
Maven 中的插件配置如下:
<plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>${jdk.version}</source><target>${jdk.version}</target></configuration></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><configuration><configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.29</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>4.0.0</version></dependency></dependencies></plugin>
</plugins>
在插件中配置了配置文件的路径,覆盖和输出详细日志三个参数。
除此之外需要特别注意的是 <dependencies>
,MBG 配置中用到的所有外部代码都必须通过依赖方式配置在这里,否则运行时会提示找不到对应的类而报错。这里有两个必须的依赖,一个是 JDBC 驱动,另一个是 Mapper 的插件。
下面看配置文件generatorConfig.xml:
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><properties resource="config.properties"/><context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><plugin type="tk.mybatis.mapper.generator.MapperPlugin"><property name="mappers" value="tk.mybatis.mapper.common.Mapper"/><property name="caseSensitive" value="true"/></plugin><jdbcConnection driverClass="${jdbc.driverClass}"connectionURL="${jdbc.url}"userId="${jdbc.user}"password="${jdbc.password}"></jdbcConnection><javaModelGenerator targetPackage="com.isea533.mybatis.model" targetProject="src/main/java"/><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><javaClientGenerator targetPackage="com.isea533.mybatis.mapper" targetProject="src/main/java"type="XMLMAPPER"/><table tableName="user_info"><generatedKey column="id" sqlStatement="JDBC"/></table></context>
</generatorConfiguration>
这里和之前相差不多,只是通过 <properties>
引入了外部属性文件,在 <jdbcConnection>
配置时,使用的属性文件中的参数。
运行
在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate
即可(前提是配置了mvn)。
生成的代码
下面是自动生成的代码的例子,这些例子可以在Mybatis-Spring这里找到。
一、实体类Country
package com.isea533.mybatis.model;import javax.persistence.*;@Table(name = "country")
public class Country {/*** 主键*/@Id@Column(name = "Id")@GeneratedValue(generator = "JDBC")private Integer id;/*** 名称*/private String countryname;/*** 代码*/private String countrycode;/*** 获取主键** @return Id - 主键*/public Integer getId() {return id;}/*** 设置主键** @param id 主键*/public void setId(Integer id) {this.id = id;}/*** 获取名称** @return countryname - 名称*/public String getCountryname() {return countryname;}/*** 设置名称** @param countryname 名称*/public void setCountryname(String countryname) {this.countryname = countryname;}/*** 获取代码** @return countrycode - 代码*/public String getCountrycode() {return countrycode;}/*** 设置代码** @param countrycode 代码*/public void setCountrycode(String countrycode) {this.countrycode = countrycode;}
}
可以看到这里生成的注释是有意义的内容,注释来源于数据库表字段的注释。
二、Mapper接口CountryMapper
package com.isea533.mybatis.mapper;import com.isea533.mybatis.model.Country;
import tk.mybatis.mapper.common.Mapper;public interface CountryMapper extends Mapper<Country> {
}
接口自动继承配置的通用Mapper接口,自动包含泛型实体。
三、Mapper.xml文件CountryMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.isea533.mybatis.mapper.CountryMapper"><resultMap id="BaseResultMap" type="com.isea533.mybatis.model.Country"><!--WARNING - @mbg.generated--><id column="Id" jdbcType="INTEGER" property="id" /><result column="countryname" jdbcType="VARCHAR" property="countryname" /><result column="countrycode" jdbcType="VARCHAR" property="countrycode" /></resultMap>
</mapper>
xml文件只包含了实体的resultMap
映射配置。