Mybatis-Plus實(shí)體類注解方法與mapper層和service層的CRUD方法
1 注解
1.1 @TableName
??之前在入門案例中我們分析過:使用mp底層方法生成的SQL語句中,表名為mapper或者service接口傳入的泛型首字母小寫,表中字段名為泛型類的封裝屬性,如果表名與泛型名不對(duì)應(yīng)的話,這個(gè)時(shí)候就需要在實(shí)體類上使用@TableName注解來修改實(shí)體類綁定的表
@TableName("對(duì)應(yīng)的表名")
??有些時(shí)候我們會(huì)將一個(gè)項(xiàng)目所用的所有表在命名上使用一個(gè)公共前綴,使用配置文件設(shè)置之后就會(huì)在所有的實(shí)體類所對(duì)應(yīng)的的表名上拼接該前綴
mybatis-plus:
global-config:
db-config:
table-prefix: 表名的公共前綴
1.2 @TableId
??mp中會(huì)默認(rèn)將實(shí)體類中命名為id的屬性作為主鍵與表的id主鍵相對(duì)應(yīng),但是如果實(shí)體類屬性與表中的主鍵命名一致但不是id而是cid或者uid等的話,就會(huì)因?yàn)檎也坏街麈I而無法實(shí)現(xiàn)功能報(bào)錯(cuò)。于是就需要在實(shí)體類的屬性上使用@TableId注解標(biāo)注該屬性對(duì)應(yīng)的表中字段為該表的主鍵
@TableId
??現(xiàn)在有這么一個(gè)情況,如果實(shí)體類中的屬性與表中主鍵不一樣的話,就該在實(shí)體類的屬性上使用@TableId注解的value屬性將兩者對(duì)應(yīng)起來
@TableId(value = "該屬性在表中對(duì)應(yīng)的字段名")
??通過上一篇博客對(duì)mapper接口的insert方法測(cè)試發(fā)現(xiàn),通過insert方法插入的記錄,如果不設(shè)置id主鍵值的情況下,mp默認(rèn)使用雪花算法(下面有拓展)生成一個(gè)id號(hào)插入到表中。如果想要將生成的id設(shè)置成根據(jù)表中主鍵值進(jìn)行自增插入的話,首先應(yīng)該將表中的主鍵字段設(shè)置成自增,然后將實(shí)體類的屬性上使用@TableId注解的value屬性設(shè)置
@TableId(type = IdType.AUTO)
??除了使用注解單個(gè)設(shè)置實(shí)體類的主鍵生成策略之外,還可以通過配置文件設(shè)置所有實(shí)體類的主鍵生成策略
mybatis-plus:
global-config:
db-config:
id-type: auto
雪花算法
雪花算法是由Twitter公布的分布式主鍵生成算法,它能夠保證不同表主鍵的不重復(fù)性,以及相同表主鍵的有序性。通過雪花算法生成的id長度共64bit(一個(gè)long型)。
- 最高1bit是符號(hào)位正0負(fù)1,id一般是正數(shù)
- 41bit時(shí)間截(毫秒級(jí))
- 10bit作為機(jī)器的ID
- 12bit作為毫秒內(nèi)的流水號(hào)
優(yōu)點(diǎn):整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生ID碰撞,并且效率較高
1.3 @TableField
??mp會(huì)默認(rèn)將表中的字段名里的下劃線轉(zhuǎn)換成駝峰命名,也就是將實(shí)體類中的userName屬性與數(shù)據(jù)庫中的user_name字段相對(duì)應(yīng)。主鍵不對(duì)應(yīng)的話使用@TableId注解,普通字段對(duì)應(yīng)不上的話,就可以在實(shí)體類的屬性上使用@TableField注解
@TableField("表中對(duì)應(yīng)的字段名")
1.4 @TableLogic
??@TableLogic注解就是設(shè)置字段為偽刪除,也就是在執(zhí)行刪除方法的時(shí)候?qū)⒃撟侄螌?duì)應(yīng)的值設(shè)置為1,再查詢記錄時(shí)不顯示該字段為1的記錄。 首先應(yīng)該在數(shù)據(jù)庫的表中創(chuàng)建一個(gè)字段用來標(biāo)記是否刪除(默認(rèn)值為0即不刪除),實(shí)體類創(chuàng)建相應(yīng)的屬性上用注解標(biāo)注:
@TableLogic private Integer isDeleted;
使用@TableLogic注解之后,所有的刪除操作都是偽刪除,就是將標(biāo)記字段的值改為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=0 int result = mapper.deleteBatchIds(list); System.out.println("受影響的行數(shù): " + result); }
查詢的時(shí)候會(huì)加入一個(gè)判斷條件,就是標(biāo)記字段的值要是0才顯示
@Test public void selectListTest() { // SELECT cid AS uid,name,age,email,is_deleted FROM user WHERE is_deleted=0 List<User> users = mapper.selectList(null); users.forEach(System.out::println); }
??在MP中mapper和service定義了很多的CRUD方法,可以像使用常見類API的方式直接調(diào)用使用,這些方法有很多按照方法參數(shù)的不同主要分為兩大類,一種參數(shù)是wrapper放在下一章中進(jìn)行講解,另一種是接下來講解的參數(shù)不是wrapper的方法
2 mapper層的CRUD方法
??mapper層接口繼承BaseMapper接口并傳入需要操作的實(shí)體類泛型
// spring框架創(chuàng)建mapper接口相對(duì)應(yīng)的接口實(shí)現(xiàn)類 @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("受影響的行數(shù) " + result); }
主鍵id不設(shè)置的話默認(rèn)使用雪花算法生成
2.2 刪(delete)
根據(jù)主鍵刪除單條記錄(deleteById)
@Test public void deleteByIdTest() { // DELETE FROM user WHERE id=? int result = mapper.deleteById(1502966571370401793L); System.out.println("受影響的行數(shù): " + result); }
根據(jù)主鍵刪除多條記錄(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("受影響的行數(shù): " + 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("受影響的行數(shù): " + result); }
2.3 改(update)
根據(jù)主鍵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("受影響的行數(shù): " + result); }
2.4 查(select)
根據(jù)主鍵id查找一條記錄(selectById)
@Test public void selectTest() { // SELECT id,name,age,email FROM user WHERE id=? User user = mapper.selectById(4L); System.out.println("查詢結(jié)果為:" + user); }
根據(jù)主鍵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("查詢結(jié)果為:"); 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("查詢結(jié)果為:"); users.forEach(System.out::println); }
查詢表中所有的記錄(selectList)
@Test public void selectListTest() { // SELECT id,name,age,email FROM user List<User> users = mapper.selectList(null); users.forEach(System.out::println); }
mapper層增刪改查方法中的小知識(shí)點(diǎn)
??所有的增刪改方法返回值都是受影響的行(記錄)數(shù)
??以上都是單表的簡單增刪改查操作,如果這些功能無法滿足你的需求,可以自定義SQL。可以在默認(rèn)的路徑(resources文件夾下的mapper文件夾)下創(chuàng)建mapper映射文件,或者在別的地方創(chuàng)建映射文件使用配置文件指定(mybatis-plus.mapper-locations),其他的操作和mybatis一樣(接口方法、映射文件、調(diào)用方法)
3 service層的CRUD方法
??service層接口繼承IService接口并傳入需要操作的實(shí)體類泛型
public interface UserService extends IService<User> { }
??service接口的實(shí)現(xiàn)類除了實(shí)現(xiàn)接口之外,還要繼承ServiceImpl類并傳入傳泛型(mapper層接口,實(shí)體類),這樣做的好處是還可以在實(shí)現(xiàn)類里實(shí)現(xiàn)自定義業(yè)務(wù)方法
@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
第二個(gè)方法既可以用于批量添加還可以皮力量更新,判斷是批量添加還是更新的依據(jù)是:看傳入的列表中實(shí)體類對(duì)象是否設(shè)置了id屬性或者說這個(gè)id值在表中是否存在,如果設(shè)置了id且id在表中存在的話就是批量更新,如果不設(shè)置id屬性或者表中沒有這個(gè)字段值的話就是批量添加。簡而言之,有則改無則添
// 批量修改(因?yàn)閡ser對(duì)象設(shè)置的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 查詢表中總記錄數(shù)
@Test public void getCountTest() { // SELECT COUNT( * ) FROM user long count = userService.count(); System.out.println(count); }
到此這篇關(guān)于Mybatis-Plus實(shí)體類注解方法與mapper層和service層的CRUD方法的文章就介紹到這了,更多相關(guān)Mybatis-Plus CRUD方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)
- MyBatis-Plus?實(shí)體類注解的實(shí)現(xiàn)示例
- Mybatis-Plus實(shí)體類繼承Model的使用小結(jié)
- MyBatis-Plus動(dòng)態(tài)返回實(shí)體類示例詳解
- Mybatis-plus如何提前獲取實(shí)體類用雪花算法生成的ID
- mybatis-plus實(shí)體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法
- 詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫中字段名不對(duì)應(yīng)解決辦法
- MyBatis-Plus ORM數(shù)據(jù)庫和實(shí)體類映射方式
相關(guān)文章
IDEA JarEditor編輯jar包方式(直接新增,修改,刪除jar包內(nèi)的class文件)
文章主要介紹了如何使用IDEA的JarEditor插件直接修改jar包內(nèi)的class文件,而不需要手動(dòng)解壓、反編譯和重新打包,通過該插件,可以更方便地進(jìn)行jar包的修改和測(cè)試2025-01-01mybatis-plus?執(zhí)行insert(),實(shí)體的id自動(dòng)更新問題
這篇文章主要介紹了mybatis-plus?執(zhí)行insert(),實(shí)體的id自動(dòng)更新問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java數(shù)據(jù)結(jié)構(gòu)之最小堆和最大堆的原理及實(shí)現(xiàn)詳解
在計(jì)算機(jī)科學(xué)中,堆(heap)?的實(shí)現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結(jié)構(gòu),它可以在數(shù)組上構(gòu)建出樹的結(jié)構(gòu)體,并滿足堆的屬性。本文就來和大家詳細(xì)聊聊Java數(shù)據(jù)結(jié)構(gòu)中的堆,感興趣的可以了解一下2022-09-09Java面向?qū)ο蠡A(chǔ)知識(shí)之封裝,繼承,多態(tài)和抽象
這篇文章主要介紹了Java面向?qū)ο蟮姆庋b,繼承,多態(tài)和抽象,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11java關(guān)于并發(fā)模型中的兩種鎖知識(shí)點(diǎn)詳解
在本篇文章了小編給大家整理的是一篇關(guān)于java關(guān)于并發(fā)模型中的兩種鎖知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-04-04