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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM