zoukankan      html  css  js  c++  java
  • mybatis自动生成model、dao及对应的mapper.xml文件

    背景:

      日常开发中,如果新建表,手动敲写model、dao和对应的mapper.xml文件,费时费力且容易出错,

    所以采用mybatis自动生成model、dao及对应的mapper.xml文件。代码注释风格采用自定义注释。

    环境:

      jdk1.8,maven,mysql

    项目结构:


     mbg-comment:自定义注释

    pom文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.lw</groupId>
        <artifactId>mbg-comment</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>mbg-comment</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <mybatis.generator.version>1.4.0</mybatis.generator.version>
        </properties>
    
        <dependencies>
            <dependency>
               <groupId>org.mybatis.generator</groupId>
               <artifactId>mybatis-generator-core</artifactId>
               <version>${mybatis.generator.version}</version>
           </dependency>
        </dependencies>
    
    </project>

    如果要实现自定义注释功能,需要实现CommentGenerator接口;

    我采用的是,创建EmptyCommentGenerator抽象类实现CommentGenerator接口,创建MyCommentGenerator继承EmptyCommentGenerator抽象类;

     EmptyCommentGenerator抽象类重写CommentGenerator接口中所有的方法即可;

     MyCommentGenerator类代码,将需要具体实现的方法重写逻辑即可;

    package com.lw.mbgcomment.comment;
    
    import org.mybatis.generator.api.IntrospectedColumn;
    import org.mybatis.generator.api.IntrospectedTable;
    import org.mybatis.generator.api.dom.java.Field;
    import org.mybatis.generator.api.dom.java.TopLevelClass;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * @Classname MySQLCommentGenerator
     * @Description 自定义注释
     * @Date 2019/12/6 13:32
     * @Author lw
     */
    public class MyCommentGenerator extends EmptyCommentGenerator {
    
        private Properties properties;
    
        public MyCommentGenerator() {
            properties = new Properties();
        }
    
        /**
         * 添加配置属性
         *
         * @param properties
         */
        @Override
        public void addConfigurationProperties(Properties properties) {
            this.properties.putAll(properties);
        }
    
        /**
         * 模型类注释
         *
         * @param topLevelClass
         * @param introspectedTable
         */
        @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(" */");
        }
    
        /**
         * 字段注释
         *
         * @param field
         * @param introspectedTable
         * @param introspectedColumn
         */
        @Override
        public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
            // 获取列注释
            String remarks = introspectedColumn.getRemarks();
            // 组装注释模板
            field.addJavaDocLine("/** " + remarks + " */");
        }
    
    }
    View Code

    mbg-service:代码生成

    pom文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.lw</groupId>
        <artifactId>mbg-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>mbg-service</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <mybatis.generator.version>1.4.0</mybatis.generator.version>
            <mysql.connector.version>5.1.40</mysql.connector.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>${mybatis.generator.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.connector.version}</version>
            </dependency>
           <!-- 通过java代码GeneratorClient运行main方法时,将此依赖放开;
                不然会找不到自定义注释类,要求classpath保持一致;-->
           <dependency>
                <groupId>com.lw</groupId>
                <artifactId>mbg-comment</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>${mybatis.generator.version}</version>
                    <dependencies>
                        <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.connector.version}</version>
                    </dependency>
                        <dependency>
                            <groupId>com.lw</groupId>
                            <artifactId>mbg-comment</artifactId>
                            <version>0.0.1-SNAPSHOT</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <id>Generate MyBatis Artifacts</id>
                            <phase>package</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--允许移动生成的文件 -->
                        <verbose>true</verbose>
                        <!-- 是否覆盖 -->
                        <overwrite>true</overwrite>
                        <!-- 自动生成的配置文件 -->
                        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                    </configuration>
                </plugin>
            </plugins>
    
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>*.properties</include>
                        <include>*.xml</include>
                    </includes>
                    <excludes>
                        <exclude>generatorConfig-template.xml</exclude>
                    </excludes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    
    </project>
    View Code

    生成代码配置文件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>
        <!-- 引入配置文件 -->
        <properties resource="jdbc.properties"/>
    
        <!-- 环境信息 -->
        <context id="myMbg" targetRuntime="MyBatis3Simple" defaultModelType="flat">
            <!-- 生成的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"/>
            <!-- 标记数据库对象名的符号,MYSQL默认是`反引号 -->
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
    
            <!-- 自定义注释生成器 -->
            <commentGenerator type="com.lw.mbgcomment.comment.MyCommentGenerator">
                <property name="author" value="lw"/>
                <property name="dateFormat" value="yyyy/MM/dd HH:mm:ss"/>
            </commentGenerator>
    
            <!-- jdbc配置 -->
            <jdbcConnection driverClass="${jdbc_driver}" connectionURL="${jdbc_url}" userId="${jdbc_username}" password="${jdbc_password}">
                <property name="useInformationSchema" value="true" />
            </jdbcConnection>
    
            <!-- java类型处理 -->
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
            <!-- 生成Entity类存放位置 -->
            <!-- 注意:通过java代码GeneratorClient运行main方法时,targetProject="mbg-service/src/main/java" -->
            <javaModelGenerator targetPackage="com.lw.mbgservice.entity" targetProject="src/main/java">
                <!-- 是否允许建立子包(对应MySql的scheme),默认为false -->
                <property name="enableSubPackages" value="true"/>
                <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
                <property name="trimStrings" value="false"/>
            </javaModelGenerator>
    
            <!-- 生成映射文件存放位置 -->
            <!-- 注意:通过java代码GeneratorClient运行main方法时,targetProject="mbg-service/src/main/java" -->
            <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
            <!-- 生成Dao类存放位置 -->
            <!-- 注意:通过java代码GeneratorClient运行main方法时,targetProject="mbg-service/src/main/java" -->
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.lw.mbgservice.dao" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
    
            <!-- 设置数据库的表名和实体类名 -->
            <table tableName="c_bankcard_agreement" domainObjectName="BankcardAgreementEntity"/>
            <table tableName="b_phone_white_pro" domainObjectName="PhoneWhitePro"/>
        </context>
    
    </generatorConfiguration>
    View Code

    注意:type是自定义注释类


     代码生成方式,讲述两种(java代码运行和mvn插件):

    1.mvn插件

    打开maven窗口,mbg-service服务Plugins目录,双击mybatis-generator:generate即可

     2.java代码运行

    package com.lw.mbgservice.client;
    
    import org.mybatis.generator.api.MyBatisGenerator;
    import org.mybatis.generator.config.Configuration;
    import org.mybatis.generator.config.xml.ConfigurationParser;
    import org.mybatis.generator.internal.DefaultShellCallback;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Classname GeneratorClient
     * @Description 代码生成客户端
     * @Date 2019/12/12 9:03
     * @Author lw
     */
    public class GeneratorClient {
    
        /**
         * 代码生成:
         *  1.将pom.xml中,自定义注释mbg-comment依赖放开
         *  2.generatorConfig.xml文中,targetProject属性加上项目名称,使用targetProject="mbg-service/src/main/java"
         *
         * @param args
         */
        public static void main(String[] args) {
            List<String> warnings = new ArrayList<>();
            boolean overwrite = true;
    
            try{
                ClassLoader classloader = Thread.currentThread().getContextClassLoader();
                InputStream is = classloader.getResourceAsStream("generatorConfig.xml");
                ConfigurationParser cp = new ConfigurationParser(warnings);
                Configuration config = cp.parseConfiguration(is);
                DefaultShellCallback callback = new DefaultShellCallback(overwrite);
                MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
                myBatisGenerator.generate(null);
            }catch (Exception e){
                e.printStackTrace();
            }
    
            warnings.forEach(warning -> {
                System.out.println("=== " + warning);
            });
        }
    
    }
    View Code

    生成代码效果


    遇到的问题

    1.中文乱码

    在generatorConfig.xml中,添加  <property name="javaFileEncoding" value="UTF-8"/> 

     2.数据库字段注释中文乱码,在数据库连接url中添加 characterEncoding=utf-8 

     数据库字符集设置:

     3.找不到自定义注释类 com.lw.mbgcomment.comment.MyCommentGenerator 

    需要保证classpath一致,在pom文件<build/>中引入mbg-comment依赖

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/lwcode6/p/12033317.html
Copyright © 2011-2022 走看看