当前位置: 首页 > article >正文

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它提供一些注解用来标记这个枚举里面的值到底把谁进行返回。

 

相关文章:

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器&#xff0c;我们常见的PO当中的这些成员变量的数据类型&#xff0c;它都有对应的处理器&#xff0c;因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…...

力扣2454. 下一个更大元素 IV

力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数&#xff0c;找到右边比它大的第二个数&#xff0c;并记录在ans数组中 如果是右边第一个大的&#xff0c;就用一个递减栈即可&#xff0c;栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…...

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…...

Ollama部署与常用命令

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。 通过Ollama&#xff0c;用户无需具备深厚的技术背景&#xff0c;就能在普通的消费级硬件上快速搭建一个强大的语言处理环…...

Visual Studio Code 远程开发方法

方法1 共享屏幕远程控制&#xff0c;如 to desk, 向日葵 &#xff0c;像素太差&#xff0c;放弃 方法2 内网穿透 ssh 第二个方法又很麻烦&#xff0c;尤其是对于 windows 电脑&#xff0c;要使用 ssh 还需要额外安装杂七杂八的东西&#xff1b;并且内网穿透服务提供商提供的…...

C语言预编译

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…...

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…...

flowable-ui 的会签功能实现

场景&#xff1a;在进行智慧保时通开发时&#xff0c;有个协作合同入围功能&#xff0c;这个功能的流程图里有个评审小组&#xff0c;这个评审小组就需要进行会签操作&#xff0c;会签完成后&#xff0c;需要依据是否有不通过的情况选择下一步走的流程 思考步骤&#xff1a; 首…...

Spring Boot 与 MyBatis 数据库操作

一、核心原理 Spring Boot 的自动配置 通过 mybatis-spring-boot-starter 自动配置 DataSource&#xff08;连接池&#xff09;、SqlSessionFactory 和 SqlSessionTemplate。 扫描 Mapper 接口或指定包路径&#xff0c;生成动态代理实现类。 MyBatis 的核心组件 SqlSessionF…...

大连指令数据集的创建--数据收集与预处理_02

1.去哪儿爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;去哪儿&#xff08;https://travel.qunar.com/trav…...

vLLM专题(十四)-自动前缀缓存

一、介绍 自动前缀缓存(Automatic Prefix Caching,简称 APC)缓存现有查询的 KV 缓存,以便新查询如果与现有查询共享相同的前缀,可以直接重用 KV 缓存,从而跳过共享部分的计算。 注意 有关 vLLM 如何实现 APC 的技术细节,请参阅此处。 二、在 vLLM 中启用 APC 在 vLLM …...

STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动

SPI总线驱动整体上与I2C总线驱动类型&#xff0c;差别主要在设备树和数据传输上&#xff0c;由于SPI是由4根线实现主从机的通信&#xff0c;在设备树上配置时需要对SPI进行设置。 原理图可知&#xff0c;数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…...

linux-c 字节序问题--大小端

今天面试被问了一个网络字节系列的问题分享一下&#xff1a; 1.如何将Int转换成byte数组在网络上传输。 2.计算机世界里的大小端问题。 计算机世界里为什么有大小端 硬件设计因素 CPU 架构差异 不同的 CPU 架构在设计时&#xff0c;对于多字节数据在内存中的存储顺序…...

java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正

医院绩效考核管理系统&#xff0c;java医院绩效核算系统源码&#xff0c;采用多维度综合绩效考核的形式&#xff0c;针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求&#xff0c;对考核方案中各维度进行灵活配置&#xff0c;对各维…...

C语言学习笔记-初阶(13)scanf介绍

当我们有了变量&#xff0c;我们需要给变量输入值就可以使用 scanf 函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数&#xff0c;下面看⼀个例子&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…...

Android MMKV集成指南

首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型&#xff0c;传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新&#xff0c;更是管理、文化、业务流程等全方位的变革。从零开始&#xff0c;如何带领一家传统制造企业走向数字化突破&#xff0c;是许多企业领导者面…...

Centos7安装Python3.13

Centos7.5环境上安装Python3.13 # 安装依赖 yum install -y zlib zlib-devel openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c mkdir -p /opt/software cd /opt/software # openssl高版本安装 # 如果 Centos7 系统默认自带的 openssl 版本太低&#xf…...

C++之string类的模拟实现(超详细)

们学习东西&#xff0c;先学习如果使用它&#xff0c;然后再学习如何实现它 文章目录 目录 1. 命名空间以及头文件 2.string类的成员变量 3.string类的成员函数 3.1 构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 赋值运算符重载 3.5 c_str函数 3.6 size函数 3.7 clea…...

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时&#xff0c;或者某些三方SDK以来的管理后台&#xff0c;都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释&#xff1a; 华为AppGallery Connect简称 AGC平台&#xff0…...

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…...

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...

Linux中文件目录类指令

1、pwd指令 基本语法&#xff1a;pwd 功能&#xff1a;显示当前工作目录的绝对路径 1.相对路径访问和绝对路径访问 当前处于home目录下&#xff0c;访问a.txt文件 相对路径访问&#xff1a;kim/better/a.txt&#xff0c;从当前位置开始定位 绝对路径访问&#xff1a;/home…...

vue2项目打包后js文件过大, 首次加载缓慢

vue2项目打包后js文件过大, 首次加载缓慢 安装插件 npm i compression-webpack-plugin6.1.1 -D配置vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin)module.exports {configureWebpack: {plugins:[new CompressionWebpackPlugin({filen…...

【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片

【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片 根据您的需求&#xff0c;目前需要了解以下几个关键点及分步解决方案&#xff1a; --- 一、现状分析 1. Ollama 的限制&#xff1a; - 目前Ollama主要面向文本大模型&#xff0c;原生不支持直接上传/处理图片 …...

开源模型应用落地-LangChain实用小技巧-获取token消耗(五)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 计算 Token 消耗对有效管理和优化语…...

mfy学习笔记

创建表并导入数据 CREATE TABLE sales (id INT,salesperson STRING,region STRING,sales_amount INT,sale_date DATE );INSERT INTO sales (id, salesperson, region, sales_amount, sale_date) VALUES (1, Alice, North, 1000, 2023-01-01), (2, Bob, South, 1500, 2023-01-0…...

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…...

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…...

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术&#xff0c;其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角&#xff0c;梳理神经网络发展的五大关键阶段&#xff0c;结合具象化比喻和经典案例&#xff0c;为读者呈现一幅清晰的AI算法发展图谱。 一…...