MyBatis:自定义 typeHandler 处理枚举类型

MyBatis

  • 枚举类型
  • typeHandler

在这里插入图片描述

枚举类型

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

简单示例:
首先,创建枚举类型 UserState

package cn.edu.MyBatisDemo.enums;//使用枚举将实体类 User 的 state 属性设定为三种状态
public enum UserState {//每个枚举对象有四种值:索引值(从0开始)、名字(如 OnLine )、属性1(如343)、属性2(如在线)OnLine(343,"在线"),OffLine(8899,"离线"),BeBusy(1414,"忙碌");private int code; //定义括号中第一个属性private String msg; //定义括号中第二个属性private UserState(int code,String msg){this.code = code;this.msg = msg;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}//通过 code 值获取对应的枚举对象public static UserState getUserStateByCode(int code){if(code == 343){return UserState.OnLine;} else if (code == 8899){return UserState.OffLine;} else {return UserState.BeBusy;}}
}

然后,创建获取枚举对象四种值的测试类 EnumTest

package cn.edu.MyBatisDemo.test;import cn.edu.MyBatisDemo.enums.UserState;
import org.junit.Test;public class EnumTest {@Testpublic void enumTest(){UserState userState = UserState.OnLine;//获取枚举对象的四种值System.out.println(userState.ordinal()); //索引值System.out.println(userState.name()); //名字System.out.println(userState.getCode()); //属性1System.out.println(userState.getMsg()); //属性2}
}

最后,测试结果,结果如图:
在这里插入图片描述

typeHandler

typeHandler,是 MyBatis 中的一个接口,用于处理数据库中的特定数据类型。MyBatis 默认提供了两个枚举数据类型的 typeHandler — EnumTypeHandlerEnumOrdinalTypeHandler 。在 MyBatis 中,也可以通过自定义 typeHandler 来处理数据库中的特定数据类型。另外,创建自定义的 typeHandler ,需要实现 typeHandler 接口,并实现其中的几个方法。下面简单介绍创建自定义 typeHandler 来处理枚举类型。

简单示例:
首先,创建一个数据表 enum_user
表结构信息如图:
在这里插入图片描述

接着,通过 Generator 来根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件
在这里插入图片描述

然后,在自动生成后,需要将实体类 state 属性的类型修改为 UserState 类型,同时添加上 toString() 方法
在这里插入图片描述
另外,还需要将 SQL 映射文件中所有 state 指定的 jdbcType 部分去除
在这里插入图片描述

在创建自定义 typeHandler 前,先了解 typeHandler 默认使用的是 EnumTypeHandler ,属性 state 信息在数据库中的值为四种值中的名字(BeBusy);而若指定使用 EnumOrdinalTypeHandler ,则属性 state 信息在数据库中的值为四种值中的索引值(2)
在这里插入图片描述
在这里插入图片描述

这些往往不是所需要的结果。所以,需要创建自定义 typeHandler 将属性 state 信息在数据库中的值设定为四种值中的属性1(1414)。创建实现 TypeHandler< T > 接口的类 CustomTypeHandler

package cn.edu.MyBatisDemo.enums;import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class CustomTypeHandler implements TypeHandler<UserState> {@Overridepublic void setParameter(PreparedStatement preparedStatement, int i, UserState userState, JdbcType jdbcType) throws SQLException {preparedStatement.setObject(i,userState.getCode());}@Overridepublic UserState getResult(ResultSet resultSet, String s) throws SQLException {int code = resultSet.getInt(s);return UserState.getUserStateByCode(code);}@Overridepublic UserState getResult(ResultSet resultSet, int i) throws SQLException {int code = resultSet.getInt(i);return UserState.getUserStateByCode(code);}@Overridepublic UserState getResult(CallableStatement callableStatement, int i) throws SQLException {int code = callableStatement.getInt(i);return UserState.getUserStateByCode(code);}
}

随之,在全局配置文件 mybatis.xml 中配置指定使用自定义的 typeHandler

<typeHandlers><typeHandler handler="cn.edu.MyBatisDemo.enums.CustomTypeHandler" javaType="cn.edu.MyBatisDemo.enums.UserState" />
</typeHandlers>

最后,测试结果
在这里插入图片描述

结果如图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…

Appium,多应用程序平台的 UI 自动化

Appium是一个开源的移动应用程序自动化测试工具&#xff0c;可以用于跨平台的UI自动化&#xff0c;包括iOS、Android、Web和Windows应用程序。它基于WebDriver协议&#xff0c;支持多种编程语言&#xff0c;如Java、Python、Ruby,Javascript、C#等。 Appium的设计理念是“一次…

Android studio GridView应用设计

一、xml布局文件设计: <GridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="match_parent"tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp"andr…

websocket: 了解并利用nodejs实现webSocket前后端通信

目录 第一章 前言 1.1 起源 1.2 短轮询与长轮询 1.2.1 短轮询 1.2.2 长轮询 1.2.3 长连接&#xff08;SSE&#xff09; 1.2.4 websocket 第二章 利用Node以及ws创建webSocket服务器 2.1 创建ws服务器&#xff08;后端部分&#xff09; 2.1.1 了解一下 2.1.2 代创建W…

从研发转销售,90后联合创始人分享从 0 到 1 开拓市场的秘诀

小 T 导读&#xff1a;在去年涛思数据举办的 TDengine 开发者大会上&#xff0c;侯江燚以联合创始人的身份登台演讲&#xff0c;将自己对于开源商业化的独特观点娓娓道来&#xff0c;赢得阵阵掌声。今年是他加入涛思数据的第五年&#xff0c;从放弃读博选择成为一名研发&#x…

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验&#xff1a;https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程&#xff1a;https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中&#xff0c;有效地管理日常任务对于提高生…

K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用

最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…

HarmonyOS应用开发学习笔记 UI布局学习 相对布局 (RelativeContainer)

UI布局学习 之 相对布局 &#xff08;RelativeContainer&#xff09; 官方文档 一、关键字 RelativeContainer&#xff0c; alignRules&#xff08;适配规则&#xff09; Text(Text02).alignRules({left: { anchor: text01, align: HorizontalAlign.Start },top: { anchor: t…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(3) 质量刚体的在坐标系下运动

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

WAF(Web应用防火墙)全面解析

Web应用防火墙&#xff08;WAF&#xff09;是确保网络安全的重要工具&#xff0c;尤其在保护Web应用免受各种网络攻击方面发挥着至关重要的作用。以下是关于WAF的各方面详细介绍&#xff1a; 定义和目的 WAF是一种特殊类型的防火墙&#xff0c;专门设计用于监视、过滤和阻挡进…

增广路算法 DFS求解 最大网络流问题

最大网络流问题 最大网络流问题是这样的&#xff0c;有一个有向图&#xff0c;假定有一个源点&#xff0c;有一个汇点&#xff0c;源点有流量出来&#xff0c;汇点有流量进入&#xff0c;有向图上的边的权重为该条边可通过的最大流量(方向为边的方向)&#xff0c;问从源点到汇…

的修平台——院校智能报修的强大助手,轻松解决报修难题!

在当今信息化时代&#xff0c;智能化的后勤管理成为了提升院校服务水平的关键。其中&#xff0c;报修流程的智能化改革更是重中之重。面对传统报修方式存在的种种问题&#xff0c;如报修流程冗长、信息沟通不畅、进度难以跟踪等&#xff0c;的修平台应运而生&#xff0c;为院校…

自动化测试框架pytest系列之基础概念介绍(一)

如果你要打算学习自动化测试 &#xff0c;无论是web自动化、app自动化还是接口自动化 &#xff0c;在学习的道路上&#xff0c;你几乎会遇到pytest这个测试框架&#xff0c;因为自动化编写没有测试框架&#xff0c;根本玩不了 。 如果你已经是一位自动化测试人员 &#xff0c;…

HarmonyOS鸿蒙应用开发——原生与H5通信框架DSBrigde-HarmonyOS

文章目录 介绍安装使用原生JavaScript进度回调 参考 介绍 HarmonyOS版的DSBridge&#xff0c;通过本库可以在鸿蒙原生与JavaScript完成交互&#xff0c;相互调用彼此的功能。 目前兼容Android、iOS第三方DSBridge库的核心功能&#xff0c;基本保持原来的使用方式&#xff0c;…

c++|关键字extern

一个C语言项目往往由多个文件组合而成。而对于多个文件来说&#xff0c;它们可能会共用到一些相同的变量。而有些情况下&#xff0c;这些相同的变量并没有出现在本文件内&#xff0c;有可能在其他文件内。而一个文件可能只会搜寻该文件内部是否有该变量。 所以&#xff0c;需要…

c++的构造函数

目录 构造函数 1.构造函数&#xff1a; 2.构造函数的特点&#xff1a; 默认构造函数 -- 没有参数的构造函数 1. 合成(自动)的默认构造函数(一般不常用) 1&#xff09; 介绍&#xff0c;以及为什么不使用 2&#xff09;可以使用合成默认构造函数的情况 2. 自定义的默认…

xss-labs(6-9)

level6:欢迎来到level6 老规矩还是先看看输入框的闭合情况 尝试事件函数绕过 test" onclick="alert(欢迎来钓鱼) 既然事件函数被转义了,那就使用我们第二关用过的绕过方法插入标签看看 test"><script>alert(欢迎来钓鱼)</script>// <

新书速览|循序渐进Vue.js 3.x前端开发实战

Vue.js初学者和前端开发人员使用&#xff0c;网课、培训机构与大中专院校的教学用书 作者简介 张益珲 美国亚利桑那州立大学计算机工程技术硕士&#xff0c;架构师&#xff0c;从业近10年&#xff0c;多年大前端开发经验&#xff0c;曾就职于知名上市公司&#xff0c;主导开发…

go 语言常见问题(2)

11. recover的执行时机 无&#xff0c;recover 必须在 defer 函数中运行。recover 捕获的是祖父级调用时的异常&#xff0c;直接调用时无效。 func main() {recover()panic(1) }直接 defer 调用也是无效。 func main() {defer recover()panic(1) }defer 调用时多层嵌套依然无…

算法训练营Day42(背包问题)

基础 非竞赛只需要搞懂0-1背包和完全背包 0-1背包基础 0-1背包是完全背包和多重背包的基础 n个物品&#xff0c;每个物品一个&#xff0c;每个物品有自己的重量和价值&#xff0c;&#xff0c;一个背包能装m物品&#xff0c;问最多装多少物品。 暴力解法&#xff0c;n个物品…