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

MyBatis(17)MyBatis 如何处理枚举类型

MyBatis 处理枚举类型的机制相对直接,它提供了一种灵活的方式来处理Java枚举(enum)类型和数据库之间的映射。在MyBatis中,你可以通过两种方式处理枚举类型:使用枚举的名称(name)或者枚举的序号(ordinal)。此外,对于更复杂的需求,MyBatis允许你通过实现TypeHandler接口自定义枚举类型的处理器。

使用枚举名称(name)或序号(ordinal

默认情况下,MyBatis在处理枚举类型时,会使用枚举的名称(name)与数据库中的字符串值进行匹配和映射。如果你的数据库设计是使用枚举的名称来存储的话,这种方式非常直接和便利。

例如,考虑下面的枚举:

public enum Status {ACTIVE, INACTIVE, DELETED;
}

在MyBatis的映射文件中,如果你有一个返回Status枚举的查询,你可以直接这样写:

<select id="selectStatus" resultType="Status">SELECT status FROM some_table WHERE id = #{id}
</select>

MyBatis会自动将数据库中返回的status字符串值映射到Status枚举的名称上。

如果你倾向于使用枚举的序号(每个枚举常量在声明中的位置,从0开始)进行存储和匹配,你需要自定义TypeHandler来实现这一点。

自定义TypeHandler

当你需要以非标准方式处理枚举类型时(例如,使用枚举的ordinal值,或者枚举中定义的某个字段),你可以通过实现TypeHandler接口来自定义枚举的持久化逻辑。

以下是一个使用枚举序号进行映射的TypeHandler示例:

@MappedTypes(Status.class)
public class StatusTypeHandler extends BaseTypeHandler<Status> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException {ps.setInt(i, parameter.ordinal());}@Overridepublic Status getNullableResult(ResultSet rs, String columnName) throws SQLException {int ordinal = rs.getInt(columnName);if (rs.wasNull()) {return null;}return Status.values()[ordinal];}@Overridepublic Status getNullableResult(ResultSet rs, int columnIndex) throws SQLException {int ordinal = rs.getInt(columnIndex);if (rs.wasNull()) {return null;}return Status.values()[ordinal];}@Overridepublic Status getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {int ordinal = cs.getInt(columnIndex);if (cs.wasNull()) {return null;}return Status.values()[ordinal];}
}

在这个自定义TypeHandler中,我们覆盖了setNonNullParameter方法来定义如何将Status枚举设置到PreparedStatement中,以及覆盖了getNullableResult方法定义如何从ResultSet中读取数据并转换为Status枚举。

在MyBatis配置中注册TypeHandler

定义了TypeHandler之后,还需要在MyBatis配置文件中进行注册:

<typeHandlers><typeHandler handler="path.to.StatusTypeHandler"/>
</typeHandlers>

深入解析

MyBatis在处理枚举类型时实际上是通过TypeHandler机制来实现的。所有的枚举类型处理最终都是通过相应的TypeHandler来完成数据的转换和映射。

  • 默认枚举处理: 对于枚举类型,MyBatis内部默认使用EnumTypeHandler(基于枚举的name处理)和EnumOrdinalTypeHandler(基于枚举的ordinal处理)。
  • 自定义处理逻辑: 通过实现TypeHandler接口,开发者可以自定义枚举类型的处理逻辑,以适应不同的业务需求。这一机制提供了极高的灵活性。

总结

MyBatis通过TypeHandler机制提供了对枚举类型的灵活支持,无论是使用枚举的名称还是序号,还是需要实现更复杂的枚举处理逻辑,MyBatis都能够提供相应的解决方案。通过自定义TypeHandler,可以实现几乎任何形式的枚举类型持久化策略。

相关文章:

MyBatis(17)MyBatis 如何处理枚举类型

MyBatis 处理枚举类型的机制相对直接&#xff0c;它提供了一种灵活的方式来处理Java枚举&#xff08;enum&#xff09;类型和数据库之间的映射。在MyBatis中&#xff0c;你可以通过两种方式处理枚举类型&#xff1a;使用枚举的名称&#xff08;name&#xff09;或者枚举的序号&…...

云数据中心运维新纪元:让Linux服务器如虎添翼

文章目录 一、Linux系统管理的高级技巧1. 性能调优与监控&#xff1a;2. 自动化与脚本编写&#xff1a;3. 文件系统与存储管理&#xff1a; 二、服务器配置优化的策略1. 硬件选型与配置&#xff1a;2. 网络配置与优化&#xff1a;3. 应用部署与调优&#xff1a; 三、安全策略的…...

C# 多线程造成CPU占用率高

当线程多的时候就会造成CPU内存占用率过高 private void button1_Click(object sender, EventArgs e){Thread TH1, TH2, TH3, TH4, TH5;TH1 new Thread(Thread1){IsBackground true};TH2 new Thread(Thread2){IsBackground true};TH3 new Thread(Thread3){IsBackground t…...

谈谈在不同公司中的SAP职位

今天反客为主&#xff0c;聊一下这个HR的话题&#xff0c;考虑到SAP职位的专业性&#xff0c;感觉还是有必要谈一谈这个话题。最近跟几位HR的小伙伴聊了一下&#xff0c;讨论了下不同公司的SAP职位的招聘要求&#xff0c;感觉还是有那么几个存在的问题&#xff1a; 追求完美的…...

服务器连接不上

记录今天2024/07/02的问题&#xff1a; 我今天真的是非常无语&#xff0c;今天在连服务器的时候&#xff0c;突然发现连不上了。 后来才意识到&#xff0c;原来是我笔记本先是开了全局代理&#xff0c;然后再用easy connected连接。当时还跳出了一个窗口如下&#xff0c;我当时…...

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…...

安卓实现微信聊天气泡

一搜没一个能用的&#xff0c;我来&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...

软件测试(功能、接口、性能、自动化)详解 | 测试人生路

一、软件测试功能测试 测试用例编写是软件测试的基本技能&#xff1b;也有很多人认为测试用例是软件测试的核心&#xff1b;软件测试中最重要的是设计和生成有效的测试用例&#xff1b;测试用例是测试工作的指导&#xff0c;是软件测试的必须遵守的准则。 黑盒测试常见测试用…...

【面试题】网络IO模型

IO&#xff08;Input/Output&#xff09;模型指的是计算机系统中对输入/输出操作进行处理的不同方式。它定义了操作系统内核、应用程序和I/O设备之间如何交互和协调数据传输。不同的IO模型在效率、复杂性和适用场景方面都有所差异。以下是几种主要的IO模型及其特点&#xff1a;…...

数据结构-----【链表:基础】

链表基础 1、链表的理论基础 1&#xff09;基础&#xff1a; 链表&#xff1a;通过指针串联在一起的线性结构&#xff0c;每个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个指针…...

如何在pycharm里面运行pytest用例

pycharm运行三种方式 1.以xx.py脚本方式直接执行&#xff0c;当写的代码里面没用到unittest和pytest框架时&#xff0c;并且脚本名称不是以test_开头命名的&#xff0c;此时pycharm会以xx.py脚本方式运行 2.当脚本命名为test_xx.py时&#xff0c;用到unittest框架&#xff0c…...

Charles抓包工具踩坑记录

请添加图片描述 Charles抓包工具 证书问题 输入网址&#xff1a;chls.pro/ssl 第一个下载证书网址&#xff0c;会出现一直加载不出来&#xff0c;无法下载证书的情况 解决&#xff1a;选择下面save Charles Root。。。 2 证书在mac中禁止修改问题 解决也很简单&#xff0c;按照…...

【RabbitMQ实战】邮件发送(直连交换机、手动ack)

一、实现思路 二、异常情况测试现象及解决 说明:本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认机制 、消费确认机制 、消息的重新投递 、消费幂等性, 二、实现思路 1.简略介绍163邮箱授权码的获取 2.编写发送邮件工具类 3.编写RabbitMQ配置文件 4.生产者发起调用…...

python 笔试面试八股(自用版~)

1 解释型和编译型语言的区别 解释是翻译一句执行一句&#xff0c;更灵活&#xff0c;eg&#xff1a;python; 解释成机器能理解的指令&#xff0c;而不是二进制码 编译是整个源程序编译成机器可以直接执行的二进制可运行的程序&#xff0c;再运行这个程序 比如c 2 简述下 Pyth…...

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…...

腾讯地图异步调用

<template><!-- 定义地图显示容器 --><div id"container"></div> </template><script setup>import { onMounted } from vue;const mapKeys import.meta.env.VITE_GLOB_TX_MAP_KEYS;function initMap() {// //定义地图中心点坐…...

通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID

有时候经常会有个别容器占用磁盘空间特别大&#xff0c; 这个时候就需要通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID&#xff1a; 1、 首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多 [rootPPS-97-8-ALI-HD1H overlay2]# cd /var/lib/doc…...

每周算法:有向图强连通分量

题目链接 受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂&#xff0c;每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 A A A 喜欢 B B B&#xff0c; B B B 喜欢 C C C&#xff0c;那…...

Python习题 053:在逻辑值检测时会被认为是真值的是?

...

基于RackNerd + CentOS 7 64 Bit + aaPanel 的那些事

本文涉及以下几个站点&#xff1a; RackNerd - Introducing Infrastructure Stability NameSilo - https://www.namesilo.com/ aaPanel - https://www.aapanel.com/ 遇到错误 Cannot find a valid baseurl for repo: base/7/x86_64 解决办法 一、切换 yum源 首先可以去…...

BaklavaJS执行引擎详解:实现节点图的拓扑排序与数据流计算 [特殊字符]

BaklavaJS执行引擎详解&#xff1a;实现节点图的拓扑排序与数据流计算 &#x1f680; 【免费下载链接】baklavajs Graph / node editor in the browser using VueJS 项目地址: https://gitcode.com/gh_mirrors/ba/baklavajs BaklavaJS是一个基于VueJS的强大浏览器图形节…...

如何用RPG Maker多层级视差地图插件创建专业级游戏场景?

如何用RPG Maker多层级视差地图插件创建专业级游戏场景&#xff1f; 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV RPG Maker多层级视差地图插件是一个功能强大的开源工具&#xf…...

收藏!小白程序员必看:大模型AI入门学习指南,带你玩转制造业全流程

收藏&#xff01;小白程序员必看&#xff1a;大模型AI入门学习指南&#xff0c;带你玩转制造业全流程 本文深入探讨了AI技术在制造业全流程中的应用及其重要意义。文章从研发设计、生产制造、运营管理和产品服务等环节入手&#xff0c;详细阐述了AI技术如何通过优化流程、提高效…...

3分钟解锁B站评论区的“读心术“:揭秘用户真实身份的完整指南

3分钟解锁B站评论区的"读心术"&#xff1a;揭秘用户真实身份的完整指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-c…...

人机协同中的“因为-所以”、“if-then”(如果-那么)

在人机协同中&#xff0c;“因为-所以”和“if-then”&#xff08;如果-那么&#xff09;是两种截然不同但紧密相关的逻辑范式。简单来说&#xff0c;“if-then”是机器的“计算”语言&#xff0c;而“因为-所以”是人类“算计&#xff08;谋算&#xff09;”与因果推理的核心。…...

POE是什么?

POE 一般指 Power over Ethernet(以太网供电)。 通俗理解 用 一根网线(RJ45) 同时做两件事: 传数据(上网、通信) 给设备供电(不用单独再接电源适配器) 常见场景:IP 摄像头、无线 AP、部分 Orange Dongle / 底座,实验室用 PoE 交换机或 PoE 适配器 给 Dongle 供电…...

Wonder3D:用一张照片开启3D建模新纪元

Wonder3D&#xff1a;用一张照片开启3D建模新纪元 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 还在为复杂的3D建模软件头疼吗&#xff1f;今天我要向你介绍一…...

当代酷刑:如厕等信号

如厕等信号&#xff0c;属于当代十大酷刑之一。作为社会观察理性分析的结合体&#xff0c;今天&#xff0c;我想写一些这物理世界的墙&#xff0c;也是这消费世界的墙。你有没有过这样的感受&#xff1f;不管你家里换了多么厉害的宽带&#xff0c;多么高端前沿的路由器&#xf…...

终极RPG Maker视差地图插件指南:零代码打造专业级游戏场景

终极RPG Maker视差地图插件指南&#xff1a;零代码打造专业级游戏场景 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 你是否曾经梦想创建拥有电影级视觉效果的RPG游戏地图&#xf…...

域自适应学习研究新进展

篇名问题背景方法其他域自适应学习研究进展目前关于域自适应学 习产生了大量的理论研究成果, 提出了新的学习算 法, 但是这些理论研究所涉及的领域庞杂, 如统计分 类、自然语言处理、情感分析、机器翻译、气象分析 等领域, 研究内容往往涉及域自适应学习的某一方 面, 存在着概念…...