天天看點

MybatisPlus+mbg(代碼生成器)

MybatisPlus+mbg(代碼自動生成器)

簡介

​ 非官方推出,而是别人開發出來的,對mybatis的加強工具(盡量不要和mybatis同時導入,避免沖突),侵入性小,自動注入了 CRUD,于jpa較為相似的。

特性

  1. 無侵入:隻做增強不做改變,引入它不會對現有工程産生影響,如絲般順滑
  2. 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  3. 強大的 CRUD 操作:内置通用 Mapper、通用 Service,僅僅通過少量配置即可實作單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  4. 支援 Lambda 形式調用:通過 Lambda 表達式,友善的編寫各類查詢條件,無需再擔心字段寫錯
  5. 支援主鍵自動生成:支援多達 4 種主鍵政策(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
  6. 支援 ActiveRecord 模式:支援 ActiveRecord 形式調用,實體類隻需繼承 Model 類即可進行強大的 CRUD 操作
  7. 支援自定義全局通用操作:支援全局通用方法注入( Write once, use anywhere )
  8. 内置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支援模闆引擎,更有超多自定義配置等您來使用
  9. 内置分頁插件:基于 MyBatis 實體分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同于普通 List 查詢
  10. 分頁插件支援多種資料庫:支援 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種資料庫
  11. 内置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
  12. 内置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作

日志配置

#日志輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
           

主鍵生成政策

public enum IdType {
    /**
     * 資料庫ID自增
     */
    AUTO(0),
    /**
     * 該類型為未設定主鍵類型
     */
    NONE(1),
    /**
     * 使用者輸入ID
     * 該類型可以通過自己注冊自動填充插件進行填充
     */
    INPUT(2),

    /* 以下3種類型、隻有當插入對象ID 為空,才自動填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字元串全局唯一ID (idWorker 的字元串表示)
     */
    ID_WORKER_STR(5);

    private int key;

    IdType(int key) {
        this.key = key;
    }
}
           

雪花算法

分布式Long 類型id生成算法(全球唯一,一般用來生成訂單号等….)

建立&更新時間

直接在資料庫聲明:

在代碼級别的聲明(需自定義處理器來處理):

@TableField(fill = FieldFill.INSERT)  //使用該類注解是需要手動編寫處理器來處理
 Date createTime;
 @TableField(fill = FieldFill.INSERT_UPDATE) //使用該類注解是需要手動編寫處理器來處理
 Date updateTime;
           
MybatisPlus+mbg(代碼生成器)

樂觀鎖(CAS)

概念:每次不加鎖,假設沒有沖突而去完成某項操作;如果發生沖突了那就去重試,直到成功為止。

ABA問題

當一個線程去修改一個v為A的變量,将其修改為B後又修改回A,另一個線程将預期的V和後來的V對比相同,則CSA成功,但是v是被人修改過的

解決辦法:

​ 為字段增加一個version字段,來儲存版本,每次修改時會修改該version

自編譯元件:

@Configuration
public class MyConfig {

    @Bean
    public OptimisticLockerInterceptor OptimisticLockerInterceptor() {

        return new OptimisticLockerInterceptor();

    }

}
           

分頁插件(自帶)

@Bean
    public PaginationInterceptor PaginationInterceptor() {
        return new PaginationInterceptor();
    }
    
    ====================================================
     //分頁工具測試
    @Test
    void testPageHelper() {
        //分頁
        Page<User> page = new Page<>(1,5);
        userMapper.selectPage(page, null);
        page.getRecords().forEach(System.out::println);
        System.out.println("總頁數:"+page.getTotal());
    }
           

邏輯删除(資源回收筒)

概念:不直接去删除,而是用一個變量的值來代表是否被删除

基本使用過程:

  1. 編寫元件
    //邏輯删除
        @Bean
        public ISqlInjector LogicSqlInjector() {
            return new LogicSqlInjector();
        }
               
  2. 添加注解邏輯删除pojo屬性
    @TableLogic
    private int deleted;//邏輯删除
    
               
  3. 配置檔案配置邏輯删除的值
    #邏輯删除設定
    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
               

性能分析插件

功能:可以通過限制一些sql的執行時間和格式化sql語句

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-uHeX3wNA-1626420484571)(C:\Users\liuguangcheng\AppData\Roaming\Typora\typora-user-images\image-20210616204321065.png)]

//性能分析插件
    @Bean
    @Profile("dev") //必須配置環境
    public PerformanceInterceptor PerformanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setFormat(true);
        performanceInterceptor.setMaxTime(5);
        return performanceInterceptor;
    }
           

條件構造器

作用:自動注入的CRUD隻能滿足小部分需求,大部分的複雜(單表)sql還是得通過條件構造器來編寫

建議:多表查詢需手動編寫sql和mapper檔案

用例:

//wrapper構造器
    @Test
    void testWrapper(){
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("name","lgc");
        List list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }
           

代碼生成器

依賴導入:

<!--代碼生成器的必要引擎-->
        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
           

編寫一個main方法配置并執行删除器的代碼:

public class CodeGenerator {
    public static void main(String[] args) {
        // 1、建立代碼生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        //String projectPath = System.getProperty("user.dir");
        gc.setOutputDir("D:\\Idea_workspace\\guli_parent\\service\\service-edu" + "/src/main/java");
        gc.setAuthor("l");
        gc.setOpen(false); //生成後是否打開資料總管
        gc.setFileOverride(false); //重新生成時檔案是否覆寫
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER_STR); //主鍵政策
        gc.setDateType(DateType.ONLY_DATE);//定義生成的實體類中日期類型
        gc.setSwagger2(true);//開啟Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、資料源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost/guli?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        //包:com.atguigu.eduservice
        pc.setParent("com.lll");
        pc.setModuleName("eduservice"); //子產品名

        //包:com.atguigu.eduservice.controller
        pc.setController("controller");
        //包:com.atguigu.eduservice.entity
        pc.setEntity("entity");
        //包:com.atguigu.eduservice.service
        pc.setService("service");
        //包:com.atguigu.eduservice.mapper
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、政策配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("teacher");//對應資料庫表名
        strategy.setNaming(NamingStrategy.underline_to_camel);//資料庫表映射到實體的命名政策
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成實體時去掉表字首

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//資料庫表字段映射到實體的命名政策
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鍊式操作

        strategy.setRestControllerStyle(true); //restful api風格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉連字元

        mpg.setStrategy(strategy);


        // 6、執行
        mpg.execute();

    }
}