Mybatis自定义枚举类处理器优雅地使用枚举

这篇具有很好参考价值的文章主要介绍了Mybatis自定义枚举类处理器优雅地使用枚举。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在和前端开发对接接口过程中经常发现需要一些枚举类的字典参数,虽然可以通过swagger在线文档给前端开发,不过可以直接返回枚举的编码和字典值就可以更直观,所以在项目里怎么实现?可以通过Mybatis的一些接口,自定义枚举类的处理器实现

环境准备

  • 开发环境

    • JDK 1.8
    • SpringBoot2.2.1
    • Maven 3.2+
  • 开发工具

    • IntelliJ IDEA
    • smartGit
    • Navicat15

定义一个接口

先定义一个IEnum接口,@JsonFormat格式为对象返回

package com.example.springboot.mybatis.common.enumhandler;
import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public interface IEnum {
    String getCode();
    String getName();
}

枚举工具类

写一个枚举工具类,根据code和name返回对应枚举类,根据反射获取getEnumConstants,循环匹配

package com.example.springboot.mybatis.common.enumhandler;


public class EnumUtils {

    public static <T extends Enum<?> & IEnum> T codeOf(Class<T> enumCls , String code) {
        T[] enumConstants = enumCls.getEnumConstants();
        for (T t : enumConstants) {
            if (t.getCode().equals(code)) return t;
        }
        return null;
    }

    public static <T extends Enum<?> & IEnum> T nameOf(Class<T> enumCls , String name) {
        T[] enumConstants = enumCls.getEnumConstants();
        for (T t : enumConstants) {
            if (t.getName().equals(name)) return t;
        }
        return null;
    }

}

自定义类型转换器

自定义Mybatis的类型转换器类,继承BaseTypeHandler,里面有几个需要实现的方法

  • void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
    用于定义设置参数时把Java类型的参数转换为对应的数据库类型

  • T getNullableResult(ResultSet rs, String columnName)
    用于定义通过字段名称获取字段数据时把数据库类型转换为对应的Java类型

  • T getNullableResult(ResultSet rs, int columnIndex)
    用于定义通过字段索引获取字段数据时把数据库类型转换为对应的Java类型

  • T getNullableResult(CallableStatement cs, int columnIndex)
    用定义调用存储过程把数据库类型转换为对应的Java类型

package com.example.springboot.mybatis.common.enumhandler;


import cn.hutool.core.lang.Assert;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MybatisEnumCodeTypeHandler<E extends Enum<E> & IEnum> extends BaseTypeHandler<E>{

    private final Class<E> type;

    public MybatisEnumCodeTypeHandler(Class<E> type) {
        Assert.notNull(type , "type argument can not be null");
        this.type = type;
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i , e.getCode());
    }

    @Override
    public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
        String code = resultSet.getString(s);
        return resultSet.wasNull() ? null : EnumUtils.codeOf(this.type , code);
    }

    @Override
    public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
        String code = resultSet.getString(i);
        return resultSet.wasNull() ? null : EnumUtils.codeOf(this.type , code);
    }

    @Override
    public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String code = callableStatement.getString(i);
        return callableStatement.wasNull() ? null : EnumUtils.codeOf(this.type , code);
    }
}

yaml配置类型处理器

application.yml里配置default-enum-type-handler,加上自定义的MybatisEnumCodeTypeHandler

mybatis:
    # 指定sql映射文件位置
    mapper-locations: classpath:mybatis/mapper/*.xml
    configuration:
      default-enum-type-handler: com.example.springboot.mybatis.common.enumhandler.MybatisEnumCodeTypeHandler
      map-underscore-to-camel-case: true

项目中使用

需要的枚举类就继承IEnum接口

package com.example.springboot.mybatis.bean;


import com.example.springboot.mybatis.common.enumhandler.IEnum;

public enum  Sex implements IEnum {

    MAN("1","男"),
    WOMAN("2","女");

    private String code;
    private String name;

    Sex(String code, String name) {
        this.code = code;
        this.name = name;
    }


    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getName() {
        return name;
    }
}

写个接口,参数返回json:文章来源地址https://www.toymoban.com/news/detail-439468.html

{"userId":"1","username":"admin","sex":{"code":"1","name":"男"},"password":"11"}

到了这里,关于Mybatis自定义枚举类处理器优雅地使用枚举的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 如何自定义异常处理器

    在Spring Boot应用程序中,异常处理是一个非常重要的方面。如果您不处理异常,应用程序可能会崩溃或出现不可预料的行为。默认情况下,Spring Boot将未捕获的异常返回给客户端。这通常不是期望的行为,因为客户端可能无法理解异常信息。在本文中,我们将介绍如何在Sprin

    2024年02月06日
    浏览(42)
  • Springboot +spring security,自定义认证和授权异常处理器

    在Spring Security中异常分为两种: AuthenticationException 认证异常 AccessDeniedException 权限异常 我们先给大家演示下如何自定义异常处理器,然后再结合源码帮助大家进行分析 如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。 3.1配置SecurityConfig 这里主要是

    2024年02月07日
    浏览(42)
  • 自定义ZYNQ的PL端数据处理器,通过DMA等进行交互(附GitHub源码)

    摘要:在ZYNQ中设计了自定义的PL端数据处理器,通过DMA连接到AXI总线,完成了PS和该PL端的数据交互等功能。 开发板型号:Zynq-7000 SoC XC7Z305 FPGA 开发平台:Vivado 2019.1; Vivado SDK 2019.1 Github源码 :https://github.com/CY0807/Vivado_FIFO_Test.git (1)vivado_project存放了vivado和sdk原始工程文件

    2024年01月21日
    浏览(44)
  • SpringBoot | RestTemplate异常处理器ErrorHandler使用详解

    关注wx:CodingTechWork   在代码开发过程中,发现很多地方通过 RestTemplate 调用了第三方接口,而第三方接口需要根据某些状态码或者异常进行重试调用,此时,要么在每个调用的地方进行异常捕获,然后重试;要么在封装的 RestTemplate 工具类中进行统一异常捕获和封装。当然

    2024年02月12日
    浏览(43)
  • 编译时注解处理器的一次使用经历

    编译时注解处理器在《深入理解Java虚拟机》一书中有一些介绍(前端编译篇有提到),但一直没有机会使用,直到碰到这个需求,觉得再合适不过了,就简单用了一下,这里做个记录。------原文写于2021年2月8日。 我们为公司提供了一套通用的JAVA组件包,组件包内有不同的模

    2024年02月12日
    浏览(40)
  • jmeter-BeanShell预处理器与BeanShell后置处理器的使用

    BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的松散类型、命令、闭包等通用脚本来对其进行拓展。 前置处理器:请求发送之前对请求参数做一些处理 后置处理器:请求发送完成之后对响应数

    2023年04月17日
    浏览(40)
  • MyBatis:自定义 typeHandler 处理枚举类型

    枚举类型 ,在 Java 中属于基本数据类型,而不是构造数据类型,用于声明一组命名的常数。枚举可以根据 Integer 、Long 、Short 或 Byte 中的任意一种数据类型来创建一种新型变量。这种变量可以设置为已经定义的一组之中的一个,有效防止用户提供无效值,使代码更加清晰。

    2024年02月02日
    浏览(35)
  • ARM处理器架构的Thumb指令集中关于IT指令的使用

    在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了 IT 指令,进一步增强了代码的紧凑性。 Thumb中有一个比较有意思的指令—— IT ,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。

    2024年02月07日
    浏览(49)
  • 虚拟机内存、处理器、内存、快照的修改方法(虚拟机VMware使用技巧 上 )

    1、基础设置 ①、内存 VMware有两项基础的设置 内存 和 处理器 。先说内存设置,主要是设置内存的大小。安装虚拟软件的主机内存最好不低于16G,最好32G。主机内存太小不适合运行虚拟机软件。 16G的内存可以主机和虚拟机对半分,主机留8G,虚拟机分8G。32G的内存可以按照主

    2024年02月09日
    浏览(52)
  • Jmeter前置处理器和后置处理器

    1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 (后处理)的⽅法  正则表达式后置处理器 (1)引⽤名称:下⼀个请求要引⽤的参数名称,如填写title,则可⽤${title}引⽤它 (2)正则表达式: ():括起来的部分就是要提取的。 .:匹配

    2023年04月21日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包