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依赖

  • 相关阅读:
    设计模式(十七)Observer模式
    设计模式(十六)Mediator模式
    设计模式(十五)Facade模式
    设计模式(十四)Chain of Responsibility模式
    设计模式(十三)Visitor模式
    设计模式(十一)Composite模式
    设计模式(十二)Decorator模式
    设计模式(十)Strategy模式
    python 函数编程
    python import hashllb
  • 原文地址:https://www.cnblogs.com/lwcode6/p/12033317.html
Copyright © 2011-2022 走看看