mybatis-plus 優雅的寫service接口中方法(3)

多表聯查

上文講過了自定義sql ,和wrapper的使用,但是我們可以發現 我們查詢的都是數據庫中的一張表,那么怎么進行多表聯查呢,當然也是用自定義sql來進行實現

比如說? 查詢 id 為 1? 2 4 的用戶 并且 地址在北京 的 用戶名稱 普通的sql查詢如下

select  u.username
from  tb_user u,address a where u.id=a.user_id and a.city='北京'  and u.id i
n(1,2,4);

用join on 實現多表的sql為??

select  u.username
from  tb_user u join address a on u.id=a.user_id where  a.city='北京'  and u.id in(1,2,4);

那么 我們如何用mp 來進行改造 自定義sql 來進行多表查詢呢

? ? ?先用? wrapper 來進行后面 where? 條件的拼接? 再用自定義sql 拼接

廢話不多說 直接上代碼??

?然后再usermapper中定義方法?

@Select("SELECT u.* FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
List<User> queryUserByWrapper(@Param("ew")QueryWrapper<User> wrapper);

service接口

mp不僅對基本的 mapper層進行了接口的封裝,還對service層進行了接口的封裝,使得 基礎的crud也可以直接在controller層直接調用service層直接查詢,更加提升了代碼的簡潔性

而使用Iservice中的方法也很簡單??

通常我們有兩個? 一個是接口service,一個是實現接口的實現類? ? ?我們只需要讓接口繼承 iservice,然后讓自己的實現類 實現自己的接口,并且繼承serviceimpl? ?廢話不多說? 我們直接上代碼

其中User是對應的數據庫實體類? ?,同樣Usermapper 也是??

?但是我們這樣說是顯得太過寬泛? 我們直接上例子 對service接口進行測試

接口測試

我們 假如說? 現在有一個需求? ?根據用戶的id 來進行扣減用戶的余額? ?,而在用戶表中有一個狀態? 只有狀態正常的

并且余額充足的才能進行余額的扣減? ??

現在 我們在 Usercontroller 中定義 一個方法

//根據id扣除余額@PutMapping("/{id}/deduction/{money}")void deductMoney(@PathVariable Long id,@PathVariable Integer money){myService.deductMoney(id,money);}

然后是 userservice接口

package com.itheima.mp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;public interface IUserService extends IService<User> {void deductBalance(Long id, Integer money);
}

最后是實現類

package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Overridepublic void deductBalance(Long id, Integer money) {// 1.查詢用戶User user = getById(id);// 2.判斷用戶狀態if (user == null || user.getStatus() == 2) {throw new RuntimeException("用戶狀態異常");}// 3.判斷用戶余額if (user.getBalance() < money) {throw new RuntimeException("用戶余額不足");}// 4.扣減余額baseMapper.deductMoneyById(id, money);}
}

?mapper中的實現接口為??

@Update("UPDATE user SET balance = balance - #{money} WHERE id = #{id}")
void deductMoneyById(@Param("id") Long id, @Param("money") Integer money);

但是 但是這樣是否有點不太優雅? ?那么? 我們怎么把他變得優雅? 來? 讓我們改造一下

優雅的接口測試

首先? 我們可以看到 在 我們對比用戶狀態的時候 用戶狀態異常的數字是寫死的,這樣寫有沒有問題,沒有問題,但是假如我們以后用了多個用戶狀態的的數字,以后想改 是不是特別 的麻煩? ,所以我們干脆定義一個枚舉類型,來進行 用戶狀態的對比

我們原來user實體類中的類型 是?

是interger類型的對比 ,下面 我們 定義一個如下的枚舉? ?

?并在mp的yaml文件中配置枚舉處理器

mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

配置好 之后再把user實體類中的 狀態的類型 改成 枚舉類型? ? ?

好,那么現在我們來解釋一下? 枚舉類型中的注解??

使用enumvalue 注解,代表著? 枚舉類中的哪個值 作為 數據庫status字段的值? ??

比如說? ?我們? 數據庫中定義的字段status為? int類型的,然后我們對應的數據庫user表的實體類user 的類型是 枚舉類型的這樣就會導致我們在查詢插入的時候出現類型轉換的錯誤,我們加上這個注解,開啟配置枚舉處理器,就可以 實現二者值之間的自動轉換??

下面 我們來 寫一個例子

@PostMappingvoid   userSelect(@Param("id") Long id){
//通過枚舉類型 加用戶id進行查詢LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().eq(User::getId, id).eq(User::getStatus, UserStatus.NORMAL);User user1 = myService.getBaseMapper().selectOne(wrapper);System.out.println(user1);//使用枚舉類型插入用戶User user = new User();
//我們著重看這一行 setstatususer.setStatus(UserStatus.NORMAL);user.setUsername("wang");user.setPassword("123456");UserInfo userInfo = new UserInfo();userInfo.setAge(1);userInfo.setGender("22");userInfo.setIntro("6666666");user.setInfo(userInfo);myService.save(user);
}

?下面我們用apifox進行測試??

可以看到? 用了enumvalue注解? 已經成功的把枚舉類型轉換成數據庫類型了,是不是灰常的優雅

優雅的json處理器

在上文中我們看到 怎么還有個userinfo 那玩意是什么鬼 ,下面我們來解釋一下?

?在數據庫中 我們的info字段定義的是一個json類型

但是 在我么們user實體類中確實 一個string類型的 字段? ,在我們插入的時候 會非常的麻煩 我們需要把字符串類型寫成類似于json類型進行插入,這樣太麻煩? ?

我們? 直接可以定義一個json類型的實體類 ,然后把user實體類的類型換成該json類型的實體類 ,然后再user實體類字段上加上json類型處理器的注解? 就可以完成轉換

@Data
@AllArgsConstructor(staticName = "set")
@NoArgsConstructor
public class UserInfo {private Integer age;private  String intro;private  String gender;
}

這樣我們再插入的時候 就可以完成 json類型之間的轉換了

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

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

相關文章

Elasticsearch不刪原有jdk8導致的系列安裝和啟動問題

以前在空機器直接裝elasticsearch&#xff0c;沒有遇到什么問題。今天在現有JDK上安裝&#xff0c;遇到的問題記錄一下&#xff1a; 1. JDK的環境變量配置與我原有的不一致報如下錯誤&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

python-數據分析與可視化基礎

1、data1.csv中的B、C、D和E列數據分別是日期、權重、A企業的銷售額、B企業的銷售額。讀取C、D、E列數據,并統計E列數據的算術平均數、加權平均值(權值為C列數據)、方差、中位數、最小值、最大值。并繪制E列數據的直方圖。 &#xff08;1&#xff09;源代碼&#xff1a; impo…

JavaScript異步編程:理解和使用Promise、Async/Await

JavaScript是一種單線程語言&#xff0c;這意味著它一次只能執行一個任務。然而&#xff0c;在Web開發中&#xff0c;我們經常需要處理異步操作&#xff0c;例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程&#xff0c;包括回調函數、Promise、Asyn…

什么生信流程語言讓你極度爽?

生信流程搭建有多難&#xff1f;行業為解決這一問題提出了各種各樣的配方&#xff0c;有你熟悉的嗎&#xff1f; 一、困境 - 亂 無數機構投入大量人力物力&#xff0c;以期獲得一條條可用的生信流程。而有些流程&#xff0c;由于種種原因&#xff0c;存在著巨大的缺陷&#xf…

安全風險 - 切換后臺時背景模糊處理

因為安全風險中提到當app處于后臺卡片狀態時&#xff0c;顯示的卡片頁面應該為模糊效果&#xff0c;否則容易泄露用戶隱私&#xff0c;尤其當前頁涉及個人信息、資產信息等&#xff0c;都會造成信息泄露&#xff01;基于這種場景&#xff0c;我研究了下這種業務下的模糊效果 找…

普通函數的參數中的auto

2.1 普通函數的參數中的auto 從c14起&#xff0c;lambda可以使用auto占位符聲明或者定義參數: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 內部的操作&…

【OS】AUTOSAR Os是如何啟動第一個Task的

目錄 前言 正文 1.總體概覽及背景介紹 1.1. Os默認的Hook配置 1.2 用戶Task的配置

Golang創建文件夾

方法 package zdpgo_fileimport ("os" )// AddDir 創建文件夾 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }測試 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽 儀表盤所有提交榜單 I. 孤星 單點時限: 2.0 sec 內存限制: 512 MB &#x1d45b;(1≤103) 個干員&#xff0c;每個干員工資為 &#x1d464;&#x1d456;(1≤&#x1d464;&#x1d456;≤105)&#xff0c;貢獻…

JAVA云HIS醫院系統源碼 HIS源碼:云HIS系統與SaaS的關系

云HIS系統與SaaS的關系 云HIS系統是一種基于云計算技術的醫院信息系統&#xff0c;它采用B/S架構&#xff0c;通過云端SaaS服務的方式提供。用戶可以通過瀏覽器訪問云HIS系統&#xff0c;無需關注系統的部署、維護、升級等問題。云HIS系統通常具有模板化、配置化、智能化等特點…

react記錄部署

導語 React中的核心概念 1 虛擬DOM&#xff08;Virtual DOM&#xff09; 2 Diff算法&#xff08;虛擬DOM的加速器&#xff0c;提升React性能的法寶&#xff09; React主要的原理 Virtual DOM 虛擬DOM; 提供了一種不同的而又強大的方式來更新DOM&#xff0c; 代替直接的DOM操…

cuda11.8安裝torch2.0.1

pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118

hot100 -- 回溯(上)

目錄 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;電話號碼的字母組合 AC DFS &#x1f33c;組合總和 AC DFS &#x1f35e;科普 忘記 dfs 的&#xff0c;先看看這個&#x1f447; DFS&#xff08;深度優先搜索&#xf…

百度軟件測試面試經歷,期望薪資27K

一面 1、 請為百度搜索框設計測試用例&#xff1f; 2、百度設計框上線前需要進行那些測試&#xff1f; 界面測試&#xff0c;功能測試&#xff0c;性能測試&#xff0c;安全性測試&#xff0c;易用性測試&#xff0c;兼容性測試&#xff0c;UI測試。 3、如何查看http狀態碼…

重學java 38.創建線程的方式?

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一種方式_繼承extends Thread方法 1.定義一個類,繼承Thread 2.重寫run方法,在run方法中設置線程任務(所謂的線程任務指的是此線程要干的具體的事兒,具體執行的代碼) 3.創建自定義線程…

基于灰狼優化算法優化支持向量機(GWO-SVM)回歸預測

代碼原理 基于灰狼優化算法優化支持向量機&#xff08;GWO-SVM&#xff09;的回歸預測代碼的原理和流程如下&#xff1a; 1. **初始化灰狼群體**&#xff1a;隨機生成一定數量的灰狼&#xff0c;并初始化它們的位置和速度。 2. **初始化SVM模型參數**&#xff1a;根據問題要…

【JAVA基礎之網絡編程】UDP和TCP協議以及三次握手和四次揮手的過程

&#x1f525;作者主頁&#xff1a;小林同學的學習筆錄 &#x1f525;mysql專欄&#xff1a;小林同學的專欄 目錄 1. 網絡編程 1.1 概述 1.2 網絡編程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和協議 1.3 UDP協議 1.3.1 UDP發送數據 1.3.2 UDP接收數據 1.4…

C語言——小知識和小細節18

一、力扣題目 1、題目本體 2、題解 本題目我們使用異或分組的方法來解決。可以在我之前的文章《C語言——操作符CSDN博客》中看一下異或的特點。 由于異或的運算規則為相同為0&#xff0c;不同為1&#xff0c;而且是在二進制補碼上進行操作的&#xff0c;我們可以發現的一個…

c++|多態

c|多態 1 多態的概念2 多態的定義及其實現2.1 滿足多態的條件2.2 虛函數2.3 虛函數的重寫2.4 析構函數適合加virtural嗎2.4 C11 override 和 final2.5 三個概念的對比 3 多態的原理4 抽象類4.1 概念4.2 純虛函數 1 多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…