目錄
- Insert 插入
- 新增測驗
- 主鍵生成策略
- 原始碼分析
- 雪花演算法 IdType.ID_WORKER
- 主鍵自增 IdType.AUTO
- 未設定主鍵型別 IdType.NONE
- 手動輸入 IdType.INPUT
- UUID IdType.UUID
- 雪花演算法的字串表示 IdType.ID_WORKER_STR
- Update 更新
- 更新測驗
- 自動填充
- 方式一:資料庫級別
- 方式二:代碼級別
- 欄位添加注解
- 撰寫處理器處理注解
- 測驗
- 樂觀鎖
- 樂觀鎖實作方式
- MybatisPlus樂觀鎖插件實作
- 資料庫表添加欄位version
- 物體類欄位添加@version注解
- 配置插件,注冊樂觀鎖組件
- 測驗樂觀鎖成功
- 測驗樂觀鎖失敗
- Select 查詢
- 分頁查詢
- MybatisPlus分頁插件實作
- 配置攔截器組件
- 使用Page物件
- Delete 洗掉
- 邏輯洗掉
- MybatisPlus實作邏輯洗掉
Insert 插入
新增測驗
package com.qing;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
User user = new User();
user.setName("張三豐");
user.setAge(999);
user.setEmail("[email protected]");
int rows = userMapper.insert(user);
System.out.println(rows);
System.out.println(user);
}
}

插入資料時,自動生成id
id自動回填到user物件
插入的id的默認值為:全域唯一id,是雪花演算法生成的id
主鍵生成策略
參考檔案:https://www.cnblogs.com/haoxinyue/p/5208136.html
原始碼分析
不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
}



雪花演算法 IdType.ID_WORKER
參考檔案:https://blog.csdn.net/lq18050010830/article/details/89845790
SnowFlake 演算法,是 Twitter 開源的分布式 id 生成演算法,其核心思想就是:使用一個 64 bit 的 long 型的數字作為全域唯一 id,在分布式系統中的應用十分廣泛,且ID 引入了時間戳,基本上保持自增的,
這 64 個 bit 中,其中 1 個 bit 是不用的,然后用其中的 41 bit 作為毫秒數,用 10 bit 作為作業機器 id,12 bit 作為序列號,
package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
}

主鍵自增 IdType.AUTO
資料庫主鍵必須設定為自增

package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}


未設定主鍵型別 IdType.NONE
暫時不確定,生成的主鍵為雪花演算法生成的
package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.NONE)
private Long id;
private String name;
private Integer age;
private String email;
}

手動輸入 IdType.INPUT
不手動設定主鍵時,如果資料庫主鍵沒有設定自增,插入的主鍵為null,會報錯
如果主鍵設定為自增,插入的主鍵是自增值
package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
private String email;
}

UUID IdType.UUID
package com.qing.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 {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.UUID)
private String id;
private String name;
private Integer age;
private String email;
}

雪花演算法的字串表示 IdType.ID_WORKER_STR
Update 更新
更新測驗
package com.qing;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testUpdate() {
User user = new User();
user.setId("1");
user.setName("張三豐");
user.setAge(9999);
user.setEmail("[email protected]");
int rows = userMapper.updateById(user);
System.out.println(rows);
}
}

自動填充
方式一:資料庫級別

方式二:代碼級別
使用說明:https://baomidou.com/pages/4c6bcf/
欄位添加注解
package com.qing.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.UUID)
private String 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;
}
撰寫處理器處理注解
package com.qing.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.time.LocalDateTime;
import java.util.Date;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入時的填充策略
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 更新時的填充策略
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
測驗
package com.qing;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
User user = new User();
user.setName("張三豐");
user.setAge(999);
user.setEmail("[email protected]");
int rows = userMapper.insert(user);
System.out.println(rows);
System.out.println(user);
}
}

樂觀鎖

使用說明:https://baomidou.com/pages/0d93c0/#optimisticlockerinnerinterceptor
樂觀鎖實作方式
- 取出記錄時,獲取當前 version
- 更新時,帶上這個 version
- 執行更新時, set version = newVersion where version = oldVersion
- 如果 version 不對,就更新失敗
舉例說明:
MybatisPlus樂觀鎖插件實作
資料庫表添加欄位version

物體類欄位添加@version注解

package com.qing.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// 不加注解,默認主機生成策略為IdType.ID_WORKER,即雪花演算法
@TableId(type = IdType.UUID)
private String 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;
@Version // 樂觀鎖version注解
private Integer version;
}
配置插件,注冊樂觀鎖組件


package com.qing.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;
@MapperScan("com.qing.mapper") // 掃描mapper包
@EnableTransactionManagement
@Configuration // 配置類
public class MybatisPlusConfig {
/**
* 注冊樂觀鎖插件
* @return
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
測驗樂觀鎖成功
package com.qing;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 測驗樂觀鎖成功
*/
@Test
public void testOptimisticLocker() {
User user = userMapper.selectById("1");
user.setName("張道陵");
int rows = userMapper.updateById(user);
System.out.println(rows);
}
}

測驗樂觀鎖失敗
package com.qing;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 測驗樂觀鎖失敗
*/
@Test
public void testOptimisticLocker2() {
// 執行緒1
User user = userMapper.selectById("1");
user.setName("張三豐1號");
// 模擬執行緒2
User user2 = userMapper.selectById("1");
user2.setName("張三豐2號");
int rows2 = userMapper.updateById(user2);
System.out.println("執行緒2執行行數:" + rows2);
int rows = userMapper.updateById(user);
System.out.println("執行緒1執行行數:" + rows);
}
}

version已經被執行緒2修改,所以執行緒1執行失敗
Select 查詢


分頁查詢
使用說明:https://baomidou.com/pages/97710a/

MybatisPlus分頁插件實作
配置攔截器組件
package com.qing.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("com.qing.mapper") // 掃描mapper包
@EnableTransactionManagement
@Configuration // 配置類
public class MybatisPlusConfig {
/**
* 注冊樂觀鎖插件
* @return
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
/**
* 注冊分頁插件
*/
@Bean
public PaginationInterceptor paginationInnerInterceptor() {
return new PaginationInterceptor();
}
}
使用Page物件
package com.qing;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qing.mapper.UserMapper;
import com.qing.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;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 測驗分頁查詢
*/
@Test
public void testPage() {
Page<User> page = new Page(1, 5);
System.out.println("查詢前:" + page.getRecords());
userMapper.selectPage(page, null);
System.out.println("查詢后:" + page.getRecords());
System.out.println("資料總數:" + page.getTotal());
}
}

Delete 洗掉



邏輯洗掉

作用:防止資料的丟失,類似于回收站
使用說明:https://baomidou.com/pages/6b03c5/

MybatisPlus實作邏輯洗掉








轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/433281.html
標籤:其他
上一篇:MyBatis入門配置
下一篇:java寶典筆記(一)
