最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus實(shí)體類(lèi)注解方法與mapper層和service層的CRUD方法

 更新時(shí)間:2022年03月21日 15:17:07   作者:扎哇太棗糕  
CRUD是指在做計(jì)算處理時(shí)的增加(Create)、讀取查詢(xún)(Retrieve)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡(jiǎn)寫(xiě)。主要被用在描述軟件系統(tǒng)中DataBase或者持久層的基本操作功能,下面讓我們一起看看吧

1 注解

1.1 @TableName

??之前在入門(mén)案例中我們分析過(guò):使用mp底層方法生成的SQL語(yǔ)句中,表名為mapper或者service接口傳入的泛型首字母小寫(xiě),表中字段名為泛型類(lèi)的封裝屬性,如果表名與泛型名不對(duì)應(yīng)的話,這個(gè)時(shí)候就需要在實(shí)體類(lèi)上使用@TableName注解來(lái)修改實(shí)體類(lèi)綁定的表

@TableName("對(duì)應(yīng)的表名")

??有些時(shí)候我們會(huì)將一個(gè)項(xiàng)目所用的所有表在命名上使用一個(gè)公共前綴,使用配置文件設(shè)置之后就會(huì)在所有的實(shí)體類(lèi)所對(duì)應(yīng)的的表名上拼接該前綴

mybatis-plus:
global-config:
db-config:
table-prefix: 表名的公共前綴

1.2 @TableId

??mp中會(huì)默認(rèn)將實(shí)體類(lèi)中命名為id的屬性作為主鍵與表的id主鍵相對(duì)應(yīng),但是如果實(shí)體類(lèi)屬性與表中的主鍵命名一致但不是id而是cid或者uid等的話,就會(huì)因?yàn)檎也坏街麈I而無(wú)法實(shí)現(xiàn)功能報(bào)錯(cuò)。于是就需要在實(shí)體類(lèi)的屬性上使用@TableId注解標(biāo)注該屬性對(duì)應(yīng)的表中字段為該表的主鍵

@TableId

??現(xiàn)在有這么一個(gè)情況,如果實(shí)體類(lèi)中的屬性與表中主鍵不一樣的話,就該在實(shí)體類(lèi)的屬性上使用@TableId注解的value屬性將兩者對(duì)應(yīng)起來(lái)

@TableId(value = "該屬性在表中對(duì)應(yīng)的字段名")

??通過(guò)上一篇博客對(duì)mapper接口的insert方法測(cè)試發(fā)現(xiàn),通過(guò)insert方法插入的記錄,如果不設(shè)置id主鍵值的情況下,mp默認(rèn)使用雪花算法(下面有拓展)生成一個(gè)id號(hào)插入到表中。如果想要將生成的id設(shè)置成根據(jù)表中主鍵值進(jìn)行自增插入的話,首先應(yīng)該將表中的主鍵字段設(shè)置成自增,然后將實(shí)體類(lèi)的屬性上使用@TableId注解的value屬性設(shè)置

@TableId(type = IdType.AUTO)

??除了使用注解單個(gè)設(shè)置實(shí)體類(lèi)的主鍵生成策略之外,還可以通過(guò)配置文件設(shè)置所有實(shí)體類(lèi)的主鍵生成策略

mybatis-plus:
global-config:
db-config:
id-type: auto

雪花算法

雪花算法是由Twitter公布的分布式主鍵生成算法,它能夠保證不同表主鍵的不重復(fù)性,以及相同表主鍵的有序性。通過(guò)雪花算法生成的id長(zhǎng)度共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í)體類(lèi)中的userName屬性與數(shù)據(jù)庫(kù)中的user_name字段相對(duì)應(yīng)。主鍵不對(duì)應(yīng)的話使用@TableId注解,普通字段對(duì)應(yīng)不上的話,就可以在實(shí)體類(lèi)的屬性上使用@TableField注解

@TableField("表中對(duì)應(yīng)的字段名")

1.4 @TableLogic

??@TableLogic注解就是設(shè)置字段為偽刪除,也就是在執(zhí)行刪除方法的時(shí)候?qū)⒃撟侄螌?duì)應(yīng)的值設(shè)置為1,再查詢(xún)記錄時(shí)不顯示該字段為1的記錄。 首先應(yīng)該在數(shù)據(jù)庫(kù)的表中創(chuàng)建一個(gè)字段用來(lái)標(biāo)記是否刪除(默認(rèn)值為0即不刪除),實(shí)體類(lèi)創(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);
}

查詢(xún)的時(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方法,可以像使用常見(jiàn)類(lèi)API的方式直接調(diào)用使用,這些方法有很多按照方法參數(shù)的不同主要分為兩大類(lèi),一種參數(shù)是wrapper放在下一章中進(jìn)行講解,另一種是接下來(lái)講解的參數(shù)不是wrapper的方法

2 mapper層的CRUD方法

??mapper層接口繼承BaseMapper接口并傳入需要操作的實(shí)體類(lèi)泛型

// spring框架創(chuàng)建mapper接口相對(duì)應(yīng)的接口實(shí)現(xiàn)類(lèi)
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.1 增(insert)

@Test
public void insertTest() {
   User user = new User();
   user.setName("張三");
   user.setAge(20);
   // sql語(yǔ)句: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("查詢(xún)結(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("查詢(xún)結(jié)果為:");
   users.forEach(System.out::println); 
} 

多條件查詢(xún)(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("查詢(xún)結(jié)果為:");
    users.forEach(System.out::println); 
}

查詢(xún)表中所有的記錄(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ù)

??以上都是單表的簡(jiǎn)單增刪改查操作,如果這些功能無(wú)法滿足你的需求,可以自定義SQL。可以在默認(rèn)的路徑(resources文件夾下的mapper文件夾)下創(chuàng)建mapper映射文件,或者在別的地方創(chuàng)建映射文件使用配置文件指定(mybatis-plus.mapper-locations),其他的操作和mybatis一樣(接口方法、映射文件、調(diào)用方法)

3 service層的CRUD方法

??service層接口繼承IService接口并傳入需要操作的實(shí)體類(lèi)泛型

public interface UserService extends IService<User> {
}

??service接口的實(shí)現(xiàn)類(lèi)除了實(shí)現(xiàn)接口之外,還要繼承ServiceImpl類(lèi)并傳入傳泛型(mapper層接口,實(shí)體類(lèi)),這樣做的好處是還可以在實(shí)現(xiàn)類(lèi)里實(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í)體類(lèi)對(duì)象是否設(shè)置了id屬性或者說(shuō)這個(gè)id值在表中是否存在,如果設(shè)置了id且id在表中存在的話就是批量更新,如果不設(shè)置id屬性或者表中沒(méi)有這個(gè)字段值的話就是批量添加。簡(jiǎn)而言之,有則改無(wú)則添

// 批量修改(因?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 查詢(xún)表中總記錄數(shù)

@Test
public void getCountTest() {
    // SELECT COUNT( * ) FROM user
    long count = userService.count();
    System.out.println(count);
}

到此這篇關(guān)于Mybatis-Plus實(shí)體類(lèi)注解方法與mapper層和service層的CRUD方法的文章就介紹到這了,更多相關(guān)Mybatis-Plus CRUD方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java運(yùn)用注解實(shí)現(xiàn)對(duì)類(lèi)中的方法檢測(cè)的工具

    淺談java運(yùn)用注解實(shí)現(xiàn)對(duì)類(lèi)中的方法檢測(cè)的工具

    這篇文章主要介紹了淺談java運(yùn)用注解實(shí)現(xiàn)對(duì)類(lèi)中的方法檢測(cè)的工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java中生產(chǎn)者消費(fèi)者問(wèn)題和代碼案例

    java中生產(chǎn)者消費(fèi)者問(wèn)題和代碼案例

    大家好,本篇文章主要講的是java中生產(chǎn)者消費(fèi)者問(wèn)題和代碼案例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • JDK12的新特性之CompactNumberFormat詳解

    JDK12的新特性之CompactNumberFormat詳解

    這篇文章主要介紹了JDK12的新特性之CompactNumberFormat,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java多線程的臨界資源問(wèn)題解決方案

    Java多線程的臨界資源問(wèn)題解決方案

    這篇文章主要介紹了Java多線程的臨界資源問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • spring boot 使用profile來(lái)分區(qū)配置的操作

    spring boot 使用profile來(lái)分區(qū)配置的操作

    這篇文章主要介紹了spring boot使用profile來(lái)分區(qū)配置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java類(lèi)加載策略之雙親委派機(jī)制全面分析講解

    Java類(lèi)加載策略之雙親委派機(jī)制全面分析講解

    這篇文章主要介紹了Java雙親委派機(jī)制,雙親委派模型是Java加載類(lèi)的機(jī)制,采用雙親委派模型的好處是Java類(lèi)隨著它的類(lèi)加載器一起具備了一種帶有優(yōu)先級(jí)的層級(jí)關(guān)系,通過(guò)這種層級(jí)關(guān)系可以避免類(lèi)的重復(fù)加載,感興趣的朋友可以參考下
    2023-12-12
  • Java經(jīng)典排序算法之希爾排序詳解

    Java經(jīng)典排序算法之希爾排序詳解

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之希爾排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 單點(diǎn)登錄的三種方式和JWT的介紹與使用

    單點(diǎn)登錄的三種方式和JWT的介紹與使用

    這篇文章主要說(shuō)明了單點(diǎn)登錄的三種方式和JWT的介紹與使用,加深自己的印象以及幫助的諸位小伙伴兒們,需要的朋友可以參考下
    2023-03-03
  • hibernate多表操作實(shí)例代碼

    hibernate多表操作實(shí)例代碼

    這篇文章主要介紹了hibernate多表操作實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

成安县| 江北区| 保定市| 钦州市| 香港 | 曲沃县| 涪陵区| 花莲县| 竹北市| 柯坪县| 班玛县| 山丹县| 交城县| 沙湾县| 平南县| 宜阳县| 紫金县| 抚顺市| 南开区| 岑溪市| 万年县| 丽水市| 巴林左旗| 依兰县| 策勒县| 贵港市| 黄骅市| 文山县| 武城县| 城固县| 林口县| 扶沟县| 合江县| 嘉义县| 宜兴市| 北碚区| 青铜峡市| 江永县| 尖扎县| 清水河县| 临夏县|