1. 程式人生 > 實用技巧 >Mybatis-Plus 3.4.1學習

Mybatis-Plus 3.4.1學習

目錄

MybatisPlus

需要的基礎:spring,mybatis,springmvc

為什麼要學習

MybatisPlus可以節省我們大量工作時間,所有的CRUD程式碼它都可以自動化完成

JPA,tk-mapper,MybatisPlus

偷懶的

簡介

官網:https://baomidou.com/

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。

特性

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

支援資料庫

  • mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、Firebird
  • Phoenix 、clickhouse 、Sybase ASE 、 OceanBase 、達夢資料庫 、虛谷資料庫 、人大金倉資料庫 、南大通用資料庫 、

快速入門

使用第三方元件:

  • 匯入對應的依賴
  • 研究依賴如何配置
  • 程式碼如何編寫
  • 提高擴充套件技術能力

步驟

  • 建立資料庫 mybatis_plus
  • 建立user表
DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主鍵ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年齡',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY (id)
);
——真實開發中,version(樂觀鎖),deleted(邏輯刪除),gmt_create、gmt_modified

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
  • 編寫專案,初始化專案!springboot

匯入依賴

<!--資料庫驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

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

說明:我們使用mybatis-plus可以節省我們大量的程式碼,儘量不要同時匯入mybatis和mybatis-plus,版本的差異

  • 配置資料庫連線

配置檔案

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useUnicode=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 傳統方式pojo-dao(連線mybatis,配置mapper.xml檔案)-service-controller

  • 使用了mybatis-plus之後

    • pojo
    package com.company.pojo;
    
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • mapper介面
    package com.company.mapper;
    
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.company.pojo.User;
    import org.springframework.stereotype.Repository;
    
    //在對應的Mapper上面繼承基本的類,BaseMapper
    @Repository  //代表持久層
    public interface UserMapper extends BaseMapper<User> {
    
        //所有的CRUD操作都已經編寫完成了
        //不需要像以前的配置一大堆檔案
    }
    

    啟動類加上註解@MapperScan

    package com.company;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    //掃描mapper資料夾
    @MapperScan("com.company.mapper")
    @SpringBootApplication
    public class MybatisPlusApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusApplication.class, args);
        }
    
    }
    
    • 使用,測試
    //繼承了BaseMapper,所有的方法都來自父類,我們也可以編寫自己的擴充套件方法
    @Autowired
    private UserMapper userMapper;
    
    @Test
    void contextLoads() {
    
        //引數是一個wrapper,條件構造器,這裡我們先不用,傳入null
        //查詢全部使用者
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }
    
  • 思考問題

    • SQL誰幫我們寫的,Mybatis-plus都寫好了
    • 方法哪裡來的,Mybatis-plus都寫好了
    • 技術沒有高低之分,只有使用技術的人有區別

配置日誌

所有的sql是不可見的,我們希望知道它是怎麼執行的,所以需要使用日誌

配置檔案增加 配置日誌

#配置日誌
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

配置完畢日誌之後,後面的學習就需要注意這個自動生成的SQL,就會喜歡上Mybatis-plus

CRUD擴充套件

insert插入

//測試插入
@Test
public void testInsert(){
    User user = new User();
    user.setName("小明的學習");
    user.setAge(3);
    user.setEmail("[email protected]");
    int result = userMapper.insert(user);   //幫我們自動生成id
    System.out.println(result);
    System.out.println(user);
}

資料庫插入的id的預設值為:全域性的唯一id

主鍵生成策略

對應資料庫中的主鍵(uuid,自增id,雪花演算法,redis,zookeeper)

分散式系統唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html

雪花演算法:

Twitter的snowflake演算法

snowflake是Twitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心:北京,上海。。,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。具體實現的程式碼可以參看https://github.com/twitter/snowflake。 可以保證幾乎全球唯一

資料庫裡的主鍵策略修改 @TableId

package com.company.pojo;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

IdType

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.baomidou.mybatisplus.annotation;

public enum IdType {
    AUTO(0),           //資料庫自增
    NONE(1),         //未設定主鍵
    INPUT(2),               //手動輸入
    ASSIGN_ID(3),                 //預設的全域性唯一id
    ASSIGN_UUID(4),               //全域性唯一id  uuid
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),             
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),
    /** @deprecated */
    @Deprecated
    UUID(4);

    private final int key;

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

    public int getKey() {
        return this.key;
    }
}

不同的主鍵策略測試

主鍵自增

配置主鍵自增

  • 實體類欄位上@TableId(type = IdType.AUTO)

  • 資料庫欄位一定要是自增, 資料庫欄位勾選自增

  • 再次測試插入即可

其他型別
 	AUTO(0),           //資料庫自增
    NONE(1),         //未設定主鍵
    INPUT(2),               //手動輸入
    ASSIGN_ID(3),                 //預設的全域性唯一id
    ASSIGN_UUID(4),               //全域性唯一id  uuid

一旦手動輸入id後,就需要自己設定id了

更新操作

//測試更新
@Test
public void testUpdate(){
    User user = new User();
    user.setId(1L);
    user.setName("小明");
    int i = userMapper.updateById(user);
    System.out.println(i);
}

updateById 引數是一個物件

通過條件自動拼接sql

所以的sql都是自動幫你動態配置的

自動填充

建立時間,修改時間,這些操作一般都是自動化完成的,我們不希望手動更新

阿里巴巴開發手冊:所以的資料庫表:gmt_create,gmt_modified幾乎所有的表都要配置上,並且需要自動化

方式一:資料庫級別(工作中不允許修改資料庫)

  • 在表中新增欄位,create_time,update_time

設定預設為CURRENT_TIMESTAMP

  • 再次測試插入方法,我們需要先把實體類同步

新增欄位

private Date createTime;
private Date updateTime;
//測試更新
@Test
public void testUpdate(){
    User user = new User();
    user.setId(1L);
    user.setName("小明");
    user.setAge(32);
    int i = userMapper.updateById(user);
    System.out.println(i);
}
  • 檢視結果,資料庫中已有自動更新時間

方式二:程式碼級別插入

  • 刪除資料庫的預設值,更新操作

  • 實體類欄位屬性上需要增加註解
//欄位新增填充內容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
  • 編寫處理器來處理這個註解即可
package com.company.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component  //一定不要把處理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {

    //插入時的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        
    }

    //更新時的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}
  • 測試,插入資料,更新資料,時間都有變化

樂觀鎖

樂觀鎖:總是認為不會出現問題,無論幹什麼,不去加鎖,如果出現問題,再次更新值測試

悲觀鎖:無論幹什麼,都去上鎖

樂觀鎖實現方式:

  • 取出記錄時,獲取當前version
  • 更新時,帶上這個version
  • 執行更新時,set version = newVersion where version = oldVersion
  • 如果version不對,就更新失敗

測試一下MP的樂觀鎖外掛

  • 給資料庫增加version欄位

  • 實體類加對應欄位,同步實體類,加上註解
@Version  //樂觀鎖version註解
private Integer version;
  • 註冊元件
package com.company.config;


import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

//掃描mapper資料夾
@MapperScan("com.company.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {

    //註冊樂觀鎖外掛
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

  • 測試,
//測試樂觀鎖成功
@Test
public void testOptimisticLocker(){
    //查詢使用者資訊
    User user = userMapper.selectById(1L);
    //修改使用者資訊
    user.setName("mie");
    user.setEmail("[email protected]");
    //執行更新操作
    userMapper.updateById(user);
}


//測試樂觀鎖失敗,多執行緒下
@Test
public void testOptimisticLocker2(){
    //執行緒1
    User user = userMapper.selectById(1L);
    //修改使用者資訊
    user.setName("11mie");
    user.setEmail("[email protected]");
    //模擬另外一個執行緒執行了插隊操作
    User user2 = userMapper.selectById(1L);
    //修改使用者資訊
    user2.setName("22mie");
    user2.setEmail("[email protected]");
    userMapper.updateById(user2);
    //可以使用自旋鎖來多次嘗試提交
    userMapper.updateById(user);//如果沒有樂觀鎖就會覆蓋插隊執行緒的值
}

查詢操作

//測試查詢
@Test
public void testSelectById(){
    User user = userMapper.selectById(1L);
    System.out.println(user);
}

//測試批量查詢
@Test
public void testSelectByBatchId(){
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    users.forEach(System.out::println);
}

//條件查詢之一  使用map操作
@Test
public void testSelectByBatchIds(){
    Map<String,Object> map = new HashMap<>();
    map.put("name","Tom");
    map.put("age","3");
    List<User> users = userMapper.selectByMap(map);
    users.forEach(System.out::println);
}

分頁查詢

分頁在網站使用的十分之多

原始的limit

pageHelper 第三方外掛

MP其實也內建了分頁外掛

  • 配置攔截器元件即可
//分頁外掛
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
    
}
  • 直接使用Page物件即可
//測試分頁查詢
@Test
public void testPage(){


    //引數一:當前頁
    //引數二:頁面大小
    //使用了分頁外掛之後,所有的分頁操作變的簡單
    Page<User> page = new Page<>(2,5);
    userMapper.selectPage(page, null);

    page.getRecords().forEach(System.out::println);
    System.out.println(page.getTotal());
}

刪除操作

//測試刪除
@Test
public void deleteById(){
    userMapper.deleteById(1330002742293676036L);
}

//通過id批量刪除
@Test
public void deleteBatchId(){
    userMapper.deleteBatchIds(Arrays.asList(1330002742293676034L,1330002742293676035L));
}

//通過Map刪除
@Test
public void deleteMap(){
    Map<String,Object> map = new HashMap<>();
    map.put("name","22mie");
    userMapper.deleteByMap(map);
}

邏輯刪除

物理刪除:從資料庫中直接移除

邏輯刪除:在資料庫中沒有被移除,而是通過變數來讓他失效,deleted=0 =>deleted=1

管理員可以檢視被刪除的記錄,防止資料的丟失,類似於回收站

測試一下:

  • 在資料表中增加一個deleted欄位

  • 實體類中增加屬性,同步實體類
@TableLogic  //邏輯刪除
private Integer deleted;
  • 配置
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag  # 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
      logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)
  • 測試
    //測試刪除
    @Test
    public void deleteById(){
        userMapper.deleteById(2L);
    }


日誌列印,其實走的時更新操作
JDBC Connection [HikariProxyConnection@1703358554 wrapping com.mysql.cj.jdbc.ConnectionImpl@abbe000] will not be managed by Spring
==>  Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 2(Long)
<==    Updates: 1
    
    記錄在,deleted變化了,但是查詢不到

查詢會自動過濾邏輯刪除的

效能分析外掛

平時的開發中,會遇到一些慢sql,測試,drud。。

MP也提供效能分析外掛,如果超過這個時間就停止執行

  • p6spy 依賴引入
application.yml <!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

  • application.yml 配置
spring:
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useUnicode=true
    username: root
    password: 123456
  • spy.properties 配置:
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日誌列印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日誌輸出到控制檯
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設定 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL字首
useprefix=true
# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實際驅動可多個
#driverlist=org.h2.Driver
# 是否開啟慢SQL記錄
outagedetection=true
# 慢SQL記錄標準 2 秒
outagedetectioninterval=2
  • 測試
//測試查詢
@Test
public void testSelectById(){
    User user = userMapper.selectById(2L);
    System.out.println(user);
}


結果
 Consume Time:36 ms 2020-11-21 15:55:14
 Execute SQL:SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE id=2 AND deleted=0

條件構造器wrapper

十分重要,wrapper

寫一些複雜的sql就可以使用它來替代

測試1 isNull

@Test
public void test(){
    //查詢name不為空的使用者,且郵箱不為空的使用者,年齡大於等於12的人
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.isNotNull("name")
            .isNotNull("email")
            .ge("age",12);
    userMapper.selectList(wrapper).forEach(System.out::println); //和map對比
}

測試2 eq

@Test
public void test2(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name","Tom");
    System.out.println(userMapper.selectOne(wrapper));   //查詢一個數據,出現多個結果使用list或者map
}

測試3 between

@Test
public void test3(){
    //查詢年齡在20~30之間的使用者
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.between("age",20,30);
    System.out.println(userMapper.selectCount(wrapper));   //查詢結果數
}

測試4 模糊查詢

//模糊查詢
@Test
public void test4(){
    //
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //左和右  t%
    wrapper.notLike("name","e")
            .likeRight("email","t");
    userMapper.selectMaps(wrapper).forEach(System.out::println);    //查詢結果數
}

記住檢視打印出的sql進行分析

測試5 子查詢

@Test
public void test5(){
    //
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //id在子查詢中查出來
    wrapper.inSql("id","select id from user where id<3")
            .notLike("name","e")
            .likeRight("email","t");
    userMapper.selectObjs(wrapper).forEach(System.out::println);    //查詢結果數
}

測試6 排序

@Test
public void test6(){
    //
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //通過id進行排序
    wrapper.orderByDesc("id");   //desc降序,asc升序
    userMapper.selectList(wrapper).forEach(System.out::println);    //查詢結果數
}

官網:https://baomidou.com/guide/wrapper.html 有更多的例子

程式碼自動生成器

dao,pojo,service,controller 都自動編寫完成

一般都是 新建專案,匯入mybatis-plu依賴,配置檔案,然後再程式碼自動生成

AutoGenerator 是 MyBatis-Plus 的程式碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模組的程式碼,極大的提升了開發效率。

使用教程

新增依賴

MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴:

  • 新增 程式碼生成器 依賴

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.4.1</version>
    </dependency>
    
  • 新增 模板引擎 依賴,MyBatis-Plus 支援 Velocity(預設)、Freemarker、Beetl,使用者可以選擇自己熟悉的模板引擎,如果都不滿足您的要求,可以採用自定義模板引擎。

    Velocity(預設):

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

    Freemarker:

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

    Beetl:

    <dependency>
        <groupId>com.ibeetl</groupId>
        <artifactId>beetl</artifactId>
        <version>3.2.4.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
    ...
    

編寫配置

MyBatis-Plus 的程式碼生成器提供了大量的自定義引數供使用者選擇,能夠滿足絕大部分人的使用需求。

  • 配置 GlobalConfig

     //全域性配置
            GlobalConfig globalConfig = new GlobalConfig();
            globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
            globalConfig.setAuthor("ming");
            globalConfig.setOpen(false);
            globalConfig.setFileOverride(false);//是否覆蓋
            globalConfig.setServiceName("%sService");//去service的I字首
            globalConfig.setIdType(IdType.ASSIGN_ID);
            globalConfig.setDateType(DateType.ONLY_DATE);
            globalConfig.setSwagger2(true);
            generator.setGlobalConfig(globalConfig);
    
  • 配置 DataSourceConfig

    //設定資料來源
            DataSourceConfig dataSourceConfig = new DataSourceConfig();
            dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
            dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
            dataSourceConfig.setUsername("root");
            dataSourceConfig.setPassword("123456");
            dataSourceConfig.setDbType(DbType.MYSQL);
            generator.setDataSource(dataSourceConfig);
    
  • 策略配置

//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user");  //設定要對映的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設定");
strategy.setEntityLombokModel(true);  //自動lombok

strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2

strategy.setLogicDeleteFieldName("deleted");

//自動填充配置
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);

ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);

//樂觀鎖
strategy.setVersionFieldName("version");

generator.setStrategy(strategy);
  • 總的配置
package com.company;


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 MingCode {

    public static void main(String[] args) {
        //構建一個程式碼生成器物件
        AutoGenerator generator = new AutoGenerator();


        //全域性配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
        globalConfig.setAuthor("ming");
        globalConfig.setOpen(false);
        globalConfig.setFileOverride(false);//是否覆蓋
        globalConfig.setServiceName("%sService");//去service的I字首
        globalConfig.setIdType(IdType.ASSIGN_ID);
        globalConfig.setDateType(DateType.ONLY_DATE);
        globalConfig.setSwagger2(true);
        generator.setGlobalConfig(globalConfig);


        //設定資料來源
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("123456");
        dataSourceConfig.setDbType(DbType.MYSQL);
        generator.setDataSource(dataSourceConfig);

        //包的配置

        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setModuleName("blog");
        packageConfig.setParent("com.company");
        packageConfig.setEntity("entity");
        packageConfig.setMapper("mapper");
        packageConfig.setService("service");
        packageConfig.setController("controller");
        generator.setPackageInfo(packageConfig);

        //策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user");  //設定要對映的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設定");
        strategy.setEntityLombokModel(true);  //自動lombok

        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2

        strategy.setLogicDeleteFieldName("deleted");

        //自動填充配置
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);

        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);

        //樂觀鎖
        strategy.setVersionFieldName("version");

        generator.setStrategy(strategy);

        generator.execute();
    }
}
  • 執行會swagger註解爆紅是因為沒有匯入依賴

  • <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0</version>
    </dependency>