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

news/2025/2/25 10:34:00

在Mybatis里有一个叫TypeHandler的类型处理器,我们常见的PO当中的这些成员变量的数据类型,它都有对应的处理器,因此它就能自动实现这些Java数据类型与数据库类型的相互转换。

它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器,但是它不能帮我们把这个枚举跟数据库里面的int做转换。MybatisPlus对这些类型处理器做了扩展,加入了几个类型处理器,其中有一个叫MybatisEnumTypeHandler是Mybatis枚举的一个类型处理器,还有一个叫AbstractJsonTypeHandler顾名思义就是JSON类型的处理器。也就是说这两个处理器,一个用来处理枚举类型,一个用来处理JSON类型的。

要使用MybatisEnumTypeHandler枚举类型处理器分两步。

1.首先将来我们要把这个枚举转成int存到数据库,所以要告诉mp哪个是对应的数据库里面的这个int。我们要把这个成员变量标记出来,mp提供了一个注解@EnumValue,把它加到枚举对应数据库字段的值上面。那么将来它就知道了原来枚举中的这个value的值和数据库对应的,它就会拿这两个往数据库里面去写,查询的时候就反过来操作。

2.让MybatisEnumTypeHandler枚举处理器生效。

java">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 {

    @Override
    public 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();
    }

    @Override
    public 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();
    }

    @Override
    public 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为VO
        UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
        //3.2.转地址VO
        if (CollUtil.isNotEmpty(addresses)){
            userVO.setAddress(BeanUtil.copyToList(addresses, AddressVO.class));
        }
        return userVO;
    }

    @Override
    public 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.转换地址VO
        List<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为VO
            UserVO vo = BeanUtil.copyProperties(user, UserVO.class);
            list.add(vo);
            //3.2.转换地址VO
            vo.setAddress(addressMap.get(user.getId()));
        }
        return list;
    }
}

 枚举默认在做JSON数据格式处理的时候,就会以英文名返回,就是枚举项的名字。那如果说你想让它以value返回,也就是1和2返回,或者是以desc这个中文返回,那么你就需要告诉我们程序,我们这个程序的数据往前端返回由Spring MVC处理,Spring MVC 底层它在处理JSON的时候用到一个Jackson包,Jackson它提供一些注解用来标记这个枚举里面的值到底把谁进行返回。

 


http://www.niftyadmin.cn/n/5865389.html

相关文章

项目——仿RabbitMQ实现消息队列

1.项目介绍 曾经在学习Linux的过程中&#xff0c;我们学习过阻塞队列 (BlockingQueue) 。 当时我们说阻塞队列最大的用途, 就是用来实现生产者消费者模型。 生产者消费者模型是后端开发的常用编程方式&#xff0c; 它存在诸多好处&#xff1a; 解耦合支持并发支持忙闲不均削峰…

ArcGIS Pro中创建最低成本路径的详尽教程

一、引言 在地理信息系统&#xff08;GIS&#xff09;的应用场景中&#xff0c;路径分析扮演着至关重要的角色。而最低成本路径分析&#xff0c;则是路径分析中的一种高级应用&#xff0c;它综合考虑了地形、植被、土地利用类型等多种因素&#xff0c;通过加权计算得出一条从起…

rust笔记9-引用与原始指针

Rust 中的指针类型和引用类型是理解其内存管理机制的关键部分。& 引用和 * 原始指针在底层原理上确实都可以认为是指针,它们都存储了某个内存地址,并指向该地址处的数据。然而,它们在安全性、使用方式和编译器支持上有显著的区别。下面我会详细解释它们的异同点,帮助你…

6层高速PCB设计入门第1~10讲

第一讲 课程介绍 无痛入门&#xff01;6层高速PCB设计&#xff01;_哔哩哔哩_bilibili 第二讲 逻辑派原理图分析 开发板资料文档&#xff1a;https://wiki.lckfb.com/zh-hans/fpga-ljpi/ 最需要注意的信号就是FPGA与DDR3、HDMI交互的信号&#xff0c;其次是GD32读写TF Card的…

解决 kubeasz 安装k8s集群跨节点pod 无法使用cluster ip通讯问题

问题描述 使用kubeasz搭建k8s集群后使用的配置文件 # etcd cluster should have odd member(s) (1,3,5,...) [etcd] 192.168.xx.22# master node(s) [kube_master] 192.168.xx.22# work node(s) [kube_node] 192.168.xx.9 192.168.xx.22# [optional] harbor server, a privat…

结束,起点。有感于2024博客之星评选

目录 序 一条留言 生日 蛋糕 海参 老茶坊 七天 榜单一哥 榜单“一姐” 秋说 池央 力捧的新朋友 cooldream2009 老花眼猫 镜花照无眠 送梦想一个微笑 群 鸣谢 结束 起点 序 CSDN 2024 博客之星年度评选结束了&#xff0c;剩下的是等待26日的最终榜单公布和…

云原生降本之路:技术创新与应用解析

随着云计算的快速发展&#xff0c;云原生技术已成为企业降低成本、提高效率的重要手段。本文基于腾讯云容器技术专家孟凡杰的PPT内容&#xff0c;深入探讨了云原生技术在降低企业成本方面的应用&#xff0c;包括资源利用现状、成本优化思路、Kubernetes中的资源分配、横向与纵向…

今日运维之-Mac笔记本python环境问题

1. 问题&#xff1a;MAC升级系统后git报错&#xff1f; Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…