寫在前面
🛫更多知識總結見Mybatis-Plus專欄
🚕內容總結自尚硅谷楊博超老師的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀
文章目錄
- 1 注解
- 1.1 @TableName
- 1.2 @TableId
- 1.3 @TableField
- 1.4 @TableLogic
- 2 mapper層的CRUD方法
- 2.1 增(insert)
- 2.2 刪(delete)
- 2.3 改(update)
- 2.4 查(select)
- 3 service層的CRUD方法
- 3.1 批量添加或者更新
- 3.2 查詢表中總記錄數
1 注解
1.1 @TableName
??之前在入門案例中我們分析過:使用mp底層方法生成的SQL語句中,表名為mapper或者service接口傳入的泛型首字母小寫,表中字段名為泛型類的封裝屬性,如果表名與泛型名不對應的話,這個時候就需要在實體類上使用@TableName注解來修改實體類綁定的表
@TableName("對應的表名")
??有些時候我們會將一個項目所用的所有表在命名上使用一個公共前綴,使用配置文件設置之后就會在所有的實體類所對應的的表名上拼接該前綴
mybatis-plus:global-config:db-config:table-prefix: 表名的公共前綴
1.2 @TableId
??mp中會默認將實體類中命名為id的屬性作為主鍵與表的id主鍵相對應,但是如果實體類屬性與表中的主鍵命名一致但不是id而是cid或者uid等的話,就會因為找不到主鍵而無法實現功能報錯。于是就需要在實體類的屬性上使用@TableId注解標注該屬性對應的表中字段為該表的主鍵
@TableId
??現在有這么一個情況,如果實體類中的屬性與表中主鍵不一樣的話,就該在實體類的屬性上使用@TableId注解的value屬性將兩者對應起來
@TableId(value = "該屬性在表中對應的字段名")
??通過上一篇博客對mapper接口的insert方法測試發現,通過insert方法插入的記錄,如果不設置id主鍵值的情況下,mp默認使用雪花算法(下面有拓展)生成一個id號插入到表中。如果想要將生成的id設置成根據表中主鍵值進行自增插入的話,首先應該將表中的主鍵字段設置成自增,然后將實體類的屬性上使用@TableId注解的value屬性設置
@TableId(type = IdType.AUTO)
??除了使用注解單個設置實體類的主鍵生成策略之外,還可以通過配置文件設置所有實體類的主鍵生成策略
mybatis-plus:global-config:db-config:id-type: auto
雪花算法
??雪花算法是由Twitter公布的分布式主鍵生成算法,它能夠保證不同表主鍵的不重復性,以及相同表主鍵的有序性。通過雪花算法生成的id長度共64bit(一個long型)。
- 最高1bit是符號位正0負1,id一般是正數
- 41bit時間截(毫秒級)
- 10bit作為機器的ID
- 12bit作為毫秒內的流水號
優點:整體上按照時間自增排序,并且整個分布式系統內不會產生ID碰撞,并且效率較高
1.3 @TableField
??mp會默認將表中的字段名里的下劃線轉換成駝峰命名,也就是將實體類中的userName屬性與數據庫中的user_name字段相對應。主鍵不對應的話使用@TableId注解,普通字段對應不上的話,就可以在實體類的屬性上使用@TableField注解
@TableField("表中對應的字段名")
1.4 @TableLogic
??@TableLogic注解就是設置字段為偽刪除,也就是在執行刪除方法的時候將該字段對應的值設置為1,再查詢記錄時不顯示該字段為1的記錄。
??首先應該在數據庫的表中創建一個字段用來標記是否刪除(默認值為0即不刪除),實體類創建相應的屬性上用注解標注:
@TableLogic
private Integer isDeleted;
使用@TableLogic注解之后,所有的刪除操作都是偽刪除,就是將標記字段的值改為1
@Test
public void deleteBatchIdsTest() {List<Long> list = Arrays.asList(26L, 27L, 28L);// UPDATE user SET is_deleted=1 WHERE cid IN ( ? , ? , ? ) AND is_deleted=0int result = mapper.deleteBatchIds(list);System.out.println("受影響的行數: " + result);
}
查詢的時候會加入一個判斷條件,就是標記字段的值要是0才顯示
@Test
public void selectListTest() {// SELECT cid AS uid,name,age,email,is_deleted FROM user WHERE is_deleted=0List<User> users = mapper.selectList(null);users.forEach(System.out::println);
}
??在MP中mapper和service定義了很多的CRUD方法,可以像使用常見類API的方式直接調用使用,這些方法有很多按照方法參數的不同主要分為兩大類,一種參數是wrapper放在下一章中進行講解,另一種是接下來講解的參數不是wrapper的方法
2 mapper層的CRUD方法
??mapper層接口繼承BaseMapper接口并傳入需要操作的實體類泛型
// spring框架創建mapper接口相對應的接口實現類
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2.1 增(insert)
@Test public void insertTest() {User user = new User();user.setName("張三");user.setAge(20);// sql語句:INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )int result = mapper.insert(user);System.out.println("受影響的行數 " + result); }
主鍵id不設置的話默認使用雪花算法生成
2.2 刪(delete)
根據主鍵刪除單條記錄(deleteById)
@Test public void deleteByIdTest() {// DELETE FROM user WHERE id=?int result = mapper.deleteById(1502966571370401793L);System.out.println("受影響的行數: " + result); }
根據主鍵刪除多條記錄(deleteBatchIds)
@Test public void deleteBatchIdsTest() {List<Long> list = Arrays.asList(1L, 2L, 3L);// DELETE FROM user WHERE id IN ( ? , ? , ? )int result = mapper.deleteBatchIds(list);System.out.println("受影響的行數: " + result); }
多條件刪除(deleteByMap)
@Test public void deleteByMapTest() {HashMap<String, Object> map = new HashMap<>();map.put("name", "張三");map.put("age", 23);// DELETE FROM user WHERE name = ? AND age = ?int result = mapper.deleteByMap(map);System.out.println("受影響的行數: " + result); }
2.3 改(update)
根據主鍵id修改(updateById)
@Test public void updateByIdTest() {User user = new User();user.setId(4L);user.setName("張三");user.setAge(20);// UPDATE user SET name=?, age=? WHERE id=?int result = mapper.updateById(user);System.out.println("受影響的行數: " + result); }
2.4 查(select)
根據主鍵id查找一條記錄(selectById)
@Test public void selectTest() {// SELECT id,name,age,email FROM user WHERE id=?User user = mapper.selectById(4L);System.out.println("查詢結果為:" + user); }
根據主鍵id查找多條記錄(selectBatchIds)
@Test public void selectByBatchIdsTest() {List<Long> list = Arrays.asList(4L, 5L);// SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )List<User> users = mapper.selectBatchIds(list);System.out.print("查詢結果為:");users.forEach(System.out::println); }
多條件查詢(selectByMap)
@Test public void selectByMapTest() {HashMap<String, Object> map = new HashMap<>();map.put("name", "張三");map.put("age", 20);// SELECT id,name,age,email FROM user WHERE name = ? AND age = ?List<User> users = mapper.selectByMap(map);System.out.print("查詢結果為:");users.forEach(System.out::println); }
查詢表中所有的記錄(selectList)
@Test public void selectListTest() {// SELECT id,name,age,email FROM userList<User> users = mapper.selectList(null);users.forEach(System.out::println); }
mapper層增刪改查方法中的小知識點
??所有的增刪改方法返回值都是受影響的行(記錄)數
??以上都是單表的簡單增刪改查操作,如果這些功能無法滿足你的需求,可以自定義SQL。可以在默認的路徑(resources文件夾下的mapper文件夾)下創建mapper映射文件,或者在別的地方創建映射文件使用配置文件指定(mybatis-plus.mapper-locations),其他的操作和mybatis一樣(接口方法、映射文件、調用方法)
3 service層的CRUD方法
??service層接口繼承IService接口并傳入需要操作的實體類泛型
public interface UserService extends IService<User> {
}
??service接口的實現類除了實現接口之外,還要繼承ServiceImpl類并傳入傳泛型(mapper層接口,實體類),這樣做的好處是還可以在實現類里實現自定義業務方法
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
3.1 批量添加或者更新
批量添加saveBatch
@Test
public void saveBatchTest() {// INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setName("tom" + i);user.setAge(20 + i);list.add(user);}boolean b = userService.saveBatch(list);System.out.println(b);
}
批量添加或者更新saveOrUpdateBatch
??第二個方法既可以用于批量添加還可以皮力量更新,判斷是批量添加還是更新的依據是:看傳入的列表中實體類對象是否設置了id屬性或者說這個id值在表中是否存在,如果設置了id且id在表中存在的話就是批量更新,如果不設置id屬性或者表中沒有這個字段值的話就是批量添加。簡而言之,有則改無則添
// 批量修改(因為user對象設置的id屬性在表中存在)
@Test
public void saveOrUpdateBatchTest() {// UPDATE user SET name=?, age=? WHERE id=?List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(10L + i);user.setName("jack" + i);user.setAge(20 + i);list.add(user);}boolean b = userService.saveOrUpdateBatch(list);System.out.println(b);
}
3.2 查詢表中總記錄數
@Test
public void getCountTest() {// SELECT COUNT( * ) FROM userlong count = userService.count();System.out.println(count);
}
這篇博客參加了幾何大佬的社區活動
還望大家多多支持幾何大佬的社區
??????????????????
CSDN社區 《創作達人》活動,只要參與其中并創作文章就有機會獲得官方獎品:精品日歷、新程序員雜志,快來參與吧!鏈接直達 https://bbs.csdn.net/topics/605272551