MyBatis Generator 自定义生成注释的方法

最近做项目,ORM 使用的是 MyBatis,为了偷懒,我自然而然的想到了使用 MyBatis Generator(MBG)来生成数据库表对应的实体代码和 Mapper 代码。于是做了如下的配置(对 MBG 配置不熟悉的同学可以参考 Mybatis Generator最完整配置详解):

<?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>
  <!-- 指定数据库驱动的jdbc驱动jar包的位置 -->
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" />

  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    <!-- 生成的 Java 文件的编码 -->
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 格式化 Java 代码 -->
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    <!-- 格式化 XML 代码 -->
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

    <!-- 配置数据库连接 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456">
    </jdbcConnection>

    <!-- 生成实体的位置 -->
    <javaModelGenerator targetPackage="me.mizhoux.model" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaModelGenerator>

    <!-- 生成 Mapper 接口的位置 -->
    <sqlMapGenerator targetPackage="me.mizhoux.mapper" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </sqlMapGenerator>

    <!-- 生成 Mapper XML 的位置 -->
    <javaClientGenerator targetPackage="me.mizhoux.mapper" type="XMLMAPPER" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaClientGenerator>

    <!-- 设置数据库的表名和实体类名 -->
    <table tableName="t_user" domainObjectName="User">
      <!-- generatedKey用于生成生成主键的方法 -->
      <generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()"/>
    </table>

  </context>

</generatorConfiguration>

数据库建库建表的代码:

CREATE SCHEMA `db_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;

CREATE TABLE `db_test`.`t_user` (
 `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
 `username` VARCHAR(30) NULL COMMENT '用户名称',
 `password` VARCHAR(20) NULL COMMENT '用户密码',
 `birthday` DATE NULL COMMENT '用户生日',
 PRIMARY KEY (`id`),
 UNIQUE INDEX `username_UNIQUE` (`username` ASC)
) COMMENT = '用户';

开开心心,执行命令,开始生成代码:

java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite

然后查看生成的 Java 实体类:

看着这个注释,让我有点纠结啊 —— 为什么不是数据库中每个字段对应的注释呢?查找相关资料,得知 MBG 生成的是由 org.mybatis.generator.api.CommentGenerator 来控制的。这是一个接口,MBG 的默认实现类是做 org.mybatis.generator.internal.DefaultCommentGenerator。当你在 generatorConfig.xml 中配置了 commentGenerator 标签,那么默认状态下,生成注释的工作,将由 DefaultCommentGenerator来完成。 所以我们来查看下这个 DefaultCommentGenerator 的源码:

public class DefaultCommentGenerator implements CommentGenerator {
  // 属性,即配置在 commentGenerator 标签之内的 Property 标签
  private Properties properties;
  // 是否不生成日期
  private boolean suppressDate;
  // 是否不生成注释
  private boolean suppressAllComments;
  // 是否添加数据库内的注释
  private boolean addRemarkComments;
  // 日期格式化
  private SimpleDateFormat dateFormat;

  public DefaultCommentGenerator() {
    super();
    properties = new Properties();
    suppressDate = false;
    suppressAllComments = false;
    addRemarkComments = false;
  }

  @Override
  public void addConfigurationProperties(Properties properties) {
    this.properties.putAll(properties);

    suppressDate = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));

    suppressAllComments = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));

    addRemarkComments = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));

    String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT);
    if (StringUtility.stringHasValue(dateFormatString)) {
      dateFormat = new SimpleDateFormat(dateFormatString);
    }
  }

  // 其他代码
  ...
}

addRemarkComments 这个属性,看来就是用来生成数据库注释用的 —— 好开心,那把它设置为 true 试试:

<generatorConfiguration>
  <!-- 指定数据库驱动的jdbc驱动jar包的位置 -->
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" />

  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 其他 Property -->

    <commentGenerator>
      <property name="suppressDate" value="true"/>
      <property name="addRemarkComments" value="true"/>
    </commentGenerator>

    ...
  </context>
</generatorConfiguration>

运行命令:

java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite

数据库注释倒是拿到了,但是生成的一堆其他信息,看着实在是太扎眼了。查看源码,发现这些内容已经写死在 DefaultCommentGenerator 中了,没有办法自定义。

自己动手丰衣足食,我们为啥不自己写个类实现 CommentGenerator 接口,然后自定义自己想要的注释呢。查看 commentGenerator 的 DTD,发现正好 commentGenerator 有个 type 属性,可以用来指定自己的注释实现类:

查看 CommentGenerator 接口,发现里面的方法非常多,不仅包含了生成 Java 实体注释对应的方法,还包括了生成 XML 中注释的方法。所以我们先写一个默认的实现类,实现CommentGenerator 接口,但不做任何操作 —— 因为 DefaultCommentGenerator 本文已经存在了,为了避免混淆,就叫它SimpleCommentGenerator吧。然后定义我们自己的注释类,MySQLCommentGenerator,继承 SimpleCommentGenerator,重写我们需要的方法:

public class MySQLCommentGenerator extends SimpleCommentGenerator {

  private Properties properties;

  public MySQLCommentGenerator() {
    properties = new Properties();
  }

  @Override
  public void addConfigurationProperties(Properties properties) {
    // 获取自定义的 properties
    this.properties.putAll(properties);
  }

  @Override
  public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
    String author = properties.getProperty("author");
    String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
    SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);

    // 获取表注释
    String remarks = introspectedTable.getRemarks();

    topLevelClass.addJavaDocLine("/**");
    topLevelClass.addJavaDocLine(" * " + remarks);
    topLevelClass.addJavaDocLine(" *");
    topLevelClass.addJavaDocLine(" * @author " + author);
    topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
    topLevelClass.addJavaDocLine(" */");
  }

  @Override
  public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    // 获取列注释
    String remarks = introspectedColumn.getRemarks();
    field.addJavaDocLine("/**");
    field.addJavaDocLine(" * " + remarks);
    field.addJavaDocLine(" */");
  }
}

因为我们现在要使用到我们自己自定义的 CommentGenerator ,所以我们 通过代码的方式来操作 MBG

public class Generator {

  public static void main( String[] args ) throws Exception {
    List<String> warnings = new ArrayList<>();
    File configFile = new File("generatorConfig.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = cp.parseConfiguration(configFile);
    DefaultShellCallback callback = new DefaultShellCallback(true);
    MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
    myBatisGenerator.generate(null);
  }

}

然后配置 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>
  <!-- 指定数据库驱动的jdbc驱动jar包的位置 -->
  <!-- 不再需要,因为 jar 包已经在 classpath 中
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" />
  -->

  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    ...

    <!-- 自定义注释生成器 -->
    <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator">
      <property name="author" value="Michael Chow"/>
      <property name="dateFormat" value="yyyy/MM/dd"/>
    </commentGenerator>

    ...
  </context>

</generatorConfiguration>

完整的 Maven 项目在 我的 GitHub。现在,我们运行主类 Generator,成功生成了数据库中的注释:

等等,好像有点不对劲!

类的注释怎么没有了!

想来应该是 JDBC 连接 MySQL 的时候需要添加什么属性才能获取表的注释,上网查询,发现是 useInformationSchema,需要将其设置为 true(看来是 MBG 给自己的 DefaultCommentGenerator 开了小灶):

<?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>
  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    ...

    <!-- 自定义注释生成器 -->
    <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator">
      <property name="author" value="Michael Chow"/>
      <property name="dateFormat" value="yyyy/MM/dd"/>
    </commentGenerator>

    <!-- 配置数据库连接 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456">
       <!-- 设置 useInformationSchema 属性为 true -->
       <property name="useInformationSchema" value="true" />
    </jdbcConnection>

    ...
  </context>
</generatorConfiguration>

然后再次运行主类 Generator

成功的生成了类主食和字段注释~

我这里并没有处理注释是多行文本的情况 —— 留给有兴趣的读者吧~

小项目地址:https://github.com/mizhoux/mbg-comment

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解mybatis.generator配上最新的mysql 8.0.11的一些坑

    一.简介 mybatis-geneator是一款mybatis自动代码生成工具,可以通过配置,自动生成Entity.mapper和xml文件. 二.配置(配置的话  按着我这个来配置吧 !  ) 在pom文件的<build>下的<plugins>添加以下配置 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plu

  • 详解在IDEA中使用MyBatis Generator逆向工程生成代码

    本文介绍一下用Maven工具如何生成Mybatis的代码及映射的文件. 一.配置Maven pom.xml 文件 在pom.xml增加以下插件: <build> <finalName>zsxt</finalName> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-pl

  • IDEA Maven Mybatis generator 自动生成代码(实例讲解)

    IDEA Maven Mybatis generator 自动生成代码的实例讲解 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` varchar(100) NOT NULL, `username` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT

  • 如何使用mybatis-generator自动生成代码

    这篇文章主要介绍了如何使用mybatis-generator自动生成代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在pom文件中添加mybatis-generator插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> &l

  • mybatis generator 使用方法教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis generator的使用. 现在项目写完了,闲暇之余把干货奉上,供大家直接使用. 需求场景: 当你的java 项目数据库有N张表需要使用mybatis进行数据库操作时,建议使用mybatis generator 自动生成工具.可以自动帮助你生成java实体类.dao.mapper.xml等. 首先给大家分享

  • 详解在springboot中使用Mybatis Generator的两种方式

    介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql.相信很多人都听说过微服务,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在一个微服务的开发过程中很可能只关注对单表的操作.所以MBG在开发过程中可以快速的生成代码提升开发效率. 本文将说到在springboot的项目中如何去配置(XML形式和Java配置类形式)和使用M

  • MyEclipse2018中安装Mybatis generator插件的实现步骤

    前言 在使用maven配置Mybatis generator插件时报以下错误,generator插件一直无法使用,查询资料说和eclipse版本有关系. The POM for org.eclipse.m2e:lifecycle-mapping:jar:1.0.0 is missing, no dependency information available 无奈之下选择安装eclipse的插件. 安装步骤(基于MyEclipse2018) 点击help-->install from catal

  • MyBatis Generator 自定义生成注释的方法

    最近做项目,ORM 使用的是 MyBatis,为了偷懒,我自然而然的想到了使用 MyBatis Generator(MBG)来生成数据库表对应的实体代码和 Mapper 代码.于是做了如下的配置(对 MBG 配置不熟悉的同学可以参考 Mybatis Generator最完整配置详解): <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC &qu

  • Mybatis Generator自动生成对应文件的实现方法

    使用Generator自动生成我们需要的bean dao mapper xml等文件的过程(没有借助eclipse等编辑工具直接命令提示符生成) 第一步:在E盘新建一个文件夹generator,在这文件夹下创建一个test文件夹用来存放生成的文件,在创建一个generator.xml的配置文件 第二步:导入需要的jar包 mybatis-generator-core-1.3.2.jar 和mysql-connector-java-5.1.28-bin.jar 第三步:编写generator.xm

  • 解决myBatis generator逆向生成没有根据主键的select,update和delete问题

    一.配置逆向generatoe.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

  • mybatis generator只能生成insert和selectAll的操作

    一般出现这个情况的时候,怎么办? 第一步:不要慌,保持冷静的思考和清醒的头脑,这很关键! 第二步:打开浏览器,搜索一下:Cannot obtain primary key information from the database, generated objects may be incomplete这个错误, 遇到这种情况的时候,代码生成器就只会生成insert和selectAll这两个方法,这个时候需要在jdbc配置的connectionURL上加上一个参数:nullCatalogMean

  • 详解在idea 中使用Mybatis Generator逆向工程生成代码

    通过MAVEN完成 Mybatis 逆向工程 1. POM文件中添加插件 在 pom 文件的build 标签中 添加 plugin 插件和 数据库连接 jdbc 的依赖. <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <

  • MyBatis Generator去掉生成的注解

    是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybatis generator是提供了配置注解的能力,配置如下,在generatorConfig.xml中加上配置: <commentGenerator> <property name="suppressDate" value="true"/> <

  • Mybatis使用命令生成逆向工程的方法

    MyBatis Generator命令生成 1.下载jar:点击此处进入官网 2.解压后打开lib在里面创建generatorConfig.xml和一个src文件夹. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//

  • SpringBoot整合Mybatis Generator自动生成代码

    目录 1.创建SpringBoot项目 2. mybatis-generator-maven插件的配置 3. 项目结构构建 4. application.yml配置 5. generatorConfig.xml配置 7. 选择 Mybatis Generator 启动,自动在dao.entity.mapper包下生成代码 Mybatis是目前主流的ORM框架,相比于hibernate的全自动,它是半自动化需要手写sql语句.接口.实体对象,后来推出的Generator自动生成代码,可以帮我们提高

  • Mybatis generator自动生成代码插件实例解析

    mybatis自动生成代码(实体类.Dao接口等)是很成熟的了,就是使用mybatis-generator插件. 它是一个开源的插件,使用maven构建最好,可以很方便的执行 插件官方简介: http://www.mybatis.org/generator/index.html 插件的GitHub地址: https://github.com/mybatis/generator 如何使用mybatis-generator插件呢?只需要三步: 1.修改pom.xml配置文件 网上大部分说法都要添加依

随机推荐