MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了

文章目录

  • 一. 问题背景
  • 二. 参考博客
  • 三. 效果图
  • 四. 搭建MyBatis逆向工程环境
    • 4.1 前言
    • 4.2 引入依赖
    • 4.3 创建mybatis generator需要用的数据源
    • 4.4 配置genreatorConfig.xml文件
    • 4.5 创建mybatis generator启动类
  • 五. 生成自定义注释
    • 5.1 问题背景
    • 5.2 实现自定义注释
      • 5.2.1 创建自定义注释的类
      • 5.2.2 引入自定义注释的类
      • 5.2.3 启动mybatis generator
    • 5.3 自定义注释的原理
  • 六. 官方提供的完整generatorConfig.xml配置

一. 问题背景

IDE: IntelliJ IDEA
后台: SpringBoot 2.3
数据库: MySQL 5.7.25
数据库驱动: com.mysql.cj.jdbc.Driver

情况:本工程是由SpringBoot 2.3搭建起来。数据库表的字段太多(至少有20个),手动创建实体类的话,不知道要创建到什么时候,因此需要使用mybatis generator逆向工程根据数据库里面的表,自动生成对应的实体类、xxxMapper接口文件、xxxMapper.xml文件。

二. 参考博客

笔者未使用mybatis generator逆向工程之前仅仅是停留在了解层面,只知道有mybatis逆向工程这样一个技术可以自动生成实体类、xxxMapper.java文件、xxxMapper.xml文件。

当我想学习并使用mybatis逆向工程的时候,发现网上关于这方面的博客并不多,不知道是不是还有其他更热门、性能更好、更方便的技术栈来解决自动生成实体类方面的问题。

因此特别感谢维数不多的好博客给我的帮助,感谢以下博客:

  1. IDEA中使用mybatis逆向工程。这篇适合新手,非常简单易懂,思路清晰
  2. Mybatis Generator 逆向工程 POJO自定义注释。这篇适合生成自定义注释却不知道如何做
  3. 逆向工程之实现CommentGenerator接口来实现生成自定义注解的实体类等。这篇适合实现了自定义注释,但是mybatis generator没有调用我的自定义注释

三. 效果图

在这里先放效果图,如果不是大家想找的博客可以不用再看下面了,本篇博客很长。

效果图如下:

MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第1张图片
MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第2张图片

MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第3张图片
MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第4张图片

四. 搭建MyBatis逆向工程环境

4.1 前言

这里 使用的是依赖引入的方法,因此需要大家创建好maven工程环境或者SpringBoot环境,这里不赘述如何创建maven以及SpringBoot环境了。(PS:创建SpringBoot推荐使用这个连接创建https://start.aliyun.com/,拉取模块的速度非常快)
MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第5张图片

其次因为涉及数据库操作,因此需要自行搭建好mysql驱动依赖、mybatis依赖、数据源,总之搭好一个能成功操作数据库的环境

4.2 引入依赖

首先需要 引入mybatis generator依赖,大家可以自行去maven仓库搜索mybatis generator,版本建议使用1.3.5及上的,或者使用下面的:


<dependency>
	<groupId>org.mybatis.generatorgroupId>
	<artifactId>mybatis-generator-coreartifactId>
	<version>1.4.0version>
dependency>

4.3 创建mybatis generator需要用的数据源

首先 创建mybatis generator的数据源文件generator.properties:
MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第6张图片

这里配置需要生成实体类的数据表所在 数据库的信息大家根据情况自行修改信息

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/customer_marketing_icbc?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong
jdbc.userId=数据库用户名
jdbc.pwd=数据库密码

(如果数据库版本比较低的话,driver驱动那里建议使用com.mysql.jdbc.Driver,否则后面启动生成实体类时会报错can not load)

4.4 配置genreatorConfig.xml文件

创建generatorConfig.xml文件,注意文件名一定要是generatorConfig.xml,否则会引起不必要的小问题:
MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第7张图片
配置如下:(注意代码中的注释,这里只贴出我用到的最最最关键的配置,完整配置后面贴出供大家自行选择。代码下面会给出解释大概需要修改哪里)



<generatorConfiguration>
    
    <properties resource="generator.properties">properties>

    
    <context id="testTables" targetRuntime="MyBatis3">

        
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        
        <commentGenerator type="com.icbc.demo.config.MyCommentGenerator">
            
            <property name="suppressAllComments" value="false"/>
        commentGenerator>
        
        <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.userId}" password="${jdbc.pwd}">jdbcConnection>
        
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        javaTypeResolver>
        
        <javaModelGenerator targetPackage="com.icbc.demo.entity" targetProject="src/main/java">
            
            <property name="enableSubPackages" value="false"/>
            
            <property name="trimStrings" value="true"/>
        javaModelGenerator>
        
        <sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources">
            <property name="enableSubPackages" value="false">property>

        sqlMapGenerator>
        
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.icbc.demo.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        javaClientGenerator>
        
        
        
        
        <table tableName="combine_train_set"  domainObjectName="CombineTrainSet"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">table>
    context>
generatorConfiguration>

解释:

  • 首先要修改,将数据源文件generator.properties的路径填正确
  • 实体类要 生成toString()或实体类需要序列化,则需要配置如下:

<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
  • 如果 需要自定义注释,就需要引入自定义注释的那个类,使得mybatis generator能识别到,如下:
 
<commentGenerator type="com.icbc.demo.config.MyCommentGenerator">
  • 目前这里还没讲述生成自定义注释(后面会详细讲述),因此 中的typ属性可以先去掉

  • 的信息要根据自己的数据库填正确,如果没有配置数据源,则可以直接在填上值。

  • 都要修改,按照上面代码中的注释修改成自己的位置

  • 如果要通过多个数据表来创建 多个实体类,则需要创建多个

    ,其中domainObjectName是要生成实体类的名字

    4.5 创建mybatis generator启动类

    这里需要注意,启动mybatis generator有2种方式:插件启动;启动类启动。

    鉴于插件启动对后面自定义注释有很多问题且暂时未找到解决方案,这里极力推荐使用启动类启动。因此插件启动方式这里不赘述了。

    官方提供的启动方法如下:(第4行代码中需要填写自己generatorConfig.xml所在的路径

    List<String> warnings=new ArrayList<String>();
    boolean overWriter=true;
    //指向配置文件  
    File configFile=new File(MyGenerator.class.getResource("/generatorConfig.xml").getFile());
    ConfigurationParser cp=new ConfigurationParser(warnings);
    Configuration config=cp.parseConfiguration(configFile);
    DefaultShellCallback callback=new DefaultShellCallback(overWriter);
    MyBatisGenerator myBatisGenerator=new MyBatisGenerator(config,callback,warnings);
    myBatisGenerator.generate(null);
    

    完整的启动类如下:

    /**
     * mybatis generator 启动类
     */
    public class MyGenerator {
    
        public static void main(String[] args) throws Exception{
            new MyGenerator().generate();
        }
    
        //mybatis-generator 类方式启动
        public void generate() throws Exception{
            List<String> warnings=new ArrayList<String>();
            boolean overWriter=true;
            //指向配置文件  
            File configFile=new File(MyGenerator.class.getResource("/generatorConfig.xml").getFile());
            ConfigurationParser cp=new ConfigurationParser(warnings);
            Configuration config=cp.parseConfiguration(configFile);
            DefaultShellCallback callback=new DefaultShellCallback(overWriter);
            MyBatisGenerator myBatisGenerator=new MyBatisGenerator(config,callback,warnings);
            myBatisGenerator.generate(null);
        }
    }
    

    只要能运行到官方提供的方法就可以启动了,这里我在main方法里面调用它,只要我启动main方法就可以生成实体类、xxxMapper.java、xxxMapper.xml文件了。

    如果有报错问题的伙伴首先可以删除target文件夹下的classes文件夹,然后再启动试试(它会生成新的classes文件夹)。
    MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了_第8张图片

    如果仍报错,可以尝试更新mybatis-generator版本或者看看路径那些是否写正确了。

    有问题的小伙伴可留言

    五. 生成自定义注释

    5.1 问题背景

    有时字段太多且无法从字面意思直到其存储的内容是什么意义,因此我们此时可以生成注释。但是 mybatis generator自动生成的注释都是以下这些无用的注释,如下:

    /**
     * This class was generated by MyBatis Generator.
     * This class corresponds to the database table 
     * @mbg xxx xxx-xx-xx xx:xx:xx
     */
    

    我们想要的是这些有用的、字段的注释:

     /**
      * id
      */
     private String individualid;
    
     /**
      * 姓名
      */
     private String name;
    

    因此我们可以自定义注释,而且这些注释是从数据表的字段那个注释获取而来。

    5.2 实现自定义注释

    5.2.1 创建自定义注释的类

    创建一个类(名字随意,这里我使用MyCommentGenerator)并实现CommentGenerator接口。这里首先拿一个很关键的方法来讲解,它的作用是给实体类的属性添加数据表字段的注释。代码如下(注意代码中的注释,完整代码后面会给出某些解释):

    /**
         * 给实体类的属性  添加注释
         * @param field
         * @param introspectedTable
         * @param introspectedColumn
         */
        public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
            if (!this.suppressAllComments) {
                field.addJavaDocLine("/**");
                String remarks = introspectedColumn.getRemarks();
                /*if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
                    field.addJavaDocLine(" * Database Column Remarks:");
                    String[] remarkLines = remarks.split(System.getProperty("line.separator"));
                    String[] var6 = remarkLines;
                    int var7 = remarkLines.length;
    
                    for(int var8 = 0; var8 < var7; ++var8) {
                        String remarkLine = var6[var8];
                        field.addJavaDocLine(" *   " + remarkLine);
                    }
                }*/
    
                /*field.addJavaDocLine(" *");
                field.addJavaDocLine(" * This field was generated by MyBatis Generator.");*/
                StringBuilder sb = new StringBuilder();
                sb.append(" * " + remarks);//这个就是字段的注释
                /*sb.append(" * This field corresponds to the database column ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                sb.append('.');
                sb.append(introspectedColumn.getActualColumnName());*/
                field.addJavaDocLine(sb.toString());
                /*this.addJavadocTag(field, false);*/
                field.addJavaDocLine(" */");
            }
        }
    

    解释:

    • 如上代码所示,根据数据表字段的注释生成注释的方法是有3个形参的addFieldComment(xx,xx,xx)获取字段注释的关键方法是String remarks = introspectedColumn.getRemarks(),大家根据自己的需要可以将无用的代码注释掉(那些都是生成无用注释的代码),然后修改成自己想要的注释。

    下面贴出 完整的自定义注释的类,大家可以直接copy,然后根据自己的需要去修改。比如有些方法是生成xxxMapper.java文件的注释,如果不想生成无用的注释,可以直接将if判断句注释掉或者删掉。代码如下:(下面代码中的注释解释了各个方法的作用

    package com.icbc.demo.config;//修改当前类所在的包名(修改成你自己所在的包)
    
    /**
     * mybatis generator 自定义注释
     */
    public class MyCommentGenerator implements CommentGenerator {
        private Properties properties = new Properties();
        private boolean suppressDate = false;
        private boolean suppressAllComments = false;
        private boolean addRemarkComments = false;
        private SimpleDateFormat dateFormat;
    
        public MyCommentGenerator() {
        }
    
        public void addJavaFileComment(CompilationUnit compilationUnit) {
        }
    
        /**
         * 生成xxxMapper.xml文件注释的方法
         * @param xmlElement
         */
        public void addComment(XmlElement xmlElement) {
    //        if (!this.suppressAllComments) {
    //            xmlElement.addElement(new TextElement(""));
    //        }
        }
    
        public void addRootComment(XmlElement rootElement) {
        }
    
        /**
         * 在xxxMapper.java中的方法上 生成注解 的方法
         * @param method
         * @param introspectedTable
         * @param set
         */
        @Override
        public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
    
        }
    
        /**
         * 在xxxMapper.java中的方法上 生成注解 的方法
         * @param method
         * @param introspectedTable
         * @param set
         */
        @Override
        public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
    
        }
    
        /**
         * 在实体类的属性上  生成注解  的方法
         * @param field
         * @param introspectedTable
         * @param set
         */
        @Override
        public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
    
        }
    
        /**
         * 在实体类的属性上  生成注解  的方法
         * @param field
         * @param introspectedTable
         * @param set
         */
        @Override
        public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
    
        }
    
        /**
         * 在实体类上  生成类注解  的方法
         * @param innerClass
         * @param introspectedTable
         * @param set
         */
        @Override
        public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
    
        }
    
        /**
         * 从generatorConfig.xml中获取相应的配置项
         * @param properties
         */
        public void addConfigurationProperties(Properties properties) {
            this.properties.putAll(properties);
            this.suppressDate = StringUtility.isTrue(properties.getProperty("suppressDate"));
            this.suppressAllComments = StringUtility.isTrue(properties.getProperty("suppressAllComments"));
            this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
            String dateFormatString = properties.getProperty("dateFormat");
            if (StringUtility.stringHasValue(dateFormatString)) {
                this.dateFormat = new SimpleDateFormat(dateFormatString);
            }
    
        }
    
        /**
         * 打上标签
         * @param javaElement
         * @param markAsDoNotDelete
         */
        protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
            javaElement.addJavaDocLine(" *");
            StringBuilder sb = new StringBuilder();
            sb.append(" * ");
            sb.append("@mbg.generated");
            if (markAsDoNotDelete) {
                sb.append(" do_not_delete_during_merge");
            }
    
            String s = this.getDateString();
            if (s != null) {
                sb.append(' ');
                sb.append(s);
            }
    
            javaElement.addJavaDocLine(sb.toString());
        }
    
        /**
         * 获取时间
         * @return
         */
        protected String getDateString() {
            if (this.suppressDate) {
                return null;
            } else {
                return this.dateFormat != null ? this.dateFormat.format(new Date()) : (new Date()).toString();
            }
        }
    
        /**
         * 给实体类 添加 类注释
         * @param innerClass
         * @param introspectedTable
         */
        public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
            if (!this.suppressAllComments) {
                StringBuilder sb = new StringBuilder();
                innerClass.addJavaDocLine("/**");
                innerClass.addJavaDocLine(" * This class was generated by MyBatis Generator.");
                sb.append(" * This class corresponds to the database table ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                innerClass.addJavaDocLine(sb.toString());
                this.addJavadocTag(innerClass, false);
                innerClass.addJavaDocLine(" */");
            }
        }
    
        /**
         * 给创建数据库表对应的实体类 添加 注释
         * @param topLevelClass
         * @param introspectedTable
         */
        public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
            if (!this.suppressAllComments && this.addRemarkComments) {
                StringBuilder sb = new StringBuilder();
                topLevelClass.addJavaDocLine("/**");
                String remarks = introspectedTable.getRemarks();
                if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
                    topLevelClass.addJavaDocLine(" * Database Table Remarks:");
                    String[] remarkLines = remarks.split(System.getProperty("line.separator"));
                    String[] var6 = remarkLines;
                    int var7 = remarkLines.length;
    
                    for(int var8 = 0; var8 < var7; ++var8) {
                        String remarkLine = var6[var8];
                        topLevelClass.addJavaDocLine(" *   " + remarkLine);
                    }
                }
    
                topLevelClass.addJavaDocLine(" *");
                topLevelClass.addJavaDocLine(" * This class was generated by MyBatis Generator.");
                sb.append(" * This class corresponds to the database table ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                topLevelClass.addJavaDocLine(sb.toString());
                this.addJavadocTag(topLevelClass, true);
                topLevelClass.addJavaDocLine(" */");
            }
        }
    
        /**
         * 给实体类的枚举类型  添加注释
         * @param innerEnum
         * @param introspectedTable
         */
        public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
            if (!this.suppressAllComments) {
                StringBuilder sb = new StringBuilder();
                innerEnum.addJavaDocLine("/**");
                innerEnum.addJavaDocLine(" * This enum was generated by MyBatis Generator.");
                sb.append(" * This enum corresponds to the database table ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                innerEnum.addJavaDocLine(sb.toString());
                this.addJavadocTag(innerEnum, false);
                innerEnum.addJavaDocLine(" */");
            }
        }
    
        /**
         * 给实体类的属性  添加注释
         * @param field
         * @param introspectedTable
         * @param introspectedColumn
         */
        public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
            if (!this.suppressAllComments) {
                field.addJavaDocLine("/**");
                String remarks = introspectedColumn.getRemarks();
                /*if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
                    field.addJavaDocLine(" * Database Column Remarks:");
                    String[] remarkLines = remarks.split(System.getProperty("line.separator"));
                    String[] var6 = remarkLines;
                    int var7 = remarkLines.length;
    
                    for(int var8 = 0; var8 < var7; ++var8) {
                        String remarkLine = var6[var8];
                        field.addJavaDocLine(" *   " + remarkLine);
                    }
                }*/
    
                /*field.addJavaDocLine(" *");
                field.addJavaDocLine(" * This field was generated by MyBatis Generator.");*/
                StringBuilder sb = new StringBuilder();
                sb.append(" * " + remarks);//这个就是字段的注释
                /*sb.append(" * This field corresponds to the database column ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                sb.append('.');
                sb.append(introspectedColumn.getActualColumnName());*/
                field.addJavaDocLine(sb.toString());
                /*this.addJavadocTag(field, false);*/
                field.addJavaDocLine(" */");
            }
        }
    
        /**
         * 给实体类的属性  添加注释
         * @param field
         * @param introspectedTable
         */
        public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
    //        if (!this.suppressAllComments) {
    //            StringBuilder sb = new StringBuilder();
    //            field.addJavaDocLine("/**");
    //            field.addJavaDocLine(" * This field was generated by MyBatis Generator.");
    //            sb.append(" * This field corresponds to the database table ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            field.addJavaDocLine(sb.toString());
    //            this.addJavadocTag(field, false);
    //            field.addJavaDocLine(" */");
    //        }
        }
    
        /**
         * 给xxxMapper.java的方法添加注释
         * @param method
         * @param introspectedTable
         */
        public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
    //        if (!this.suppressAllComments) {
    //            StringBuilder sb = new StringBuilder();
    //            method.addJavaDocLine("/**");
    //            method.addJavaDocLine(" * This method was generated by MyBatis Generator.");
    //            sb.append(" * This method corresponds to the database table ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            method.addJavaDocLine(sb.toString());
    //            this.addJavadocTag(method, false);
    //            method.addJavaDocLine(" */");
    //        }
        }
    
        /**
         * 给实体类的getter方法添加注释
         * @param method
         * @param introspectedTable
         * @param introspectedColumn
         */
        public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    //        if (!this.suppressAllComments) {
    //            StringBuilder sb = new StringBuilder();
    //            method.addJavaDocLine("/**");
    //            method.addJavaDocLine(" * This method was generated by MyBatis Generator.");
    //            sb.append(" * This method returns the value of the database column ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            sb.append('.');
    //            sb.append(introspectedColumn.getActualColumnName());
    //            method.addJavaDocLine(sb.toString());
    //            method.addJavaDocLine(" *");
    //            sb.setLength(0);
    //            sb.append(" * @return the value of ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            sb.append('.');
    //            sb.append(introspectedColumn.getActualColumnName());
    //            method.addJavaDocLine(sb.toString());
    //            this.addJavadocTag(method, false);
    //            method.addJavaDocLine(" */");
    //        }
        }
    
        /**
         * 给实体类的setter方法添加注释
         * @param method
         * @param introspectedTable
         * @param introspectedColumn
         */
        public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    //        if (!this.suppressAllComments) {
    //            StringBuilder sb = new StringBuilder();
    //            method.addJavaDocLine("/**");
    //            method.addJavaDocLine(" * This method was generated by MyBatis Generator.");
    //            sb.append(" * This method sets the value of the database column ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            sb.append('.');
    //            sb.append(introspectedColumn.getActualColumnName());
    //            method.addJavaDocLine(sb.toString());
    //            method.addJavaDocLine(" *");
    //            Parameter parm = (Parameter)method.getParameters().get(0);
    //            sb.setLength(0);
    //            sb.append(" * @param ");
    //            sb.append(parm.getName());
    //            sb.append(" the value for ");
    //            sb.append(introspectedTable.getFullyQualifiedTable());
    //            sb.append('.');
    //            sb.append(introspectedColumn.getActualColumnName());
    //            method.addJavaDocLine(sb.toString());
    //            this.addJavadocTag(method, false);
    //            method.addJavaDocLine(" */");
    //        }
        }
    
        /**
         * 给实体类添加类注释
         * @param innerClass
         * @param introspectedTable
         * @param markAsDoNotDelete
         */
        public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
            if (!this.suppressAllComments) {
                StringBuilder sb = new StringBuilder();
                innerClass.addJavaDocLine("/**");
                innerClass.addJavaDocLine(" * This class was generated by MyBatis Generator.");
                sb.append(" * This class corresponds to the database table ");
                sb.append(introspectedTable.getFullyQualifiedTable());
                innerClass.addJavaDocLine(sb.toString());
                this.addJavadocTag(innerClass, markAsDoNotDelete);
                innerClass.addJavaDocLine(" */");
            }
        }
    }
    
    

    5.2.2 引入自定义注释的类

    定义好类后,需要将该类让mybatis generator知道,只需在generatorConfig.xml中配置如下:

    
    <commentGenerator type="com.icbc.demo.config.MyCommentGenerator">
        
        <property name="suppressAllComments" value="false"/>
    commentGenerator>
    

    解释:type的值要使用全类名,suppressAllComments的value要为false才能开启生成注释。

    5.2.3 启动mybatis generator

    由于前面生成过了实体类、xxxMapper.java、xxxMapper.xml,因此 启动前要删除他们

    删除完后可以启动那个main方法了。

    有问题的伙伴可留言。

    5.3 自定义注释的原理

    mybatis generator官方提供了接口给我们。原本mybatis generator就是使用DefaultCommentGenerator实现CommentGenerator接口来实现生成注释的。 如下:
    在这里插入图片描述
    因此我们实现CommetGenerator接口即可,可以将DefaultCommentGenerator中的代码全部复制过来到自己定义的类中,然后再修改成自己想要的效果。

    DefaultCommentGenerator中每个方法都是通过进入if语句判断suppressAllComments是否为false,为false才能执行方法的内容,因此我们要在generatorConfig.xml中配置suppressAllCommentsvaluefalse。要想mybatis generator能调用到我们的自定义类,也需要在generatorConfig.xml中配置commentGenerator的type的值为自定义类的全类名,如下:

    
    <commentGenerator type="com.icbc.demo.config.MyCommentGenerator">
        
        <property name="suppressAllComments" value="false"/>
    commentGenerator>
    

    六. 官方提供的完整generatorConfig.xml配置

    可以收藏如下完整配置,以备以后需要用到,如下:

    
    
    
    <generatorConfiguration>
        
     
        
     
        
        <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
     
            
            <property name="autoDelimitKeywords" value="false"/>
            
            <property name="javaFileEncoding" value="UTF-8"/>
            
            <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
            
            <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
     
            
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
     
            
            <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///pss" userId="root" password="admin">
                
            jdbcConnection>
     
            
            <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
                
                <property name="forceBigDecimals" value="false"/>
            javaTypeResolver>
     
     
            
            <javaModelGenerator targetPackage="com._520it.mybatis.domain" targetProject="src/main/java">
                
                <property name="constructorBased" value="false"/>
     
                
                <property name="enableSubPackages" value="true"/>
     
                
                <property name="immutable" value="false"/>
     
                
                <property name="rootClass" value="com._520it.mybatis.domain.BaseDomain"/>
     
                
                <property name="trimStrings" value="true"/>
            javaModelGenerator>
     
     
            
            <sqlMapGenerator targetPackage="com._520it.mybatis.mapper" targetProject="src/main/resources">
                
                <property name="enableSubPackages" value="true"/>
            sqlMapGenerator>
     
     
            
            <javaClientGenerator targetPackage="com._520it.mybatis.mapper" type="ANNOTATEDMAPPER" targetProject="src/main/java">
                
                <property name="enableSubPackages" value="true"/>
     
                
            javaClientGenerator>
     
            
            <table tableName="userinfo" >
     
                
                <property name="constructorBased" value="false"/>
     
                
                <property name="ignoreQualifiersAtRuntime" value="false"/>
     
                
                <property name="immutable" value="false"/>
     
                
                <property name="modelOnly" value="false"/>
     
                
     
                
     
                
     
                
     
                
     
                
                <property name="selectAllOrderByClause" value="age desc,username asc"/>
     
                
                <property name="useActualColumnNames" value="false"/>
     
     
                
     
                
     
     
                
                <columnOverride column="username">
                    
                    <property name="property" value="userName"/>
     
                    
     
                    
     
                    
     
                    
                columnOverride>
     
                
            table>
     
        context>
     
    generatorConfiguration>
    

    有问题的伙伴可留言。

    你可能感兴趣的:(每日一写,MyBatis,mybatis)