Mybatis Plus自定义枚举类型转换

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

自定义Mybatis的枚举转换

这里实际使用的是mybatis plus的枚举工具,只不过拷贝出来修改为自己的枚举接口以及想用什么值进行转换;我这里使用的是通过数据库里面保存的数字类型进行转换,然后通过自动装配替换原生的枚举类型,原来的类型 MybatisEnumTypeHandler

public class CommonEnumTypeHandler<E extends CommonEnum> extends BaseTypeHandler<E> {

    private static final Map<String, String> TABLE_METHOD_OF_ENUM_TYPES = new ConcurrentHashMap();
    private static final ReflectorFactory REFLECTOR_FACTORY = new DefaultReflectorFactory();
    private final Class<E> enumClassType;
    //当前值的字段类型
    private final Class<?> propertyType;
    //mybatis plus封装的获取值的执行器
    private final Invoker getInvoker;

    public CommonEnumTypeHandler(Class<E> enumClassType) {
        if (enumClassType == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        } else {
            //获取到前字段的枚举类型
            this.enumClassType = enumClassType;
            //获取到枚举类型
            MetaClass metaClass = MetaClass.forClass(enumClassType, REFLECTOR_FACTORY);
            String name = CommonEnum.VALUE_FILED_NAME;
            //如果枚举类型不为 CommonEnum 接口的实现类,
            if (!CommonEnum.class.isAssignableFrom(enumClassType)) {
                name = findEnumValueFieldName(this.enumClassType)
                    .orElseThrow(() -> new IllegalArgumentException(String.format("Could not find @EnumValue in Class: %s.",
                                                                                  this.enumClassType.getName())));
            }
            //通过getter方法来获取到对于属性值的类型
            this.propertyType = ReflectionKit.resolvePrimitiveIfNecessary(metaClass.getGetterType(name));
            this.getInvoker = metaClass.getGetInvoker(name);
        }
    }

    /**
     * 根据枚举类型来获取对应字段的 @EnumValue 注解的值
     *
     * @param clazz
     * @return
     */
    public static Optional<String> findEnumValueFieldName(Class<?> clazz) {
        if (clazz != null && clazz.isEnum()) {
            String className = clazz.getName();
            return Optional.ofNullable(CollectionUtils.computeIfAbsent(TABLE_METHOD_OF_ENUM_TYPES, className, (key) -> {
                Optional<Field> fieldOptional = findEnumValueAnnotationField(clazz);
                return fieldOptional.map(Field::getName).orElse(null);
            }));
        } else {
            return Optional.empty();
        }
    }

    /**
     * 处理字段上是否设置了 EnumValue
     *
     * @param clazz
     * @return
     */
    private static Optional<Field> findEnumValueAnnotationField(Class<?> clazz) {
        return Arrays.stream(clazz.getDeclaredFields()).filter((field) -> field.isAnnotationPresent(EnumValue.class)).findFirst();
    }

    /**
     * 判断是否是CommonEnum的接口实现
     *
     * @param clazz
     * @return
     */
    public static boolean isMpEnums(Class<?> clazz) {
        return clazz != null && clazz.isEnum() && (CommonEnum.class.isAssignableFrom(clazz) || findEnumValueFieldName(clazz).isPresent());
    }

    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        if (jdbcType == null) {
            ps.setObject(i, this.getValue(parameter));
        } else {
            ps.setObject(i, this.getValue(parameter), jdbcType.TYPE_CODE);
        }

    }

    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Object value = rs.getObject(columnName, this.propertyType);
        return null == value && rs.wasNull() ? null : this.valueOf(value);
    }

    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Object value = rs.getObject(columnIndex, this.propertyType);
        return null == value && rs.wasNull() ? null : this.valueOf(value);
    }

    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Object value = cs.getObject(columnIndex, this.propertyType);
        return null == value && cs.wasNull() ? null : this.valueOf(value);
    }

    private E valueOf(Object value) {
        E[] es = (E[]) this.enumClassType.getEnumConstants();
        return (E) Arrays.stream(es).filter((e) -> this.equalsValue(value, this.getValue(e))).findAny().orElse((E) null);
    }

    protected boolean equalsValue(Object sourceValue, Object targetValue) {
        String sValue = StringUtils.toStringTrim(sourceValue);
        String tValue = StringUtils.toStringTrim(targetValue);
        return sourceValue instanceof Number
               &&
               targetValue instanceof Number
               && (new BigDecimal(sValue)).compareTo(new BigDecimal(tValue)) == 0 || Objects.equals(sValue, tValue);
    }

    private Object getValue(Object object) {
        try {
            return this.getInvoker.invoke(object, new Object[0]);
        } catch (ReflectiveOperationException var3) {
            throw ExceptionUtils.mpe(var3);
        }
    }
}

通过自动装配替换原来的枚举类型处理器文章来源地址https://www.toymoban.com/news/detail-736668.html

/**
     * 配置mybatis plus自定义的枚举类型转换器
     *
     * @return
     */
    @Bean
    public ConfigurationCustomizer enumConfigurationCustomizer() {
        return configuration -> configuration.setDefaultEnumTypeHandler(CommonEnumTypeHandler.class);
    }

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

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

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

相关文章

  • MyBatis实现 Java 实体类和数据库中日期类型之间的转换(超详细)

    数据库存储的时间字段的类型是datetime Java实体类的时间字段类型是Date 需求:响应前端的时间字段格式为”yyyy-MM-dd HH:mm:ss“ 1、定义resultMap 定义 Java 对象和数据库表字段的对应关系,在 mapper.xml 文件中使用 #{属性名,jdbcType=数据库字段类型} 来进行参数传递和结果集映射,例如

    2024年02月20日
    浏览(54)
  • Mybatis-Plus通用枚举功能 [MyBatis-Plus系列] - 第493篇

    历史文章( 文章 累计490+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《

    2024年02月08日
    浏览(39)
  • 【Java】Mybatis Plus LambdaQueryWrapper梳理

    为了更方便的实现动态 SQL,Mybatis Plus 在其基础上扩展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了 更加简便的查询语法 ,同时也 避免了 SQL 注入 的风险。 LambdaQueryWrapper 实现了 QueryWrapper 的全部功能,并提供了基于 Lambda 表达式的查询方式,使得查询语法更加优雅。使用 LambdaQ

    2024年02月09日
    浏览(52)
  • Java:mybatis-plus-generator-ui 基于Mybatis-Plus的代码自助生成器

    引用官方文档上的简介: 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等 ,可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。 文档 github: https://github.com/davidfantasy/mybatis-plus-generator-ui gitee: https://g

    2024年02月10日
    浏览(53)
  • 【Java系列】Mybatis-Plus 使用方式介绍

    Mybatis-Plus 提供了多种方式来执行 SQL,包括使用注解、XML 映射文件和 Lambda 表达式等。其中,使用 Lambda 表达式是 Mybatis-Plus 推荐的方式,因为它更加直观和类型安全。 以下是一个使用 Lambda 表达式执行 SQL 的示例,现在我们有一个名为  User  的实体类,其中包含  id 、 name  

    2024年02月07日
    浏览(93)
  • 【Java系列】Mybatis-Plus 使用介绍二

    你只管努力,其他交给时间,时间会证明一切。 MyBatis-Plus 是 MyBatis 的增强工具,它简化了 MyBatis 的开发,并提供了许多实用的功能和工具类。下面是 MyBatis-Plus 的使用方法: 在 Maven 项目中,需要在 pom.xml 文件中添加如下依赖: 其中  mybatis-plus-boot-starter  是 MyBatis-Plus 的 S

    2024年02月08日
    浏览(53)
  • 【Java系列】MyBatis-Plus常见面试题

      MyBatis-Plus是MyBatis框架的一个扩展库,它提供了一系列方便的API和工具,可以简化常见的数据库操作。MyBatis-Plus的优点包括: 提高开发效率:MyBatis-Plus提供了代码生成、分页、查询构建等功能,可以帮助开发人员快速开发数据库相关的功能。 简化操作:MyBatis-Plus提供了一些

    2024年02月08日
    浏览(48)
  • Mybatis自定义枚举类处理器优雅地使用枚举

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

    2024年02月04日
    浏览(39)
  • mybatis-plus如何使用枚举类来实现性别和标签的数字带描述

    文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 一 实体类 二 枚举类  三 持久层 四 控制层  总结 枚举是一种表示一组有限可能取值的数据类型。它具有以下几个好处: 易于理解和维护:枚举提供了一种清晰明了的方式来表示一组具体的取值,使代码更易于理解

    2024年02月11日
    浏览(54)
  • MyBatis与MyBatis-Plus的分页以及转换

    MyBatis和MyBatis-Plus都是Java持久化框架,用于简化数据库访问和操作。它们提供了面向对象的方式来管理关系型数据库中的数据。 MyBatis 是一个轻量级的持久化框架,通过XML或注解配置,将SQL语句与Java对象进行映射,使开发者可以使用简单的API来执行数据库操作。MyBatis支持动态

    2024年02月11日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包