码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 把Mybatis Generator生成的代码加上想要的注释


    作者:王建乐

    1 前言

    在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件。但是Mybatis Generator默认生成的代码中,注释并不是我们想要的,所以一般在Generator配置文件中,会设置不自动生成注释。带来的问题就是自动生成代码之后,我们还要自己去类文件中把注释加上,如果生成的类较少还好,如果有生成很多类文件,自己加注释是一件繁琐的工作。

    通过重写Mybatis Generator的CommentGenerator接口,可以方便地生成自己想要的注释,减少重复工作。

    2 使用Java方式执行Mybatis Generator

    2.1 IDEA中新建Maven项目

    pom.xml中引入jar包

    复制代码
    "1.0" encoding="UTF-8"?>
    "http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0
    org.example
    MyGenerator
    1.0-SNAPSHOT
    
    8
    8
    
    
    
    mysql
    mysql-connector-java
    8.0.16
    
    
    org.mybatis.generator
    mybatis-generator-core
    1.3.7
    
    
    
    复制代码

     

    2.2 创建generatorConfig.xml

    随便找个目录放,我放在src/main/resources目录下

    复制代码
    "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">
    
    "mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    
    "javaFileEncoding" value="UTF-8"/>
    
    "javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    
    "xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
    
    "suppressAllComments" value="false" />
    
    
    "com.mysql.cj.jdbc.Driver"
    connectionURL="URL"
    userId="user" password="password">
    
    "useInformationSchema" value="true" />
    
    
    "com.jd.bulk"
    targetProject="src/main/java">
    "enableSubPackages" value="true"/>
    
    
    "com.jd.bulk"
    targetProject="src/main/resources">
    "enableSubPackages" value="true"/>
    
    
    "XMLMAPPER"
    targetPackage="com.jd.bulk"
    targetProject="src/main/java">
    "enableSubPackages" value="true"/>
    
    
    "worker" domainObjectName="Worker"/>
    
    复制代码

     

    2.3 创建main方法,运行Generator

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

     

    运行main方法,生成默认注释如下,并不是我们想要的注释,所以一般会配置为注释不生成:

    2.4 实现CommentGenerator接口

    重写以下方法,自定义注释

    复制代码
    public class MySQLCommentGenerator implements CommentGenerator {
    private final 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(" */");
    }
    /**
    * 重写给实体类get方法加的注释
    */
    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    // 获取表注释
    String remarks = introspectedColumn.getRemarks();
    method.addJavaDocLine("/**");
    method.addJavaDocLine(" * " + method.getName());
    method.addJavaDocLine(" */");
    }
    复制代码

     

    2.5 修改generatorConfig.xml配置

    将generatorConfig.xml文件中的commentGenerator做如下修改,type属性选择自己的实现类

    "com.generator.MySQLCommentGenerator">
    "author" value="Your Name"/>
    "dateFormat" value="yyyy/MM/dd"/>
    

     

    运行main方法,生成注释如下:

    3 使用Maven方式执行Mybatis Generator

    Pom.xml文件中增加以下配置,需要引入generator插件时,依赖实现CommentGenerator接口的jar包,要先把自己的jar包install到本地仓库。

    否则会报com.generator.MySQLCommentGenerator找不到,其他配置同上。

    复制代码
    
    compile
    
    
    org.mybatis.generator
    mybatis-generator-maven-plugin
    1.4.0
    
    src/main/resources/generatorConfig.xml
    true
    true
    
    
    
    
    mysql
    mysql-connector-java
    8.0.16
    
    
    
    org.example
    MyGenerator
    1.0-SNAPSHOT
    
    
    
    
    复制代码

     

    4 源码分析

    查看执行Mybatis Generator的main方法,主要分为两部分,解析指定的配置文件与调用生成java文件和Mapper文件的方法

    4.1 解析指定的xml配置文件

    跟踪解析xml文件的方法cp.parseConfiguration(configFile)发现,底层以Document形式读取xml文件,根据标签名解析各标签属性,保存到Configuration实例中。

    其中解析commentGenerator标签的方法parseCommentGenerator(context, childNode)中,会获取commentGenerator标签的type属性值,也就是自定义的”com.generator.MySQLCommentGenerator”类,放到Context实例中。

    4.2 调用生成java文件和Mapper文件的方法

    xml配置文件解析完成,得到Configuration实例,后面生成文件的工作都会从Configuration实例中获取所需数据。生成文件的方法主要步骤为:1.连接数据库,查询表信息与列信息,2.生成文件内容,3.写入生成文件。

    其中生成文件内容时,会根据Context的type属性反射创建MySQLCommentGenerator实例,然后调用自定义的生成注释方法。

    如:生成实体类文件的注释,调用addModelClassComment方法

    生成字段注释,调用addFieldComment方法

    生成Get方法注释,调用addGetterComment方法

    在调用addModelClassComment,addFieldComment,addGetterComment等生成注释的方法时,执行的都是MySQLCommentGenerator类的方法,这样就实现了生成自定义注释的功能。

    5 总结

    通过使用自定义实现CommentGenerator接口,让自动生成的代码加上我们想要的注释,可以省去自己加注释的麻烦。

    与一般使用Mybatis Generator生成代码的方式一样,多实现个接口即可。
    使用Maven方式运行时,需要在pom.xml引入插件时,依赖自己jar包。

  • 相关阅读:
    物联网应用技术专业是属于什么类
    分子制药中的Oracle什么意思?(评估分子的性能)
    HTTP状态码301和302的区别
    Spring Boot 篇四: Spring Data JPA使用SQL Server
    语言基础篇12——Python有哪些异常,优雅的处理异常
    4.Gin HTML 模板渲染
    DDD与微服务的千丝万缕
    服务器机器学习环境搭建(包括AanConda的安装和Pytorch的安装)
    ES6笔记————Array的扩展方法、模板字符串定义Array对象常用方法
    Chrome 重大更新,CORS 增加了两个新的请求头?
  • 原文地址:https://www.cnblogs.com/Jcloud/p/16915015.html
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号