MybatisPlus-擴展功能-枚舉處理器

在Mybatis里有一個叫TypeHandler的類型處理器,我們常見的PO當中的這些成員變量的數據類型,它都有對應的處理器,因此它就能自動實現這些Java數據類型與數據庫類型的相互轉換。

它里面還有一個叫EnumOrdinalTypeHandler的枚舉處理器,但是它不能幫我們把這個枚舉跟數據庫里面的int做轉換。MybatisPlus對這些類型處理器做了擴展,加入了幾個類型處理器,其中有一個叫MybatisEnumTypeHandler是Mybatis枚舉的一個類型處理器,還有一個叫AbstractJsonTypeHandler顧名思義就是JSON類型的處理器。也就是說這兩個處理器,一個用來處理枚舉類型,一個用來處理JSON類型的。

要使用MybatisEnumTypeHandler枚舉類型處理器分兩步。

1.首先將來我們要把這個枚舉轉成int存到數據庫,所以要告訴mp哪個是對應的數據庫里面的這個int。我們要把這個成員變量標記出來,mp提供了一個注解@EnumValue,把它加到枚舉對應數據庫字段的值上面。那么將來它就知道了原來枚舉中的這個value的值和數據庫對應的,它就會拿這兩個往數據庫里面去寫,查詢的時候就反過來操作。

2.讓MybatisEnumTypeHandler枚舉處理器生效。

package com.itheima.mp.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.itheima.mp.domain.po.Address;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.AddressVO;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.enums.UserStatus;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;import java.util.*;
import java.util.stream.Collectors;@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() == UserStatus.FROZEN){throw new RuntimeException("用戶狀態異常!");}//3.校驗余額是否充足if(user.getBalance() < money){throw new RuntimeException("用戶余額不足!");}//4.扣減余額update tb_user set balance = balance - ?int remainBalance = user.getBalance()-money;lambdaUpdate().set(User::getBalance,remainBalance).set(remainBalance == 0,User::getStatus,UserStatus.FROZEN).eq(User::getId,id).eq(User::getBalance,user.getBalance())//樂觀鎖.update();}@Overridepublic List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {return lambdaQuery().like(name != null,User::getUsername,name).eq(status != null,User::getStatus,status).gt(minBalance != null,User::getBalance,minBalance).lt(maxBalance != null,User::getBalance,maxBalance).list();}@Overridepublic UserVO queryUserAndAddressById(Long id) {//1.查詢用戶User user = getById(id);if(user == null || user.getStatus() == UserStatus.NORMAL){throw new RuntimeException("用戶狀態異常!");}//2.查詢地址List<Address> addresses = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();//3.封裝VO//3.1.轉User的PO為VOUserVO userVO = BeanUtil.copyProperties(user, UserVO.class);//3.2.轉地址VOif (CollUtil.isNotEmpty(addresses)){userVO.setAddress(BeanUtil.copyToList(addresses, AddressVO.class));}return userVO;}@Overridepublic List<UserVO> queryUserAndAddressByIds(List<Long> ids) {//1.查詢用戶List<User> users = listByIds(ids);if (CollUtil.isEmpty(users)){return Collections.emptyList();}//2.查詢地址//2.1.獲取用戶id集合List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());//2.2.根據用戶id查詢地址List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();//2.3.轉換地址VOList<AddressVO> addressVOList = BeanUtil.copyToList(addresses, AddressVO.class);//2.4.用戶地址集合分組,相同用戶的放入一個集合(組)中Map<Long, List<AddressVO>> addressMap = new HashMap<>(0);if (CollUtil.isNotEmpty(addressVOList)){addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));}//3.轉換VO返回List<UserVO> list = new ArrayList<>(users.size());for (User user : users) {//3.1.轉化User的PO為VOUserVO vo = BeanUtil.copyProperties(user, UserVO.class);list.add(vo);//3.2.轉換地址VOvo.setAddress(addressMap.get(user.getId()));}return list;}
}

?枚舉默認在做JSON數據格式處理的時候,就會以英文名返回,就是枚舉項的名字。那如果說你想讓它以value返回,也就是1和2返回,或者是以desc這個中文返回,那么你就需要告訴我們程序,我們這個程序的數據往前端返回由Spring MVC處理,Spring MVC 底層它在處理JSON的時候用到一個Jackson包,Jackson它提供一些注解用來標記這個枚舉里面的值到底把誰進行返回。

?

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

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

相關文章

北京大學第二彈《DeepSeek提示詞工程和落地場景》

大家好&#xff0c;我是吾鳴。 之前給大家分享過北京大學出品的DeepSeek教程《DeepSeek與AIGC應用》&#xff0c;今天吾鳴發現北京大學又出第二版教程了&#xff0c;教程的名稱叫做《DeepSeek提示詞工程和落地場景》&#xff0c;在此分享給大家。文末有完整版PDF下載地址。 教程…

deepseek自動化代碼生成

使用流程 效果第一步&#xff1a;注冊生成各種大模型的API第二步&#xff1a;注冊成功后生成API第三步&#xff1a;下載vscode在vscode中下載agent&#xff0c;這里推薦使用cline 第四步&#xff1a;安裝完成后&#xff0c;設置模型信息第一步選擇API provider&#xff1a; Ope…

322.零錢兌換

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""n len(coins) dp [float(inf)]*(amount 1) # 初始值為正無窮大dp[0] 0 # 一定要初始化為0if amount 0:return 0 …

ARM Cortex-M處理器中的MSP和PSP

在ARM Cortex-M系列處理器中&#xff0c;MSP&#xff08;主堆棧指針&#xff09;和PSP&#xff08;進程堆棧指針&#xff09;是兩種不同的堆棧指針&#xff0c;主要用于實現堆棧隔離和提升系統可靠性。以下是它們的核心區別和應用場景&#xff1a; 1. 基本定義 MSP&#xff08;…

交換機與路由器連接方式

交換機和路由器連接的三種主要方式如下&#xff1a; 一、直連連接 這是最簡單直接的連接方式。通過一根網線將交換機的一個端口與路由器的一個LAN端口相連。這種連接方式適用于小型網絡&#xff0c;其中交換機負責局域網內部的數據交換&#xff0c;而路由器則負責將內部網絡連接…

Python代碼片段-Excel導入到MongoDB

有一次遇到一個需求&#xff0c;需要把Excel的數據導入到MongoDB中&#xff0c;表面上感覺就是導入數據很簡單&#xff0c;但實際操作后&#xff0c;發現是比較麻煩的一個事情&#xff0c;一般圖形化的工具對于MongoDB而言&#xff0c;導入選項都是json的&#xff0c;根本沒有E…

axios幾種請求類型的格式

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;廣泛用于瀏覽器和 Node.js 中發送 HTTP 請求。它支持多種請求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目錄 一、axios幾種請求類型的格式 1、get請求 2、post請求 3、put請求 4、delete請求 二…

手寫系列——MoE網絡

參考&#xff1a; MOE原理解釋及從零實現一個MOE&#xff08;專家混合模型&#xff09;_moe代碼-CSDN博客 MoE環游記&#xff1a;1、從幾何意義出發 - 科學空間|Scientific Spaces 深度學習之圖像分類&#xff08;二十八&#xff09;-- Sparse-MLP(MoE)網絡詳解_sparse moe…

Linux的基礎指令和環境部署,項目部署實戰(下)

目錄 上一篇&#xff1a;Linxu的基礎指令和環境部署&#xff0c;項目部署實戰&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署環境 1.1 apt apt常用命令 列出所有的軟件包 更新軟件包數據庫 安裝軟件包 移除軟件包 1.2 JDK 1.2.1. 更新 1.2.2. 安裝openjdk&am…

【藍橋杯】第十五屆省賽大學真題組真題解析

【藍橋杯】第十五屆省賽大學真題組真題解析 一、智能停車系統 1、知識點 &#xff08;1&#xff09;flex-wrap 控制子元素的換行方式 屬性值有&#xff1a; no-wrap不換行wrap伸縮容器不夠則自動往下換行wrap-reverse伸縮容器不夠則自動往上換行 &#xff08;2&#xff0…

flink operator v1.10對接華為云對象存儲OBS

1 概述 flink operator及其flink集群&#xff0c;默認不直接支持華為云OBS&#xff0c;需要在這些java程序的插件目錄放一個jar包&#xff0c;以及修改flink配置后&#xff0c;才能支持集成華為云OBS。 相關鏈接參考&#xff1a; https://support.huaweicloud.com/bestpracti…

免費PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解決您所有PD…

去中心化技術P2P框架

中心化網絡與去中心化網絡 1. 中心化網絡 在傳統的中心化網絡中&#xff0c;所有客戶端都通過一個中心服務器進行通信。這種網絡拓撲結構通常是一個星型結構&#xff0c;其中服務器作為中心節點&#xff0c;每個客戶端只能與服務器通信。如果客戶端之間需要通信&#xff0c;必須…

muduo源碼閱讀:linux timefd定時器

?timerfd timerfd 是Linux一個定時器接口&#xff0c;它基于文件描述符工作&#xff0c;并通過該文件描述符的可讀事件進行超時通知。可以方便地與select、poll和epoll等I/O多路復用機制集成&#xff0c;從而在沒有處理事件時阻塞程序執行&#xff0c;實現高效的零輪詢編程模…

Pinia 3.0 正式發布:全面擁抱 Vue 3 生態,升級指南與實戰教程

一、重大版本更新解析 2024年2月11日&#xff0c;Vue 官方推薦的狀態管理庫 Pinia 迎來 3.0 正式版發布&#xff0c;本次更新標志著其全面轉向 Vue 3 技術生態。以下是開發者需要重點關注的升級要點&#xff1a; 1.1 核心變更說明 特性3.0 版本要求兼容性說明Vue 支持Vue 3.…

【圖像處理 --- Sobel 邊緣檢測的詳解】

Sobel 邊緣檢測的詳解 目錄 Sobel 邊緣檢測的詳解1. 梯度計算2. 梯度大小3. 梯度方向4. 非極大值抑制5. 雙閾值處理6. 在 MATLAB 中實現 Sobel 邊緣檢測7.運行結果展示8.關鍵參數解釋9.實驗與驗證 Sobel 邊緣檢測是一種經典的圖像處理算法&#xff0c;用于檢測圖像中的邊緣。它…

LeetCode 熱題100 15. 三數之和

LeetCode 熱題100 | 15. 三數之和 大家好&#xff0c;今天我們來解決一道經典的算法題——三數之和。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求我們從一個整數數組中找到所有不重復的三元組&#xff0c;使得三元組的和為 0。下面我將詳細講解解題思路&#xff0c…

基因組組裝中的術語1——from HGP

Initial sequencing and analysis of the human genome | Nature 1&#xff0c;分層鳥槍法測序hierarchical shotgun sequencing

安全開發-環境選擇

文章目錄 個人心得虛擬機選擇ubuntu 22.04python環境選擇conda下載使用&#xff1a; 個人心得 在做開發時配置一個專門的環境可以使我們在開發中的效率顯著提升&#xff0c;可以避免掉很多環境沖突的報錯。尤其是python各種版本沖突&#xff0c;還有做滲透工具不要選擇windows…

數字體驗驅動用戶參與增效路徑

內容概要 在數字化轉型深化的當下&#xff0c;數字內容體驗已成為企業與用戶建立深度連接的核心切入點。通過個性化推薦引擎與智能數據分析系統的協同運作&#xff0c;企業能夠實時捕捉用戶行為軌跡&#xff0c;構建精準的用戶行為深度洞察模型。這一模型不僅支撐內容分發的動…