問題背景
因為mybatis plus非常的流行稳诚,雖然平常mybatis generator也夠用了,但多會一個盾饮,看別人的代碼就輕松一點
注意事項:
- 官方網(wǎng)站:https://baomidou.com/
- 官方文檔:https://baomidou.com/pages/24112f/
- 可以自己創(chuàng)建工程采桃,也可以下載源碼進行參考
-
MyBatis-Plus在實現(xiàn)插入數(shù)據(jù)時,會默認基于雪花算法的策略生成id丘损,實體類entity屬性都使用對象普办,使用Long,不能使用long徘钥,不然雪花算法會失效
Mybatis-plus無介紹快使用衔蹲,CRUD增刪改查基本使用附源碼(一)
Mybatis-plus無介紹快使用,自定義sql語句CRUD增刪改查附源碼(二)
Mybatis-plus無介紹快使用呈础,自帶封裝service層的使用附源碼(三)
Mybatis-plus無介紹快使用舆驶,注解的使用(四)
Mybatis-plus無介紹快使用,Wrapper條件構(gòu)造器的使用附源碼(五)
Mybatis-plus無介紹快使用而钞,分頁插件和樂觀鎖插件的使用附源碼(六)
Mybatis-plus無介紹快使用沙廉,枚舉變量的使用附源碼(七)
Mybatis-plus無介紹快使用,多數(shù)據(jù)源的使用(八)
Mybatis-plus無介紹快使用臼节,MybatisX自動生成代碼插件的使用(九)
Mybatis-plus無介紹快使用撬陵,可繼承通用的基礎(chǔ)實體類(十)
注解的使用
MyBatis-Plus提供的注解可以幫我們解決一些數(shù)據(jù)庫與實體之間相互映射的問題。
1.@TableName
經(jīng)過以上的測試网缝,在使用MyBatis-Plus實現(xiàn)基本的CRUD時巨税,我們并沒有指定要操作的表,只是在Mapper接口繼承BaseMapper時粉臊,設(shè)置了泛型User草添,而操作的表為user表,由此得出結(jié)論扼仲,MyBatis-Plus在確定操作的表時远寸,由BaseMapper的泛型決定,即實體類型決定屠凶,且默認操作的表名和實體類型的類名一致驰后。
1.1 引出問題
若實體類類型的類名和要操作的表的表名不一致,會出現(xiàn)什么問題阅畴?
- 我們將表
user
更名為t_user
倡怎,測試查詢功能
- 程序拋出異常迅耘,Table 'mybatis_plus.user' doesn't exist贱枣,因為現(xiàn)在的表名為
t_user
监署,而默認操作的表名和實體類型的類名一致,即user
表
1.2 解決問題
a纽哥、使用注解解決問題
在實體類類型上添加
@TableName("t_user")
钠乏,標(biāo)識實體類對應(yīng)的表,即可成功執(zhí)行SQL語句
@Data
@TableName("t_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
b春塌、使用全局配置解決問題
在開發(fā)的過程中晓避,我們經(jīng)常遇到以上的問題,即實體類所對應(yīng)的表都有固定的前綴只壳,例如
t_
或tbl_
此時俏拱,可以使用MyBatis-Plus提供的全局配置,為實體類所對應(yīng)的表名設(shè)置默認的前綴吼句,那么就不需要在每個實體類上通過@TableName標(biāo)識實體類對應(yīng)的表
mybatis-plus:
global-config:
db-config:
# 設(shè)置實體類所對應(yīng)的表的統(tǒng)一前綴
table-prefix: t_
2.@TableId
經(jīng)過以上的測試锅必,MyBatis-Plus在實現(xiàn)CRUD時,會默認將id作為主鍵列惕艳,并在插入數(shù)據(jù)時搞隐,默認基于雪花算法的策略生成id
2.1 引出問題
若實體類和表中表示主鍵的不是id,而是其他字段远搪,例如uid劣纲,MyBatis-Plus會自動識別uid為主鍵列嗎?
- 我們實體類中的屬性
id
改為uid
谁鳍,將表中的字段id
也改為uid
癞季,測試添加功能
- 程序拋出異常,Field 'uid' doesn't have a default value棠耕,說明MyBatis-Plus沒有將
uid
作為主鍵賦值
2.2 解決問題
在實體類中uid屬性上通過
@TableId
將其標(biāo)識為主鍵余佛,即可成功執(zhí)行SQL語句
@Date
public class User {
@TableId
private Long uid;
private String name;
private Integer age;
private String email;
}
2.3 @TableId的value屬性
若實體類中主鍵對應(yīng)的屬性為id,而表中表示主鍵的字段為uid窍荧,此時若只在屬性id上添加注解@TableId辉巡,則拋出異常Unknown column 'id' in 'field list',即MyBatis-Plus仍然會將id作為表的主鍵操作蕊退,而表中表示主鍵的是字段uid此時需要通過@TableId注解的value屬性郊楣,指定表中的主鍵字段,
@TableId("uid")
或@TableId(value="uid")
2.4 @TableId的type屬性
type屬性用來定義主鍵策略:默認雪花算法
常用的主鍵策略:
值 | 描述 |
---|---|
IdType.ASSIGN_ID(默認) | 基于雪花算法的策略生成數(shù)據(jù)id瓤荔,與數(shù)據(jù)庫id是否設(shè)置自增無關(guān) |
IdType.AUTO | 使用數(shù)據(jù)庫的自增策略净蚤,注意,該類型請確保數(shù)據(jù)庫設(shè)置了id自增输硝, |
配置全局主鍵策略:
#MyBatis-Plus相關(guān)配置
mybatis-plus:
configuration:
#配置日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
#配置mp的主鍵策略為自增
id-type: auto
# 設(shè)置實體類所對應(yīng)的表的統(tǒng)一前綴
table-prefix: t_
或者java
@TableId(type = IdType.AUTO)
private Long id;
3.@TbaleField
經(jīng)過以上的測試今瀑,我們可以發(fā)現(xiàn),MyBatis-Plus在執(zhí)行SQL語句時,要保證實體類中的屬性名和表中的字段名一致
如果實體類中的屬性名和字段名不一致的情況橘荠,會出現(xiàn)什么問題呢屿附?
3.1 情況一
若實體類中的屬性使用的是駝峰命名風(fēng)格,而表中的字段使用的是下劃線命名風(fēng)格
例如實體類屬性userName
哥童,表中字段user_name
此時MyBatis-Plus會自動將下劃線命名風(fēng)格轉(zhuǎn)化為駝峰命名風(fēng)格
相當(dāng)于在MyBatis中配置
3.2 情況二
若實體類中的屬性和表中的字段不滿足情況1
例如實體類屬性name
挺份,表中字段username
此時需要在實體類屬性上使用@TableField("username")
設(shè)置屬性所對應(yīng)的字段名
public class User {
@TableId("uid")
private Long id;
@TableField("username")
private String name;
private Integer age;
private String email;
}
4.@TableLogic
4.1 邏輯刪除
物理刪除:真實刪除,將對應(yīng)數(shù)據(jù)從數(shù)據(jù)庫中刪除贮懈,之后查詢不到此條被刪除的數(shù)據(jù)
邏輯刪除:假刪除匀泊,將對應(yīng)數(shù)據(jù)中代表是否被刪除字段的狀態(tài)修改為“被刪除狀態(tài)”,之后在數(shù)據(jù)庫中仍舊能看到此條數(shù)據(jù)記錄
使用場景:可以進行數(shù)據(jù)恢復(fù)
4.2 實現(xiàn)邏輯刪除
- 數(shù)據(jù)庫中創(chuàng)建邏輯刪除狀態(tài)列朵你,設(shè)置默認值為0
- 實體類中添加邏輯刪除屬性
- 測試刪除功能各聘,真正執(zhí)行的是修改
public void testDeleteById(){
int result = userMapper.deleteById(1527472864163348482L);
System.out.println(result > 0 ? "刪除成功!" : "刪除失斅找健伦吠!");
System.out.println("受影響的行數(shù)為:" + result);
}
![](https://upload-images.jianshu.io/upload_images/24315796-95474be8e478a010.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 此時執(zhí)行查詢方法,查詢的結(jié)果為自動添加條件
is_deleted=0
作為程序員第 152 篇文章魂拦,每次寫一句歌詞記錄一下毛仪,看看人生有幾首歌的時間,wahahaha ...