狂神說---MyBatisPlus學習

2022-01-06 12:00:02

MyBatisPlus學習

MyBatisPlus官網教學
嗶哩嗶哩《狂神說》學習網站

MyBatisPlus快速入門

1.新建mybatis_plus資料庫

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)
);

2.新增資料進表

INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

在這裡插入圖片描述

3.新建springboot專案(mybatis_plus)

編寫專案,初始化專案!使用springboot初始化!

4…匯入依賴

<!--資料庫驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

在這裡插入圖片描述

5.連線資料庫 application.xml

是否使用安全連線:useSSL=false

#  mysql5 驅動不同 com.mysql.jdbc.Driver
#  mysql8 驅動不同 com.mysql.cj.jdbc.Driver  serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=UTF-8&&useSSL=false&serverTimezone=GMT%2B8&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456

5.傳統的Pojo-dao(連線mybatis,設定mapper.xml檔案)-service-controller

6.用mybatis-plus後(pojo-mapper介面-使用)

Pojo:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

}

Mapper:
//在對應的mapper上繼承基本的類 ---BaseMapper
@Repository//表示是持久層   dao層的 mapper
public interface UserMapper extends BaseMapper<User>{
    //在繼承BaseMapper之後,所有的CRUD操作已經編寫完成
}

注意點:主啟動類MybatisPlusApplication 新增掃描包

@MapperScan("com.hh.mapper") //掃描包
@SpringBootApplication
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

使用(測試類)
@SpringBootTest
class MybatisPlusApplicationTests {
    @Autowired//遠端注入  繼承了BaseMapper,所有的方法都來自於父類別
    private UserMapper userMapper;
    @Test
    void contextLoads() {
        //引數 wrapper ,條件構造器
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }
}
演示結果:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

7.紀錄檔設定

#設定紀錄檔 方便在開發的時候看到查詢語句是怎麼執行的,在運營階段可以關閉紀錄檔,提高效率 
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl



演示結果:
Preparing: SELECT id,name,age,email FROM user 

CRUD 擴充套件

插入

@Test
void testinsert() {
    User user = new User();
    user.setName("哈哈學mybatis_plus");
    user.setAge(10);
    user.setEmail("2843722413@qq.com");
    int result = userMapper.insert(user);//id 自動生成了
    System.out.println(result);//受影響行數
    System.out.println(user);//發現,id會自動回填
}

在這裡插入圖片描述
資料庫插入的id的預設值為:全域性的唯一id
主鍵生成策略

//預設ID_WORKER全域性唯一ID
@TableId(type = IdType.ID_WORKER)

分散式系統唯一id生成方法彙總

雪花演演算法:snowflake是Twitter開源的分散式ID生成演演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。具體實現的程式碼可以參看 https://github.com/twitter/snowflake。雪花演演算法支援的TPS可以達到419萬左右(2^22*1000)。
雪花演演算法在工程實現上有單機版本和分散式版本。單機版本如下,分散式版本可以參看美團leaf演演算法:https://github.com/Meituan-Dianping/Leaf

主鍵自增
1.實體類上:@TableId(type = IdType.AUTO)
2.資料庫欄位一定要設定為自增

在這裡插入圖片描述
測試:
檢視自增量
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述其餘的原始碼解釋:

public enum IdType {
    AUTO(0),//資料庫ID自增
    
    NONE(1),//未設定主鍵INPUT(2),//手動輸入
    ID_WORKER(3),//預設的全域性唯一ID 
    UUID(4),//全域性唯一ID UUID
    ID_WORKER_STR(5);// 字串表示法
 }

一般手動就必須設定id,注意:此時的資料庫欄位不能設定為自增

@TableId(type = IdType.INPUT)

user.setId(7L);

修改

//測試修改
@Test
void testUpdate() {
    User user = new User();
//通過條件自動拼接動態SQL
    user.setId(6L);
    user.setName("哈哈學mybatis_plus2");
    user.setAge(20);
    user.setEmail("2843722413@qq.com");

    int i = userMapper.updateById(user);
    System.out.println(i);
}

在這裡插入圖片描述

自動填充

在這裡插入圖片描述
方式一:資料庫級別(不建議使用)
1.在表新增欄位 create_time ,update_time
在這裡插入圖片描述
2.在此測試更新,需要先把實體類同步

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    //ID_WORKER 全域性唯一ID ;AUTO:自增
    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

3.測試

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired//遠端注入  繼承了BaseMapper,所有的方法都來自於父類別
    private UserMapper userMapper;

    @Test
    public void contextLoads() {
        //引數 wrapper ,條件構造器
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

    //測試新增(插入)
    @Test
    public void testInsert(){
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設定日期格式
        User user = new User();
        user.setId(6L);
        user.setName("狂神");
        user.setAge(16);
        user.setEmail("2843722413@qq.com");
//        user.setCreateTime(simpleDateFormat.format(new Date()));
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        int result =  userMapper.insert(user);
        System.out.println(result);//受影響行數
        System.out.println(user);//發現,id會自動回填
    }
    
    //測試修改
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(6L);
        user.setName("關注狂神說");
        user.setAge(18);
		//這裡注意:並沒有設定修改的時間,起作用的是資料庫勾選的更新

        //注意:updateById 但是引數是一個物件
        int i= userMapper.updateById(user);
        System.out.println(i);
    }
}

演示結果
在這裡插入圖片描述

方式二:程式碼級別
1.刪除資料庫的預設值,更新操作
在這裡插入圖片描述
2.實體類欄位屬性上需要增加註解

 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    //ID_WORKER 全域性唯一ID ;AUTO:自增【資料庫記得id要設定自增!!!】
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //欄位新增填充內容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    private Date createTime;
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    private Date updateTime;
}

3.編寫處理器來處理這個註解

package com.hh.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 insertFill ......");
        // setFieldValByName(String fieldName【實體類欄位】, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    //更新時的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start updateFill ......");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

4.測試插入和修改


    //測試新增(插入)
    @Test
    public void testInsert(){
        User user = new User();
        user.setName("哈哈學mybatis-plus");
        user.setAge(8);
        user.setEmail("2843722413@qq.com");
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        int result =  userMapper.insert(user);
        System.out.println(result);//受影響行數
        System.out.println(user);//發現,id會自動回填
    }

    //測試修改
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(7L);
        user.setName("五哈");
        user.setAge(18);
        //注意:updateById 但是引數是一個物件
        int i= userMapper.updateById(user);
        System.out.println(i);
    }

插入演示:
在這裡插入圖片描述
修改演示:
在這裡插入圖片描述

樂觀鎖處理

在這裡插入圖片描述
樂觀鎖學習
樂觀鎖實現方式:
取出記錄時,獲取當前 version
更新時,帶上這個 version
執行更新時, set version = newVersion where version = oldVersion
如果 version 不對,就更新失敗
在這裡插入圖片描述
測試一下Mybatis_plus【MP】的樂觀鎖外掛
1.給資料庫新增 version 欄位
在這裡插入圖片描述
在這裡插入圖片描述
2.同步實體類欄位

@Version //樂觀鎖註解
private Integer version;

3.註冊元件
主啟動類可以把掃描包的工作交給config

//@MapperScan("com.hh.mapper") //掃描包
@SpringBootApplication
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

元件

@MapperScan("com.hh.mapper") //掃描包
@EnableTransactionManagement//自動管理事務註解
@Configuration//設定類
public class MyBatisPlusConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
    
}

4.測試

//測試樂觀鎖--成功
    @Test
    public void testOptimisticLocker(){
        //1.查詢使用者資訊   2.修改使用者資訊 3.執行更新操作
        User user = userMapper.selectById(1L);
        user.setName("hhhhhhhh");
        user.setEmail("86412858545@qq.com");
        userMapper.updateById(user);
    }
    
 //測試樂觀鎖--失敗 【多執行緒下】
    @Test
    public void testOptimisticLocker2(){
        //1.查詢使用者資訊   2.修改使用者資訊 3.執行更新操作
        //執行緒1
        User user1 = userMapper.selectById(1L);
        user1.setName("執行緒1");
        user1.setEmail("86412858545@qq.com");
        //執行緒2(模擬插隊操作)
        User user2 = userMapper.selectById(1L);
        user2.setName("執行緒2");
        user2.setEmail("86412858545@qq.com");
        userMapper.updateById(user2);
        //如果沒有樂觀鎖就會覆蓋插隊執行緒的值
        userMapper.updateById(user1);
    }

在這裡插入圖片描述
在這裡插入圖片描述

多執行緒:
在這裡插入圖片描述

查詢操作

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

 //測試批次查詢
    @Test
    public void selectByBatchId(){
     //引數 wrapper ,條件構造器
     List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
     users.forEach(System.out::println);
     }

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

 //按條件查詢之一-----map操作
    @Test
    public void selectByBatchIds(){
        HashMap<String, Object> map = new HashMap<>();

        //自定義要查詢
        map.put("name","關注狂伸說");
        map.put("age",18);

        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

在這裡插入圖片描述

分頁查詢

在這裡插入圖片描述
如何使用?
分頁程式碼官網參考
1.設定攔截器元件即可 ( 在MyBatisPlusConfig設定類中新增)

// 分頁------舊版  
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
    
 // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }

2.直接使用page物件即可
在這裡插入圖片描述
在這裡插入圖片描述

//測試分頁查詢
    @Test
    public void testPage(){
        //current:當前頁;size:頁面大小(頁面條數)
        Page<User> page = new Page<>(1,5);
        userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);
        System.out.println(page.getTotal());
    }

刪除操作

   @Test
    public void deleteById(){
        userMapper.deleteById(7L);
    }
    //刪除----通過id批次刪除資料
    @Test
    public void deleteBatchId(){
        userMapper.deleteBatchIds(Arrays.asList(6L,5L));
    }
    //刪除----通過map刪除資料
    @Test
    public void deleteMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","關注狂神說"); //自定義要刪除的資料
        userMapper.deleteByMap(map);
    }

在這裡插入圖片描述

邏輯刪除

區別:物理刪除是真正的刪除,再也找不到這個檔案了。
邏輯刪除並沒有真正的刪除掉,可以重新恢復,類似於回收站,還可以再找回資料

物理刪除:真實刪除。將對應資料從資料庫中刪除,之後查詢不到此條被刪除資料;
邏輯刪除:假刪除。在資料庫中沒有被移除,而是通過改變一個變數來讓它失效!!!!
例如:delete=0;delete=1
管理員可以檢視被刪除的資料,防止資料的丟失

測試一下:
1.資料庫新增欄位 deleted(邏輯刪除)
在這裡插入圖片描述
2.實體類同步資料(實體類欄位上加上@TableLogic註解)

    @TableLogic //邏輯刪除
    private Integer deleted;

3.在MyBatisPlusConfig設定類新增元件 ,注入bean

    //邏輯刪除元件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

4.在application.properties裡面設定邏輯刪除的設定(或者用application.yml)
邏輯刪除官網參考

#  application.properties
#邏輯刪除 (0-沒有被刪除,1-刪除)
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

#   application.yml
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)

5.測試
在這裡插入圖片描述
在這裡插入圖片描述

效能分析外掛

效能分析外掛參考部落格
作用:效能分析攔截器,用於輸出每條sql語句及其執行的時間
mybatis-plus(MP)也提供了效能分析外掛,如果超過之歌時間就停止執行

1.匯入外掛

 //效能分析外掛——————sql執行效率外掛
    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // 在工作中,不允許使用者等待  (分別測試 1ms:1毫秒    1000ms:1秒)
        performanceInterceptor.setMaxTime(1000); // ms 設定sql執行的最大s時間,如果超過了則不執行
        performanceInterceptor.setFormat(true); // 是否進行格式化
        return new PerformanceInterceptor();
    }

注意:要在springboot中設定環境為dev環境或者test環境

#設定開發的環境  application.properties或者 application.yml
spring.profiles.active=dev

2.測試使用
在這裡插入圖片描述
在這裡插入圖片描述

條件查詢器Wrapper

條件查詢器Wrapper
測試類

package com.hh;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hh.mapper.UserMapper;
import com.hh.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.Map;

/*
條件查詢器--Wrapper--測試類
 */
@SpringBootTest
public class WrapperTest {

    @Autowired//遠端注入  繼承了BaseMapper,所有的方法都來自於父類別
    private UserMapper userMapper;

    //查詢name、email不為空,且年齡》=12的使用者
    @Test
    void contextLoads() {
        //引數 wrapper ,條件構造器
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.isNotNull("name").isNotNull("email").ge("age","12");
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

    //查詢名字「五哈"
    @Test
    public void test2(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","五哈");
        User user = userMapper.selectOne(wrapper);//查詢一個資料用 selectOne,多個用list 或map
        System.out.println(user);
    }

    //查詢年齡在20-30之間的
    @Test
    public void test3(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",20,30);
        Integer count = userMapper.selectCount(wrapper);
        System.out.println(count);
    }

    //模糊查詢(名字不包含e ,郵箱以 t 開頭的)
    @Test
    public void test4(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //likeRight(t%)  以 t 開頭的
        // likeLeft(%t)  以 t 結尾的
        wrapper.notLike("name","e").likeRight("email","t");//SELECT id,name,age,email,version,deleted,create_time,update_time FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?
        List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
        maps.forEach(System.out::println);
    }


    //巢狀查詢(可以插入自己寫的SQL語句)
    @Test
    public void test5(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.inSql("id","select id from user where id<3");
        List<Object> objects = userMapper.selectObjs(wrapper);
        objects.forEach(System.out::println);
    }

    //排序---通年齡進行排序(升序 :orderByAsc() ;降序 :orderByDesc())
    @Test
    public void test6(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("age");  
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }

}

測試一:
在這裡插入圖片描述
測試二:
在這裡插入圖片描述
後面的測試自己試驗看結果

程式碼自動生成器

程式碼生成器(舊)
程式碼生成器(新)

AutoGenerator 是 MyBatis-Plus 的程式碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模組的程式碼,極大的提升了開發效率。
準備條件 :1.pom.xml設定包、2.application.properties設定、3.MyBatisPlusConfig設定類,4.自備資料庫 然後就可以進行測試了
pom.xml

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hh</groupId>
    <artifactId>hh-community</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hh-community</name>
    <description>何何學程式碼生成器</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--檔案上傳 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.48</version>
        </dependency>
        <!--mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!--velocity模板引擎,mybatis-plus程式碼生成器需要 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--swagger2  -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--<configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>-->
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <!-- 解決在 src/test/java/MyTest.java 用main執行報錯問題 -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <classpathScope>test</classpathScope>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

#伺服器埠 檢視埠是否被佔用 netstat -aon|findstr "9000"
server.port=9000
spring.profiles.active=dev
#禁用模板快取
spring.thymeleaf.cache=false

#資料庫連線設定
#  mysql5 驅動不同 com.mysql.jdbc.Driver
#  mysql8 驅動不同 com.mysql.cj.jdbc.Driver  serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&&useSSL=false&serverTimezone=GMT%2B8&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456

#設定紀錄檔 方便在開發的時候看到查詢語句是怎麼執行的,在運營階段可以關閉紀錄檔,提高效率
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#邏輯刪除 (0-沒有被刪除,1-刪除)
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

設定類MyBatisPlusConfig

package com.hh.config;


import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@MapperScan("com.hh.mapper") //掃描包
@EnableTransactionManagement//自動管理事務註解
@Configuration//設定類
public class MyBatisPlusConfig {

    //註冊樂觀鎖外掛
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
    // 分頁------舊版  https://baomidou.com/pages/8f40ae/
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    //邏輯刪除元件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

    //效能分析外掛——————sql執行效率外掛
    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // 在工作中,不允許使用者等待  (分別測試 1ms:1毫秒    1000ms:1秒)
        performanceInterceptor.setMaxTime(1000); // ms 設定sql執行的最大s時間,如果超過了則不執行
        performanceInterceptor.setFormat(true); // 是否進行格式化
        return new PerformanceInterceptor();
    }
}

在這裡插入圖片描述

package com.hh;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
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 HhCode {

    public static void main(String[] args) {
        // 程式碼生成器
        AutoGenerator mpg = new AutoGenerator();

        //設定策略
        // 1.全域性設定
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//獲取當前使用者的目錄(當前專案的目錄)
        gc.setOutputDir(projectPath + "/src/main/java");//程式碼生成放置的位置
        gc.setAuthor("hh");//作者
        gc.setOpen(false);//是否開啟資源管理器(是否開啟window資料夾)
        gc.setFileOverride(false);//是否覆蓋之前生成的
        gc.setServiceName("%sService");//去service的I字首
        gc.setIdType(IdType.ID_WORKER);//預設策略ID_WORKER 全域性唯一ID       ;AUTO:自增
        gc.setDateType(DateType.ONLY_DATE);//日期
        // gc.setSwagger2(true); //是否用Swagger2檔案     實體屬性 Swagger2 註解
        mpg.setGlobalConfig(gc);

        // 2.資料來源設定
        DataSourceConfig dsc = new DataSourceConfig();
        //jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&&useSSL=false&serverTimezone=GMT%2B8&useUnicode=true");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");//  mysql5: dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 3.包設定
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("blog");// pc.setModuleName(scanner("模組名"));
        pc.setParent("com.hh");//"com.baomidou.ant"
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        // 4. 策略設定
        StrategyConfig strategy = new StrategyConfig();
//        strategy.setInclude("user");//對映表名 ****************`user``blog``student``teacher`**********************
        strategy.setInclude("blog","student","teacher");//對映表名  例如:user:使用者表
        strategy.setNaming(NamingStrategy.underline_to_camel);//包命名-- 下劃線轉駝峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列名-- 下劃線轉駝峰命名
        strategy.setEntityLombokModel(true);//自動lombok
        //邏輯刪除 deleted
        strategy.setLogicDeleteFieldName("deleted");

        //自動填充設定  (例如:建立時間和修改時間)
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);

        //樂觀鎖  version
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(true); //開啟 restfull的駝峰命名規則
        strategy.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2
        mpg.setStrategy(strategy);

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

在這裡插入圖片描述
Mybatis-Plus的使用小技巧,高階面試題+解析
MyBatis、Mybatis Plus(面試常問)