4.1 通用 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 的依赖了。

  1. <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
  2. <dependency>
  3. <groupId>org.mybatis.generator</groupId>
  4. <artifactId>mybatis-generator-core</artifactId>
  5. <version>1.3.6</version>
  6. </dependency>
  7. <!-- 通用 Mapper -->
  8. <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
  9. <dependency>
  10. <groupId>tk.mybatis</groupId>
  11. <artifactId>mapper</artifactId>
  12. <version>4.0.0</version>
  13. </dependency>
  14. <!-- 如果你只需要用到通用 Mapper 中的插件,可以只引入 mapper-generator -->
  15. <!-- 注意,这个包不需要和上面的 mapper 同时引入,mapper 中包含 generator -->
  16. <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-generator -->
  17. <dependency>
  18. <groupId>tk.mybatis</groupId>
  19. <artifactId>mapper-generator</artifactId>
  20. <version>1.0.0</version>
  21. </dependency>

Java代码很容易,和测试中的一样:

  1. public static void main(String[] args) throws Exception {
  2. List<String> warnings = new ArrayList<String>();
  3. boolean overwrite = true;
  4. ConfigurationParser cp = new ConfigurationParser(warnings);
  5. Configuration config =
  6. cp.parseConfiguration(getResourceAsStream("generatorConfig.xml"));
  7. DefaultShellCallback callback = new DefaultShellCallback(overwrite);
  8. MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
  9. myBatisGenerator.generate(null);
  10. for (String warning : warnings) {
  11. System.out.println(warning);
  12. }
  13. }

注意,测试中还有 startDB 等方法,这是因为测试中使用的 hsqldb 内存数据库。

这段代码容易,最主要的一个内容是"generatorConfig.xml",我们应该如何配置该类。

下面是一个generatorConfig.xml的例子:

  1. <!DOCTYPE generatorConfiguration
  2. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  4. <!--suppress MybatisGenerateCustomPluginInspection -->
  5. <generatorConfiguration>
  6. <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
  7. <property name="javaFileEncoding" value="UTF-8"/>
  8. <property name="useMapperCommentGenerator" value="false"/>
  9. <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
  10. <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
  11. <property name="caseSensitive" value="true"/>
  12. <property name="forceAnnotation" value="true"/>
  13. <property name="beginningDelimiter" value="`"/>
  14. <property name="endingDelimiter" value="`"/>
  15. </plugin>
  16. <jdbcConnection driverClass="org.hsqldb.jdbcDriver"
  17. connectionURL="jdbc:hsqldb:mem:generator"
  18. userId="sa"
  19. password="">
  20. </jdbcConnection>
  21. <!--MyBatis 生成器只需要生成 Model-->
  22. <javaModelGenerator targetPackage="test.model"
  23. targetProject="generator/src/test/java"/>
  24. <table tableName="user_info">
  25. <generatedKey column="id" sqlStatement="JDBC"/>
  26. </table>
  27. <table tableName="country">
  28. <generatedKey column="id" sqlStatement="JDBC"/>
  29. </table>
  30. </context>
  31. </generatorConfiguration>

和一般的配置相比,这里只是多了一个插件的配置:

  1. <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
  2. <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
  3. <property name="caseSensitive" value="true"/>
  4. <property name="forceAnnotation" value="true"/>
  5. <property name="beginningDelimiter" value="`"/>
  6. <property name="endingDelimiter" value="`"/>
  7. </plugin>

这里最关键的参数就是 mappers,配置后生成的 Mapper 接口都会自动继承上改接口,如果你定义了一个自己的基础接口,例如:

  1. package xxx.base;
  2. import tk.mybatis.mapper.common.Mapper;
  3. import tk.mybatis.mapper.common.MySqlMapper;
  4. /**
  5. * 继承自己的MyMapper
  6. */
  7. public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
  8. //TODO
  9. //FIXME 特别注意,该接口不能被扫描到,否则会出错
  10. }

在配置插件时,可以配置为:

  1. <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 后会用默认的,或者你可以配置自己的注释插件。
  • generateColumnConsts 在生成的 model中,增加字段名的常量,便于使用 Example 拼接查询条件的时候使用。
  • lombok 增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true) 四类注解, 使用者在插件配置项中增加 <property name="lombok" value="Getter,Setter,ToString,Accessors"/> 即可生成对应包含注解的 model 类。

在上面<table 的配置中是针对 MySql 这种自增数据库的,如果使用 ORACLE 序列方式,可以参考下面的配置:

  1. <table tableName="country">
  2. <generatedKey column="id"
  3. sqlStatement="select SEQ_{1}.nextval from dual"
  4. identity="false" type="pre"/>
  5. </table>

SQL 中的 {1} 代表的是对应表的大写形式,{0} 是小写形式,这个配置生成的代码会像下面这样:

  1. public class Country {
  2. @Id
  3. @GeneratedValue(strategy = GenerationType.IDENTITY,
  4. generator = "select SEQ_COUNTRY.nextval from dual")
  5. private Integer id;
  6. // 省略其他
  7. }

这段配置介绍完了,之后运行前面的JAVA方法,就会生成对应的文件。该文件的样式在最后贴个例子。

4.1.3 使用 Maven 执行MBG

这里有一个完整的例子,MyBatis-Spring,下面讲解的内容出自这个例子。

Maven 中的插件配置如下:

  1. <plugins>
  2. <plugin>
  3. <artifactId>maven-compiler-plugin</artifactId>
  4. <configuration>
  5. <source>${jdk.version}</source>
  6. <target>${jdk.version}</target>
  7. </configuration>
  8. </plugin>
  9. <plugin>
  10. <groupId>org.mybatis.generator</groupId>
  11. <artifactId>mybatis-generator-maven-plugin</artifactId>
  12. <version>1.3.6</version>
  13. <configuration>
  14. <configurationFile>
  15. ${basedir}/src/main/resources/generator/generatorConfig.xml
  16. </configurationFile>
  17. <overwrite>true</overwrite>
  18. <verbose>true</verbose>
  19. </configuration>
  20. <dependencies>
  21. <dependency>
  22. <groupId>mysql</groupId>
  23. <artifactId>mysql-connector-java</artifactId>
  24. <version>5.1.29</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>tk.mybatis</groupId>
  28. <artifactId>mapper</artifactId>
  29. <version>4.0.0</version>
  30. </dependency>
  31. </dependencies>
  32. </plugin>
  33. </plugins>

在插件中配置了配置文件的路径,覆盖和输出详细日志三个参数。

除此之外需要特别注意的是 <dependencies>,MBG 配置中用到的所有外部代码都必须通过依赖方式配置在这里,否则运行时会提示找不到对应的类而报错。这里有两个必须的依赖,一个是 JDBC 驱动,另一个是 Mapper 的插件。

下面看配置文件generatorConfig.xml

  1. <!DOCTYPE generatorConfiguration
  2. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  4. <generatorConfiguration>
  5. <properties resource="config.properties"/>
  6. <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
  7. <property name="beginningDelimiter" value="`"/>
  8. <property name="endingDelimiter" value="`"/>
  9. <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
  10. <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
  11. <property name="caseSensitive" value="true"/>
  12. </plugin>
  13. <jdbcConnection driverClass="${jdbc.driverClass}"
  14. connectionURL="${jdbc.url}"
  15. userId="${jdbc.user}"
  16. password="${jdbc.password}">
  17. </jdbcConnection>
  18. <javaModelGenerator targetPackage="com.isea533.mybatis.model"
  19. targetProject="src/main/java"/>
  20. <sqlMapGenerator targetPackage="mapper"
  21. targetProject="src/main/resources"/>
  22. <javaClientGenerator targetPackage="com.isea533.mybatis.mapper"
  23. targetProject="src/main/java"
  24. type="XMLMAPPER"/>
  25. <table tableName="user_info">
  26. <generatedKey column="id" sqlStatement="JDBC"/>
  27. </table>
  28. </context>
  29. </generatorConfiguration>

这里和之前相差不多,只是通过 <properties> 引入了外部属性文件,在 <jdbcConnection> 配置时,使用的属性文件中的参数。

运行

在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate即可(前提是配置了mvn)。

生成的代码

下面是自动生成的代码的例子,这些例子可以在Mybatis-Spring这里找到。

一、实体类Country

  1. package com.isea533.mybatis.model;
  2. import javax.persistence.*;
  3. @Table(name = "country")
  4. public class Country {
  5. /**
  6. * 主键
  7. */
  8. @Id
  9. @Column(name = "Id")
  10. @GeneratedValue(generator = "JDBC")
  11. private Integer id;
  12. /**
  13. * 名称
  14. */
  15. private String countryname;
  16. /**
  17. * 代码
  18. */
  19. private String countrycode;
  20. /**
  21. * 获取主键
  22. *
  23. * @return Id - 主键
  24. */
  25. public Integer getId() {
  26. return id;
  27. }
  28. /**
  29. * 设置主键
  30. *
  31. * @param id 主键
  32. */
  33. public void setId(Integer id) {
  34. this.id = id;
  35. }
  36. /**
  37. * 获取名称
  38. *
  39. * @return countryname - 名称
  40. */
  41. public String getCountryname() {
  42. return countryname;
  43. }
  44. /**
  45. * 设置名称
  46. *
  47. * @param countryname 名称
  48. */
  49. public void setCountryname(String countryname) {
  50. this.countryname = countryname;
  51. }
  52. /**
  53. * 获取代码
  54. *
  55. * @return countrycode - 代码
  56. */
  57. public String getCountrycode() {
  58. return countrycode;
  59. }
  60. /**
  61. * 设置代码
  62. *
  63. * @param countrycode 代码
  64. */
  65. public void setCountrycode(String countrycode) {
  66. this.countrycode = countrycode;
  67. }
  68. }

可以看到这里生成的注释是有意义的内容,注释来源于数据库表字段的注释。

二、Mapper接口CountryMapper

  1. package com.isea533.mybatis.mapper;
  2. import com.isea533.mybatis.model.Country;
  3. import tk.mybatis.mapper.common.Mapper;
  4. public interface CountryMapper extends Mapper<Country> {
  5. }

接口自动继承配置的通用Mapper接口,自动包含泛型实体。

三、Mapper.xml文件CountryMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.isea533.mybatis.mapper.CountryMapper">
  4. <resultMap id="BaseResultMap" type="com.isea533.mybatis.model.Country">
  5. <!--
  6. WARNING - @mbg.generated
  7. -->
  8. <id column="Id" jdbcType="INTEGER" property="id" />
  9. <result column="countryname" jdbcType="VARCHAR" property="countryname" />
  10. <result column="countrycode" jdbcType="VARCHAR" property="countrycode" />
  11. </resultMap>
  12. </mapper>

xml文件只包含了实体的resultMap映射配置。