mybatis-Plus 實踐篇之逆向工程


@

初次聽說mybatis-plus感覺這東西取名字都很有意思,像極了現在的iPhone 到iPhone xplus;不得不說水果公司真的引領了很多的“潮流”啊;
最近公司的一個新的項目,用的也是mybatis-plus,但是用的感覺不是那么好,所有就有了這篇實踐!其實了解了也就和JPA差不多,廢話不多說我們開始吧!

概念

Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生.
其實要我說,最大的亮點就是它的逆向工程和去mapper.xml了,但是也僅是針對單表,多表還是需要mapper.xml的,后面我們都會給出示例。

官網:MyBatis-Plus

特性:

  • 無侵入: 只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑

  • 損耗小: 啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作

  • 強大的 CRUD 操作: 內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求. 繼承一個類就好了!

  • 支持 Lambda 形式調用: 通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯

  • 支持主鍵自動生成: 支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配 置,完美解決主鍵問題

  • 支持 ActiveRecord 模式: 支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大 的 CRUD 操作

  • 支持自定義全局通用操作: 支持全局通用方法注入( Write once, use anywhere )

  • 內置代碼生成器 (pojo、dao、xml、service、.....):采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來 使用

  • 內置分頁插件: 基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之后,寫分頁等同 於普通 List 查詢
    分頁插件

  • 支持多種數據庫: 支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、 Postgre、SQLServer 等多種數據庫

  • 內置性能分析插件: 可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢 查詢

  • 內置全局攔截插件: 提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤 操作

新建Spring項目,引入依賴

 <!--導入 對應的依賴 這里用3.0.5 官網上最新的是一個臨時版temp的-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- 模板引擎 記得加上不然后面自動生成代碼會報錯-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.0</version>
</dependency>
<!--swagger 依賴 記得要加上,不然后面自動生成實體代碼注解會爆紅-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.9.6</version>
</dependency>

提一下:spring 2.0x都是配置的mysql8的驅動,8.0以上的驅動需要配置數據庫時區!

另外,注意官網上的這句話:

yaml配置

spring:
  application:
    name: test-mbp
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mp_study?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: 123456

配完這些記得啟動一下項目,看看是否有問題,及時處理掉報錯!

配置代碼生成器

package com.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

public class TestCodeGenerator {
    public static void main(String[] args) {
        // 模塊名
        String moduleName = "study";

        // 代碼生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 獲取當前項目根路徑
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath+"/src/main/java");
        gc.setAuthor("Echo");
        gc.setOpen(false); //不打開生產的文件
        gc.setFileOverride(false); //不覆蓋之前生成的文件
        gc.setServiceName("%Service");
        gc.setIdType(IdType.AUTO);// 主鍵策略 自增  注意要和數據庫中表實際情況對應
        gc.setDateType(DateType.ONLY_DATE);
        gc.setSwagger2(true);//自動開啟swagger2的支持
        mpg.setGlobalConfig(gc);

        // 數據源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUrl("jdbc:mysql://localhost:3306/mp_study?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(moduleName);
        pc.setParent("com.demo");
        pc.setController("controller");
        pc.setService("service");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // strategy.setInclude("t_user");
        //可以用同配符號:表示生成t_開頭的對應庫下所有表
        strategy.setInclude("t"+"_\\w*");
        strategy.setNaming(NamingStrategy.underline_to_camel);// 下划線轉駝峰
        strategy.setTablePrefix("t_");//去掉t_這個前綴后生成類名
        strategy.setEntityLombokModel(true);// 自動生成lombok注解  記住要有lombok依賴和對應的插件哈
        strategy.setLogicDeleteFieldName("is_deleted");//設置邏輯刪除字段 要和數據庫中表對應哈

        // 設置創建時間和更新時間自動填充策略
        TableFill created_date = new TableFill("created_date", FieldFill.INSERT);
        TableFill updated_date = new TableFill("updated_date", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(created_date);
        tableFills.add(updated_date);
        strategy.setTableFillList(tableFills);

        // 樂觀鎖策略
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(true);//采用restful 風格的api
        strategy.setControllerMappingHyphenStyle(true); // controller 請求地址采用下划線代替駝峰
        mpg.setStrategy(strategy);

        // 執行
        mpg.execute();
    }
}

當然代碼生成器中寫死的東西我們可以封裝下,便於后面項目多的時候調用!或者項目中可以集成這些配置項到ui中,所有的東西都有實施人員來配置,調用接口直接生成到對應的基礎框架代碼中就好了!
題外話:bootdo 之前有用過,基礎框架搭好后就是前端選擇表和創建菜單后,可以基於表生成對應的基礎的前后端的代碼!

運行驗證


可以看到在我們的包下生成來對應的各種包,這里我只建了t_user這一張表來演示;注意代碼生成器里的邏輯都是基於表的配置來寫的,要保持一致不然會報錯!

驗證swagger

啟動驗證一下

呃呃呃,沒掃描到mapper包,那我們去加一個包掃描即可!
@MapperScan("com.demo.study.mapper")

我們去看對應的mapper 發現沒有@Mapper注解,說明這東西還有點沒完善哈,按理說其他的層的注解你都生成了,mapper注解沒生成有點那啥了,哈哈!
注意加上@EnableSwagger2 上面寫的邏輯中開啟了Swagger的注解,它只是針對生成的代碼的,啟動類上還是得自己加!
另外記得加上咱們之前Swagger食用詳解 中對應swagger的配置哈。其實mybatis-plus 如果再好使一點,這些東西都應該能幫我們處理好的!

小結:好了,mp的逆向工程使用說明就先說到這兒,接下來mp的crud操作,統一接口返回和異常封裝准備再寫一篇示例,加油!


免責聲明!

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



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