Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自定义MyBatis通用枚举类型处理器 --- 是真的通用

自定义MyBatis通用枚举类型处理器 --- 是真的通用

原创
作者头像
用户9867745
修改于 2024-02-04 02:56:13
修改于 2024-02-04 02:56:13
5050
举报

自定义 MyBatis 通用枚举类型解析器

在使用MyBatis的过程中,我们经常会使用到枚举类型的数据, 一般在保存数据时只是想将枚举类型的code值存入到数据库中,查询时希望能自动根据code值映射出对应的枚举对象出现,而不是查询出code值然后再手动根据code值找到对应的枚举对象的转换

官方注册方案

官方方案:https://mybatis.org/mybatis-3/zh_CN/configuration.html#typeHandlers 无法对所有枚举类型进行通用注册(有可能是没找到正确的方式,如果有,恳请大家指导)

自动注册方案

实现思路如下:

1. 自定义注解用于标识枚举字段code值(可以使用Jackson自带的@JsonValue注解,也可以单独自定义注解),注解标识的字段类型非固定类型,可为`Integer`、`Long`、`String`等其他基本类型或其他类型(其他类型请多测试) 2. 自定义枚举类型处理器MyBatisEnumTypeHandler.java 继承自org.apache.ibatis.type.BaseTypeHandler,用于处理枚举类型数据的保存和查询使用

代码语言:java
AI代码解释
复制
@Slf4j
public class MyBatisEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {

    private final Class<E> type;
    public MyBatisEnumTypeHandler(Class<E> type) {
        this.type = type;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        try {
            Field field = EnumValueMarkerFinder.find(type);
            Object val = field.get(parameter);
            if (jdbcType == null) {
                ps.setObject(i, val);
            } else {
                ps.setObject(i, val, jdbcType.TYPE_CODE);
            }
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Object s = rs.getObject(columnName);
        return findTargetEnum(s, type);
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Object s = rs.getObject(columnIndex);
        return findTargetEnum(s, type);
    }

    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Object s = cs.getObject(columnIndex);
        return findTargetEnum(s, type);
    }

    private E findTargetEnum(Object val, Class<E> type) {
        if (val == null) {
            return null;
        }
        try {
            Field field = EnumValueMarkerFinder.find(type);
            for (E enumConstant : type.getEnumConstants()) {
                Object o = field.get(enumConstant);
                if (val.equals(o)) {
                    return enumConstant;
                }
            }
        } catch (IllegalAccessException e) {
            log.error("Handle enum failed...", e);
        }
        return null;
    }
}

3. 接下来,怎么将自定义的枚举类型处理器用于处理所有枚举类型的数据?

4. 为了实现所有的枚举都自动注册通用类型转换器,这里需要自定义一个配置类CustomizeMyBatisConfiguration.java并实现org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer接口

1. 实现该接口后,可以获取到org.apache.ibatis.session.Configuration配置类, 2. 使用Configuration配置类获取到`TypeHandlerRegistry`注册器, 3. 再使用TypeHandlerRegistry注册器将需要处理的枚举类类型解析器注册进去

代码语言:java
AI代码解释
复制
public class CustomizeMyBatisConfiguration implements ConfigurationCustomizer{ 
    public void customize(Configuration configuration) {
        // 将自定义的通用枚举类型处理器`MyBatisEnumTypeHandler`注册进去
        // Class clazz = null; // 怎么获取到需要处理的枚举类,即字段中标了@JsonValue注解或自定义注解的枚举类? 
        configuration.getTypeHandlerRegistry().register(clazz, new MyBatisEnumTypeHandler<>(clazz));
    }
}

5. 获取所有需要注册到通用枚举类型处理器中的枚举类 1. 在 customize 方法中通过Spring框架中ClassPathScanningCandidateComponentProvider扫描器在`classpath`下扫描出指定包下的枚举类 2. 自定义一个类型过滤器com.kws.mybatis.config.CustomizeMyBatisConfiguration.EnumTypeFilter,用于在类路径扫描时,过滤出需要处理的枚举类(1.枚举类型 2.枚举类型中含有自定义注解字段)

代码语言:java
AI代码解释
复制
public static class EnumTypeFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
        String typeName = metadataReader.getClassMetadata().getSuperClassName();
        if (!ENUM_TYPE.equals(typeName)) {
            return false;
        }
        try {
            Class<?> clazz = ClassUtils.forName(metadataReader.getClassMetadata().getClassName(), getClass().getClassLoader());
            return EnumValueMarkerFinder.hasAnnotation(clazz);
        } catch (ClassNotFoundException e) {
            log.error("EnumTypeFilter match failed. Class not found: " + metadataReader.getClassMetadata(), e);
        }
        return false;
    }
}

3. 过滤出需要处理的枚举类后,通过`TypeHandlerRegistry`将当前枚举类型使用通用的枚举类型处理器注册到类型处理器中 4. 具体注册代码如下

代码语言:java
AI代码解释
复制
@Slf4j
@Component
public class CustomizeMyBatisConfiguration implements ConfigurationCustomizer {
    /**
    * 可改成读取配置文件包路径.
    * 注意:
    * 如果需要从配置文件读取,直接通过@Value注解注入不会生效,
    * 需要实现EnvironmentAware接口,通过EnvironmentAware接口获取配置
    */
    private static final String BASE_SCAN_PACKAGE = "com.kws";
    public static final String ENUM_TYPE = "java.lang.Enum";

    @Override
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void customize(Configuration configuration) {
        ClassPathScanningCandidateComponentProvider classPathScanning = new ClassPathScanningCandidateComponentProvider(false);
        classPathScanning.addIncludeFilter(new EnumTypeFilter());
        Set<BeanDefinition> enumsBeanDefinitions = classPathScanning.findCandidateComponents(BASE_SCAN_PACKAGE);
        if (CollectionUtils.isEmpty(enumsBeanDefinitions)) {
            return;
        }

        for (BeanDefinition bd : enumsBeanDefinitions) {
            try {
                log.info("====== register TypeHandler for Enum ======【{}】", bd.getBeanClassName());
                Class clazz = ClassUtils.forName(Objects.requireNonNull(bd.getBeanClassName()), getClass().getClassLoader());
                configuration.getTypeHandlerRegistry().register(clazz, new MyBatisEnumTypeHandler<>(clazz));
            } catch (Exception e) {
                log.error("====== Register Mybatis TypeHandler Failed. Enum:【{}】", bd.getBeanClassName(), e);
            }
        }
    }

    /**
    * 自定义枚举类型过滤器 <p>
    * 1.过滤枚举类型 <p>
    * 2.枚举类型字段必须打了枚举类型注解(或自定义注解) <p>
    *
    * @author kws
    * @date 2024-01-14 17:19
    */
    public static class EnumTypeFilter implements TypeFilter {
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
            String typeName = metadataReader.getClassMetadata().getSuperClassName();
            if (!ENUM_TYPE.equals(typeName)) {
                return false;
            }
            try {
                Class<?> clazz = ClassUtils.forName(metadataReader.getClassMetadata().getClassName(), getClass().getClassLoader());
                return EnumValueMarkerFinder.hasAnnotation(clazz);
            } catch (ClassNotFoundException e) {
                log.error("EnumTypeFilter match failed. Class not found: " + metadataReader.getClassMetadata(), e);
            }
            return false;
        }
    }
}

完整代码已发布github

github: enum-mapping 模块:`enum-mapping-mybatis`

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
达芬奇DaVinci下载:经典调色软件DaVinci Resolve Studio下载安装教程
达芬奇调色软件是一款专业的视频后期处理工具,它可以帮助用户对视频进行色彩调整、特效添加、剪辑和输出等操作。这个软件非常适合那些从事影视后期制作、广告制作、影音制作、摄影等领域的专业人士,但也可以被普通用户用来编辑家庭录像、旅游视频等。
用户10413399
2023/03/21
1.3K0
达芬奇DaVinci下载:经典调色软件DaVinci Resolve Studio下载安装教程
davinci软件是干嘛的?视频调色davinci达芬奇中文版下载安装教程
Davinci软件是一款专业的视频编辑软件,它可以帮助你制作出高质量的视频作品。这个软件的出现,让视频制作变得更加简单和高效。
用户10436734
2023/03/31
5410
davinci软件是干嘛的?视频调色davinci达芬奇中文版下载安装教程
视频调色软件达芬奇最新中文版,达芬奇DaVinci 18安装教程下载
DaVinci软件是一款专业的视频编辑软件,可以帮助用户将多个视频片段、音频、图片等素材进行剪辑、合成、调整效果等操作,最终制作出高质量的视频作品。
用户10413399
2023/03/21
6220
视频调色软件达芬奇最新中文版,达芬奇DaVinci 18安装教程下载
视频调色软件达芬奇下载安装,Davinci达芬奇18.5中文版
Davinci是一款由黑魔法公司(Blackmagic Design)开发的专业视频剪辑和调色软件,其功能强大、效果高超,被广泛应用于电影、电视等各大媒体领域。然而,由于其复杂性和多样化的功能,很多用户不熟悉或不规范使用,导致处理结果不佳或者出现错误。因此,正确使用Davinci是非常重要的,本文将通过具体案例分享和常见问题解答,为用户提供详细的使用指南和技巧。
优木软件
2023/04/28
5570
专业视频调色软件达芬奇中文版,达芬奇DaVinci18软件下载安装
达芬奇软件(DaVinci Resolve)是一款专业的视频后期制作软件,由Blackmagic Design公司开发和发布。该软件被广泛用于电影、电视剧、广告、纪录片和独立制片等领域,可以用于剪辑、特效、音频处理和调色等工作。在业内享有很高的声誉,被誉为最强大的视频后期制作软件之一。
用户10413399
2023/03/16
6980
专业视频调色软件达芬奇中文版,达芬奇DaVinci18软件下载安装
电影级视频调色达芬奇DaVinci软件中文版,达芬奇DaVinci软件安装激活
达芬奇软件是一款专业的视频编辑软件,它可以帮助你制作出高质量的电影、电视节目、广告等视频作品。它的功能非常强大,包括剪辑、调色、特效、音频等方面。
用户10436734
2023/03/20
6670
电影级视频调色达芬奇DaVinci软件中文版,达芬奇DaVinci软件安装激活
DaVinci达芬奇软件下载,DaVinci软件中文版视频调色win/mac下载
DaVinci调色软件是一种专业的数字调色工具,适用于影视、广告、纪录片等多种影视制作领域。本文主要探讨了基于DaVinci调色软件的电影制作的应用和价值。从软件功能、调色原理、应用场景等方面进行了详细介绍,并结合案例分析,阐述了其在电影制作中的重要作用。最后对其在未来的发展趋势进行了展望。
用户10410624
2023/04/12
6910
Davinci软件下载,Davinci 达芬奇中文版 win/mac视频调色下载
Davinci Resolve是一款视频剪辑软件,它可以帮助用户实现视频素材的处理、编辑和后期调色等功能。由于其强大的功能和简单易学的操作,越来越多的用户开始使用该软件。本文将介绍Davinci Resolve软件的使用方法,以帮助读者更好地了解和掌握该软件的操作和应用。
用户10413399
2023/04/13
6540
Davinci 软件怎么下载?视频调色软件Davinci达芬奇下载安装
本文将详细介绍 Davinci 软件的特色和使用方法。该软件是一款视频剪辑工具,功能强大,操作简单,广泛应用于影视制作等领域。文章从软件的特点与优势入手,详细阐述了软件的各种功能及其使用方法,并通过实例来说明软件在实际操作中的具体流程。
用户10413399
2023/04/17
1.1K0
达芬奇Davinci18软件介绍及安装教程,含全版本安装包,和pr比较
Davinci Resolve 18和Adobe Premiere Pro是两款非常受欢迎的视频编辑软件,如果您注重颜色校正和渲染速度,那么Davinci Resolve可能更适合您。如果您需要广泛的兼容性和更多的高级功能,则Adobe Premiere Pro可能更适合您。
小昭在奔跑
2023/04/15
5410
达芬奇Davinci18软件介绍及安装教程,含全版本安装包,和pr比较
DaVinci Resolve Studio 18 for Mac(达芬奇调色软件)
DaVinci Resolve Studio 18 for Mac是一款Mac的达芬奇调色软件,DaVinci Resolve 18是一次重大更新,这一版本汇集了超过100项新功能和200项改进!调色页面设立了新的HDR调色工具,重新设计了一级校色控制工具,并添加了基于AI的Magic Mask遮罩等功能。Fairlight更新了能提高工作效率的鼠标和键盘编辑选择工具,以及Fairlight Audio Core和FlexBus新一代音频引擎和总线架构,能支持多达2000条轨道处理!此外,软件还为剪辑师提供了元数据场记板视图,添加了媒体夹分隔线,用于音频修剪的波形图缩放显示,智能画面重构、统一检查器和数十项可为您节省时间的实用工具。
Mac小小心
2023/03/31
7790
DaVinci Resolve Studio 18 for Mac(达芬奇调色软件)
专业视频调色 Davinci 软件18.5中文版安装包下载,Davinci 安装
随着数字媒体技术的迅速发展,视频内容的制作和编辑已经成为现代社会中必不可少的部分。Davinci Resolve软件是一款专业的视频剪辑软件,提供了丰富的功能和易用性,深受编辑人员的喜爱。本文将探讨Davinci Resolve软件的特色功能和使用方法,并通过一个详细的操作指南演示如何使用Davinci Resolve软件进行视频编辑和处理。
用户10436734
2023/04/20
3310
专业视频调色软件达芬奇18中文版,Davinci达芬奇调色软件安装教程
DaVinci Resolve 是一款功能强大、易于使用的视频后期制作软件,适用于各种视频制作领域的用户。它提供了先进的视频编辑、色彩校正和音频后期处理功能,让用户可以轻松地制作出高质量的视频作品。
用户10436734
2023/04/06
5490
专业视频调色软件达芬奇18中文版,Davinci达芬奇调色软件安装教程
davinci软件是干嘛的?Davinci达芬奇调色下载安装,功能介绍
达芬奇调色软件是一款功能强大的视频编辑软件,由于其广泛的应用和高效的性能,被众多影视制作公司所使用。除了常规的视频剪辑、音频处理和调色等功能外,达芬奇调色软件还拥有许多独特的功能,本文将结合实际案例,介绍关于达芬奇调色软件独特功能。
用户10410624
2023/05/03
5760
DaVinci Resolve Studio 18 for Mac(达芬奇调色软件)
DaVinci Resolve Studio 18是一款功能强大的视频编辑软件,它是Blackmagic Design公司开发的,被广泛应用于电影、电视剧、广告、音乐视频等领域。DaVinci Resolve Studio 18集成了视频编辑、色彩校正、音频后期制作和视觉特效等多种功能,可以满足专业影视制作的各种需求。它支持多种视频格式,包括4K、8K和HDR等高分辨率视频,同时还提供了多种输出选项,包括YouTube、Vimeo、Facebook等常见的视频分享平台。
用户10121095
2023/03/19
5590
影视后期:Pr 调色处理之风格调色
「 简单地说就是害怕向前迈进或者是不想真正地努力。不愿意为了改变自我而牺牲目前所享受的乐趣——比如玩乐或休闲时间。也就是拿不出改变生活方式的“勇气”,即使有些不满或者不自由,也还是更愿意维持现状 -----《被讨厌的勇气》 」
山河已无恙
2024/01/03
5900
影视后期:Pr 调色处理之风格调色
DaVinci(达芬奇)18.5软件安装包,达芬奇调色软件安装教程及功能
作为一款强大的视频编辑软件,Davinci Resolve 能够提供给用户许多独特功能和工具,使得视频编辑变得更加高效、精准和专业化。下面,我将通过实际案例来介绍 Davinci Resolve 的一些独特功能,并帮助大家更好地理解和使用这个优秀的软件。
优木软件
2023/05/10
5490
PR软件下载,Adobe PR软件2023中文版 win/mac电脑下载安装教程
本论文主要探讨影视后期制作中常用的PR软件,阐述了PR软件的基本概念、使用方法和应用场景,并通过实例来展示PR在剪辑、调色和特效制作等方面的应用。
用户10436734
2023/04/13
8520
视频后期利器,Davinci Resolve 12助你打造高品质影片!+全版本安装包
Davinci Resolve 12是Blackmagic Design公司推出的一款专业级别的视频后期制作软件,其功能强大且专业,在视频制作、后期调色、音频处理等方面得到了广泛应用。与其他视频后期处理软件 相比,Davinci Resolve 12极具特色,它不仅支持多平台,还集成了无数突破性的功能和工具,特别注重视频的调色功能,在影片的色彩处理上提供了无限的控制能力。
用户10313071
2023/04/17
4290
视频后期利器,Davinci Resolve 12助你打造高品质影片!+全版本安装包
全版本pr(Premiere软件)下载地址(包括最新的2023)-21安装教程
Adobe Premiere 是一款迄今为止世界上最流行的视频编辑软件。随着科技的进步, Adobe Premiere 不仅可以编辑、裁剪和处理视频文件,还可以进行高级彩色调整 。
用户8187027
2023/03/30
8060
推荐阅读
达芬奇DaVinci下载:经典调色软件DaVinci Resolve Studio下载安装教程
1.3K0
davinci软件是干嘛的?视频调色davinci达芬奇中文版下载安装教程
5410
视频调色软件达芬奇最新中文版,达芬奇DaVinci 18安装教程下载
6220
视频调色软件达芬奇下载安装,Davinci达芬奇18.5中文版
5570
专业视频调色软件达芬奇中文版,达芬奇DaVinci18软件下载安装
6980
电影级视频调色达芬奇DaVinci软件中文版,达芬奇DaVinci软件安装激活
6670
DaVinci达芬奇软件下载,DaVinci软件中文版视频调色win/mac下载
6910
Davinci软件下载,Davinci 达芬奇中文版 win/mac视频调色下载
6540
Davinci 软件怎么下载?视频调色软件Davinci达芬奇下载安装
1.1K0
达芬奇Davinci18软件介绍及安装教程,含全版本安装包,和pr比较
5410
DaVinci Resolve Studio 18 for Mac(达芬奇调色软件)
7790
专业视频调色 Davinci 软件18.5中文版安装包下载,Davinci 安装
3310
专业视频调色软件达芬奇18中文版,Davinci达芬奇调色软件安装教程
5490
davinci软件是干嘛的?Davinci达芬奇调色下载安装,功能介绍
5760
DaVinci Resolve Studio 18 for Mac(达芬奇调色软件)
5590
影视后期:Pr 调色处理之风格调色
5900
DaVinci(达芬奇)18.5软件安装包,达芬奇调色软件安装教程及功能
5490
PR软件下载,Adobe PR软件2023中文版 win/mac电脑下载安装教程
8520
视频后期利器,Davinci Resolve 12助你打造高品质影片!+全版本安装包
4290
全版本pr(Premiere软件)下载地址(包括最新的2023)-21安装教程
8060
相关推荐
达芬奇DaVinci下载:经典调色软件DaVinci Resolve Studio下载安装教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档