柚子快報激活碼778899分享:MyBatis Plus
柚子快報激活碼778899分享:MyBatis Plus
MyBatis-Plus (簡稱 MP)是一個 MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。 MybatisPlus 可以節(jié)省大量時間,所有的 CRUD (增查改刪)代碼都可以自動化完成 如何使用? 1.先建一個表用來練習(xí)
????????2.引入依賴
//數(shù)據(jù)庫驅(qū)動
//lombok,打印日志,通過注解簡化實體類的get/set等方法
//盡量不要同時導(dǎo)入mybatis和mybatis-plus,可能存在版本的差異
????????3.在對應(yīng)的Mapper上面繼承基本的類 BaseMapper
@Mapper
public interface UserMapper extends BaseMapper
// 所有的CRUD操作都已經(jīng)編寫完成了
// 不需要像以前的配置一大堆文件了!
}
????????BaseMapper里面提供了很多方法供我們使用
public interface BaseMapper
int insert(T var1);
int deleteById(Serializable var1);
int updateById(@Param("et") T var1);
T selectById(Serializable var1);
}
????????4.創(chuàng)建User實體類
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
private Integer deleted;
private Integer version;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
5.在啟動類上加上注解 @MapperScan("com.example.mapper") 掃描mapper文件夾
通過以上步驟,mp配置基本完成。
時間自動填充
在常用業(yè)務(wù)中有些屬性需要配置一些默認(rèn)值,MyBatis-Plus 提供了實現(xiàn)此功能的插件,也就是自動填充功能。 比如創(chuàng)建時間、修改時間這些操作一般都是自動化完成的,是不用去手動更新的。這里本人整理了五種時間填充的方式,供各位參考。
①設(shè)置數(shù)據(jù)庫,update_time勾選根據(jù)當(dāng)前時間戳更新,create_time不勾選(不推薦)
②手動更新,不設(shè)置時間屬性,在sql語句中獲取時間
@Test
public void insert(){
User user=new User();
user.setEmail("23135545@qq.com");
user.setName("張三");
user.setAge(20);
userService.save(user);
}
insert into mybatis_plus.user
(name, age, email, create_time, update_time)
values(#{name},#{age},#{email},now(),now())//或者換成LOCALTIMESTAMP、LOCALTIMESTAMP()
//LOCALTIMESTAMP and LOCALTIMESTAMP() are synonyms for NOW().
③手動更新,先設(shè)置時間屬性
@Test
public void insert(){
User user=new User();
user.setEmail("23135545@qq.com");
user.setName("張三");
user.setAge(20);
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userService.save(user);
}
insert into mybatis_plus.user
(name, age, email, create_time, update_time)
values(#{name},#{age},#{email},#{createTime},#{updateTime})
④自動更新,使用MybatisPlus注解
1.實體類字段屬性上需要增加注解
//字段添加填充內(nèi)容
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
2、編寫處理器來處理這個注解
@Slf4j
@Component//一定不要把處理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入時的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
}
//更新時的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
}
}
3.代碼測試
@Test
void testInsert(){
User user =new User();
user.setName("張三");
user.setAge(3);
user.setEmail("231256486@qq.com");
userMapper.insert(user);
}
4.測試結(jié)果
⑤使用AOP切面編程,來完成公共字段自動填充功能。
代碼后續(xù)補(bǔ)上
樂觀鎖
樂觀鎖是一種并發(fā)控制策略,用于解決并發(fā)情況下的數(shù)據(jù)一致性問題,操作數(shù)據(jù)時不會對操作的數(shù)據(jù)進(jìn)行加鎖(這使得多個任務(wù)可以并行的對數(shù)據(jù)進(jìn)行操作),只有到數(shù)據(jù)提交的時候才通過一種機(jī)制來驗證數(shù)據(jù)是否存在沖突(一般實現(xiàn)方式是通過加版本號然后進(jìn)行版本號的對比方式實現(xiàn));
1.編寫配置類注冊樂觀鎖插件
@Configuration//配置類
public class MyBatisPlusConfig {
//注冊樂觀鎖插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
2.在User實體類的versoion屬性添加注解
@Version//樂觀鎖Version注解
private Integer version;
3.代碼測試
@Test
public void testOptimisticLocker2(){
//線程1
User user = userMapper.selectById(1L);
user.setName("hyc111");
user.setEmail("11111111@qq.com");
//線程2
User user2 = userMapper.selectById(1L);
user2.setName("hyc222");
user2.setEmail("22222222@qq.com");
userMapper.updateById(user);
userMapper.updateById(user2);//如果沒有樂觀鎖,就會覆蓋第一個線程的值
}
4.測試結(jié)果:線程一執(zhí)行成功,線程二執(zhí)行失敗
5.查看sql語句
//取出記錄時,獲取當(dāng)前 version
//更新時,帶上這個version
//執(zhí)行更新時, set version = version+1 where version = oldVersion
//如果version不對,就更新失敗
//線程一sql語句,率先完成,這時version=2,會導(dǎo)致線程二修改失敗
UPDATE
user
SET
name='hyc111',
age=18,
email='11111111@qq.com',
version=2,
create_time='2024-01-04 10:46:36.0',
update_time='2024-01-24 13:06:20.338226'
WHERE
id=1
AND version=1
//線程二sql語句
UPDATE
user
SET
name='hyc222',
age=18,
email='22222222@qq.com',
version=2,
create_time='2024-01-04 10:46:36.0',
update_time='2024-01-24 13:06:20.3472'
WHERE
id=1
AND version=1
這里要注意,要先從數(shù)據(jù)庫查詢記錄,再去更新這條記錄的屬性,不能先設(shè)置屬性再去更新
邏輯刪除
物理刪除 :從數(shù)據(jù)庫中直接移除這條記錄
邏輯刪除 :在數(shù)據(jù)庫中沒有被移除,而是通過一個變量來讓他失效,deleted = 0 變成 deleted = 1
1.編寫配置類邏輯刪除插件
public class MyBatisPlusConfig {
//注冊樂觀鎖插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
//邏輯刪除組件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
}
2.在application.properties文件中添加配置屬性
//邏輯刪除配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
3.在User實體類的deleted屬性添加注解
@TableLogic //邏輯刪除注解
private Integer deleted;
4.代碼測試
//測試刪除
@Test
public void testDeleteById(){
userMapper.deleteById(4L);
}
5.測試結(jié)果
6.查看sql語句,可以看到執(zhí)行的是update語句,而不是delete語句
UPDATE ? ? ? ? user? ? ? SET ? ? ? ? deleted=1? ? ? WHERE ? ? ? ? id=4? ? ? ? ? AND deleted=0
7.去查看所有用戶
@Test
void selectAll() {
//參數(shù)是一個wrapper,條件構(gòu)造器,這里我們先不用 null
//查詢?nèi)坑脩?/p>
List
users.forEach(System.out::println);
}
可以看到控制臺輸出三條用戶記錄
8.查看執(zhí)行的sql語句,發(fā)現(xiàn)查詢的時候會自動增加一個條件delete=0
SELECT ? ? id, ? ? name, ? ? age, ? ? email, ? ? deleted, ? ? version, ? ? create_time, ? ? update_time? FROM ? ? user? WHERE ? ? deleted=0
總結(jié)
使用MybatisPlus非常方便, 可以節(jié)省大量時間,個人感覺可以配合自定義mapper方法,編寫mapper.xml文件一起開發(fā)使用。
柚子快報激活碼778899分享:MyBatis Plus
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。