Mybatis-Plus實現簡單的增刪改查 實體類上的注解

寫在前面在這里插入圖片描述🛫更多知識總結見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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webpack 讀取文件夾下的文件_webpack基本介紹及使用

1.什么是webpackwebpack是一個前端資源加載/打包工具。它根據模塊的依賴關系進行靜態分析&#xff0c;然后將這些模塊按照指定的規則生成對應的靜態資源。從上圖看出&#xff0c;webpack可以將多種靜態資源js&#xff0c;css&#xff0c;less轉換成一個靜態文件&#xff0c;減少…

conda失敗說沒有寫權限_愛情中,為什么男生表白失敗,女生還說可以繼續做朋友,想過沒有...

在愛情中&#xff0c;不是每個男生都是幸運的&#xff0c;也不是每次的表白都是如你所愿的。有成功總有失敗&#xff0c;成功是喜悅的&#xff0c;但是失敗卻是痛苦的。不過有的時候男生和女生表白以后&#xff0c;女生對男生說了這樣的一段&#xff0c;其實我希望以后我們還是…

Mybatis-Plus中Wrapper條件構造器的使用

寫在前面 &#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680…

springboot設置默認值_線上Bug無法復現?老司機教你一招,SpringBoot遠程調試不用愁!...

前言在部署線上項目時&#xff0c;相信大家都會遇到一個問題&#xff0c;線上的 Bug 但是在本地不會復現&#xff0c;多么無奈。此時最常用的就是取到前端傳遞的數據用接口測試工具測試&#xff0c;比如 POSTMAN&#xff0c;復雜不&#xff0c;難受不&#xff1f;今天陳某教你一…

Mybatis-Plus的分頁 樂觀鎖插件 通用枚舉 多數據源

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

學python哪個網站好-有哪些值得推薦的Python學習網站|

現在那個網站可以學習python爬蟲&#xff1f; 為大家分享Python學習經驗: 1、尋找一本Python書籍&#xff0c;要求淺顯易懂、全面細致程較好&#xff0c;專注于這一本&#xff0c;從頭開始研究&#xff0c;把整本書掌握透徹。 2、找一個項目練手&#xff0c;熟悉基礎后&#xf…

等待的操作過時_不會過時的6種網站seo優化操作

SEO優化一直在變化&#xff0c;百度和谷歌的算法也在不斷的迭代更新&#xff0c;所以競爭永遠不會停止。今天小編就來給大家分享一下&#xff0c;6種不會過時的網站seo優化操作。1.保持正常優化為網站訪客提供高質量的內容、卓越的用戶體驗和安全性以及卓越的技術網站。這可能需…

java的for循環取出數據只是拿到最后一個_一問SQL優化就無從藏身?那只是你對原理的精髓掌握不深

?曾幾何時&#xff0c;我信誓旦旦的認為只要 SQL 寫的好&#xff0c;面試過程永不倒。結果在一次又一次的征途中&#xff0c;「最終還是以完敗落下帷幕」。結果都源于注重使用而忽略原理&#xff0c;從而不知也不了解「SQL」優化應如何面對。讀文的你&#xff0c;如今可有這樣…

SpringBoot前后端分離解決跨域問題的三種解決方案

&#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;** 文章目錄&#x1f34a;什么是跨域&#x1f34a;跨域問題的解決策略&#x1f34a;三種解決方法&#x1f34a;什么是跨域 想要知道什么是跨域的話&#xff0c;我們可以通過一個小案例簡單了解一下跨…

ant design vue 樹形控件_官宣!vue.ant.design 低調上線

點擊右上方&#xff0c;關注開源中國OSC頭條號&#xff0c;獲取最新技術資訊官宣&#xff01;官宣&#xff01;官宣&#xff01;是的&#xff0c;你沒看錯就是那個 https://vue.ant.design。至此&#xff0c;Ant Design 已經全面覆蓋了 React、Angular、Vue 三大前端框架&#…

哪款筆記本電腦好_掃地機器人哪個牌子好?口碑最好的掃地機器人

隨著智能家居的普及&#xff0c;讓我們的生活變得越來越智能。掃地機器人的出現完美解決了寵物的毛發問題&#xff0c;為自己騰出了大量的時間。掃地機器人絕對能提升你的生活品質&#xff0c;通過機器內建的智能清潔模式、自定義規劃區域進行打掃&#xff0c;使用手機APP進行控…

使用mybatisplus的通用枚舉實現存儲顯示相分離

狡兔尚且三窟&#xff0c;多學一招總沒錯吧&#xff1f; &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680; &#x1f30f; 拋出問題 如果讓你實現這么一個功能&#xff1a;將性別使用數字存儲到數據庫中&#xff0c;但是前端需要獲取到的是具體的性…

wifi卡慢延遲高_家里WiFi特別卡,網絡延遲高,可能不是網速的問題

原標題&#xff1a;家里WiFi特別卡&#xff0c;網絡延遲高&#xff0c;可能不是網速的問題隨著科技走向我們的身邊&#xff0c;網絡的覆蓋力度也是越來越大&#xff0c;相信很多人的家中都是有安裝WiFi的&#xff0c;然后往往在家中使用的過程中都會碰到這樣的情況&#xff0c;…

voc2007數據集_【目標檢測數據集】PASCAL VOC制作

【VOC20072012】數據集地址&#xff1a;https://pjreddie.com/projects/pascal-voc-dataset-mirror/PASCAL VOC為圖像識別和分類提供了一整套標準化的優秀的數據集&#xff0c;用于構建和評估用于圖像分類&#xff08;Classification&#xff09;&#xff0c;檢測&#xff08;O…

JDK和JRE的區別?main方法的注意點?強制和自動類型轉換?

&#x1f4a1;涉及的知識點速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的輸出都經歷了啥&#xff1f;&#x1f6eb; Java的三個版本都是啥&#xff1f;&#x1f6eb; 關于main方法你都知道啥&#xff1f;&#x1f6eb; 強制and自動類型轉換都是啥?各位小…

java將date類型轉成yyyymmdd_java中的Date怎么轉換成YYYYMMDD形式?

展開全部SimpleDateFormat inSdf new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);創建SimpleDateFormat對象的時候使用帶Locale的構e69da5e6ba9062616964757a686964616f31333365633938造參數因為你的星期和月份是用E文寫的 所以parse回來的時候自…

安卓10不支持qmc解碼_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安裝&#xff0c;而且自帶root&#xff0c;刷入這個Magisk后你的rom同時也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)這也是目前安裝8.1root的普遍方法&#xff0c;因為目前s…

centos7配置br0_Docker CentOS7 修改網絡配置與宿主機橋接

Docker CentOS7 修改網絡配置與宿主機橋接1、創建橋接物理網絡(1)新建br0橋接網絡&#xff0c;brctl show可以查看(需安裝bridge-utils)(2)將宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置到br0上(3)刪除宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置(4)將宿主機物理網…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知識點速通&#x1f6eb; 關于變量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么區別&#xff1f;&#x1f6eb; 關于字符串的問題你能答對幾道&#xff1f;&#x1fa82; 可以修改一個字符串中的值嗎?&#x1fa82; 字符串使用…

倆臺電腦怎么設置同一局域網_方法 | 把手機上的照片傳到電腦上

我想把手機上的照片/視頻傳到電腦上怎么辦? 什么云盤&#xff0c;手機助手等等全扔到一邊去&#xff0c;不用。請讓我慢慢道來&#xff1a;現在&#xff0c;人們手機用的越來越多&#xff0c;即使在大街上&#xff0c;到處都是“低頭族”。但是&#xff0c;有好多小伙伴問&…