java-mybaits-015-mybatis逆向工程最佳實踐【基礎mybatis-generator、tk.mybatis、mubatis-plus】


一、概述

三款框架的功能對比

 

Mybatis-generator

通用Mapper

Mybatis-Plus

代碼生成器

支持自動生成Model,Mapper,Mapper XML文件

生成方式不夠靈活;

生成代碼功能較為簡單

支持自動生成Entity,Mapper,Mapper XML文件;

提供通用的Mapper模板,生成方式較靈活;

生成的Model文件包含注釋能夠很好地與數據庫表完成映射

支持自動生成Entity,Mapper,Mapper XML,Service,Controller文件;

提供BaseMapper接口

CRUD操作

代碼生成后每個Mapper有固定的CRUD方法;

在每個Mapper上分別擴展

提供通用Mapper接口;方便構造統一service

可以擴展通用接口

提供BaseMapper接口;

可以擴展通用接口

條件構造器

每個實體類自己的Example構造條件【對象方式】

提供通用Example【構建sql】

提供Wrapper進行復雜條件構造

樂觀鎖

 

支持

支持

主鍵策略

 

支持

支持

分頁

 

 

支持

邏輯刪除

 

 

支持

通用枚舉

 

 

支持

攻擊Sql阻斷

 

 

支持

性能分析

 

 

支持

  通用Mapper是對Mybatis-generator的升級改造,解決了使用Mybatis-generator可能需要大量重構的問題,並且在這個基礎上加入了一些新的功能。

  Mybatis-Plus可以看作是在另一個方向上對Mybatis的升級改造,不僅能夠根據數據庫表快速生成pojo實體類,還封裝了大量CRUD方法,使用Wrapper解決了復雜條件構造等問題,更是根據開發中常見的問題給出了一系列解決方案。

  在擁有Maven和Spring boot的開發框架下,MBG、通用Mapper和MP都可以快速地完成安裝,相比於MBG和通用Mapper僅需要執行插件就可以完成基本的開發工作,MP可能需要更多的開發工作量。

  最佳實踐參看代碼:https://github.com/bjlhx15/java_base_architecture.git

二、Mybatis-generator

  MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代碼生成器。它為所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代碼。它將根據數據庫表生成可用於訪問表的文件。

  Mybatis-generator主要完成的工作是依據數據庫表創建對應的model、dao、mapping文件,可以通過Maven插件或者mybatis-generator的jar包生成。

  這里介紹Maven插件使用方法:

    1、在pom.xml文件中加入mybatis-generator系列插件;

    2、創建generatorConfig.xml文件,在配置文件中指定數據庫連接地址、生成類的存放地址、生成對應表的類名等信息;

    3、執行mybatis-generator插件,即可生成相應文件;

    4、此外,mybatis-generator自動生成了example類用於構造復雜的篩選條件

  Mybatis-generator使用較為簡單,生成的DAO類及映射文件中包含基本的CRUD操作。

  需要注意的是,在一次項目中多次執行mybatis-generator,xml文件會追加,會覆蓋原本的Model、DAO;可以使用如下方式

    

    1、每次清理要生成的xml

    2、自動生成的寫入auto,

    3、個人擴展的使用上圖方式

  可以參看上述github代碼

三、通用Mapper【tk.mybatis】

官網:https://github.com/abel533/Mapper/wiki

  當數據庫字段變化頻繁時,使用MBG(mybatis-generator)會帶來大量的重構工作,對此,通用Mapper給出的解決辦法是:給予開發者一個具備豐富的單表方法並且容易擴展的通用的Mapper。

  通用Mapper是對單表的CRUD操作進行了較為詳細的實現,使得開發人員可以隨意的按照自己的需求選擇通用的方法,同時允許開發人員便捷地對通用Mapper進行擴展。

1. 在pom.xml中添加插件配置

            <!-- 命令:mvn mybatis-generator:generate -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!-- 配置實際調用地址-->
                    <configurationFile>src/main/resources/mybatis_generatorConfig/generatorConfig-base.xml
                    </configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.0.0</version>
                    </dependency>
                </dependencies>
            </plugin>
View Code

  可以看到,通用Mapper的代碼生成實際上是使用了MGB,因此通用Mapper的代碼生成器只是調用了MGB,然后在這個基礎上加入了一些元素來方便開發。

2. 配置文件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>
    <!--導入屬性配置,前面我們寫的一個配置文件,你也可以直接使用mybatis的jdbc的配置文件 -->
    <properties resource="jdbc.properties"></properties>
    <!-- 數據庫驅動,注意,這里必須要修改成你的數據庫的驅動地址 -->
    <!--    如果 pom配置這里可以不寫-->
    <!--    <classPathEntry  location=".m2/repository/mysql/mysql-connector-java/5.1.8/mysql-connector-java-5.1.8.jar"/>-->

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>

        <!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.username}" password="${jdbc.password}">
        </jdbcConnection>

<!--        <javaTypeResolver>-->
<!--            <property name="forceBigDecimals" value="false"/>-->
<!--        </javaTypeResolver>-->
        <!-- targetProject:生成PO類的位置 -->
        <javaModelGenerator targetPackage="com.github.bjlhx15.mybatis.springboot.base.model.auto"
                            targetProject="../tk-mybatis-springboot-base1/src/main/java">
            <!-- enableSubPackages:是否讓schema作為包的后綴 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 從數據庫返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- targetProject:mapper xml 映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="autoxml"
                         targetProject="../tk-mybatis-springboot-base1/src/main/resources/mapper/">
            <!-- enableSubPackages:是否讓schema作為包的后綴 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.github.bjlhx15.mybatis.springboot.base.repository.auto"
                             targetProject="../tk-mybatis-springboot-base1/src/main/java">
            <!-- enableSubPackages:是否讓schema作為包的后綴 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 指定數據庫表 -->
        <table tableName="accountbalance" domainObjectName="AccountBalance">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>


    </context>
</generatorConfiguration>
View Code

  與MGB原有的配置文件相比,這里只是多了一個插件的配置,這個插件的作用是:配置生成的Mapper接口都會自動繼承這個接口,也就是說,使用通用Mapper生成的mapper接口即使看上去空空如也,但已經具備了大量的對數據庫的操作方法。此外,通用 Mapper 專用代碼生成器生成的 Model 會在原有基礎上增加 @Table,@Id,@Column 等注解,方便自動與數據庫字段進行映射。

3. 在 pom.xml 這一級目錄的命令行窗口執行 mvn mybatis-generator:generate或者直接在執行mvn插件即可。

4. 通用Mapper同樣有Example的設計,與MGB不同的是,MDB會對每一個表生成對應的Example類,而通用Mapper提供了一個統一的Example類,這個類和 MBG 生成的相比,需要自己設置屬性名,這個類還額外提供了更多的方法。

  通用Mapper可以看作是MGB的改進和擴展,一定程度上解決了使用MGB重構的問題。

  可以參看上述github代碼

四、Mybatis-Plus

  官網地址:https://mp.baomidou.com/guide/generator.html

  (以下簡稱MP)是Mybatis的增強工具(MBG和通用Mapper可看成插件),在Mybatis的基礎上增加了很多功能,簡化開發,提高效率。

在Spring Boot中的引入:

1. 在maven中添加MP啟動器

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>

2. 要使用代碼生成器還需要添加模板引擎依賴

參看地址:AutoGenerator的使用參考 https://mybatis.plus/guide/generator.html 。

添加 模板引擎 依賴,MyBatis-Plus 支持 Velocity(默認)、Freemarker、Beetl,用戶可以選擇自己熟悉的模板引擎,如果都不滿足您的要求,可以采用自定義模板引擎。

Velocity(默認):

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.1</version>
</dependency>

Freemarker:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

Beetl:

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

注意!如果您選擇了非默認引擎,需要在 AutoGenerator 中 設置模板引擎。

AutoGenerator generator = new AutoGenerator();

// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());

// other config
...
View Code

3、代碼的自動生成。AutoGenerator是MP的代碼生成器,通過調用AutoGenerator,進行相應的模板、策略配置可以快速生成Entity、Mapper、Mapper XML、Service、Controller各個模塊的代碼。

4. MP將通用的CRUD操作封裝進BaseMapper接口,而自動生成的Mapper接口便自動繼承了BaseMapper接口。復雜的Sql操作,則可以使用QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper)進行動態Sql拼接。

5、此外,MP還支持分頁、邏輯刪除、通用枚舉、Sql注入等功能,在:https://mp.baomidou.com/guide/generator.html

  還有性能分析插件:https://mp.baomidou.com/guide/performance-analysis-plugin.html

與MBG不同,使用Mybatis-Plus自動生成代碼需要編寫代碼,通過調用AutoAutoGenerator類實現代碼生成,從這方面來說不如使用插件方便。但是它豐富的功能以及只是相對復雜的配置還是使它領先於MBG以及通用Mapper。

 

 

 

 

 

 

 

 

雙方都


免責聲明!

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



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