MyBatis对于Java对象里的枚举类型处理
平时咱们写程序实体类内或多或少都会有枚举类型属性,方便嘛。但是mybatis里怎么处理他们的增删改查呢?
要求:
插入的时候,会用枚举的定义插入数据库,我们希望在数据库中看到的是数字或者其他东西;
查询的时候,数据库的值可以自动转换为我们对应的枚举值。
举例,我有一个这样的枚举类型:
- ),
- );
- private int status;
- UserStatus(int status){
- this.status = status;
- }
- public int getStatus() {
- return status;
- }
- }
我们插入数据库中,数据库应该为我们保存0或者1
我们可以使用mybatis自带的枚举类型EnumOrdinalTypeHandler
举例如下:
- <insert id="addUser" parameterType="User">
- INSERT INTO t_user(USER_ID,USER_NAME,LOGIN_NAME,
- LOGIN_PASSWORD,USER_STATUS,CREATE_TIME,UPDATE_TIME)
- VALUES(
- #{user_id},
- #{user_name},
- #{login_name},
- #{login_password},
- #{user_status, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
- #{create_time},
- #{update_time}
- )
- </insert>
我们的UserStatus插入的时候是UserStatus.AVAILABLE
执行完毕后,看结果:

看,是不是结果是我们期望的那样。
但是问题来了?
我们查询的时候报错了:Error querying database. Cause: java.lang.IllegalArgumentException: No enum constant cn.com.shuyangyang.mybatis.UserStatus.1
我们可以自定义这样的一个EnumStatusHandler:
- package cn.com.shuyangyang.mybatis;
- import java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.apache.ibatis.type.BaseTypeHandler;
- import org.apache.ibatis.type.JdbcType;
- /**
- * Mybatis自定义转换类型
- * @author ShuYangYang
- * E-Mail:shuyangyang@aliyun.com
- * http://www.shuyangyang.com.cn
- * Date:2015年1月26日下午10:12:54
- *
- */
- public class EnumStatusHandler extends BaseTypeHandler<UserStatus> {
- private Class<UserStatus> type;
- private final UserStatus[] enums;
- /**
- * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
- * @param type 配置文件中设置的转换类
- */
- public EnumStatusHandler(Class<UserStatus> type) {
- if (type == null)
- throw new IllegalArgumentException("Type argument cannot be null");
- this.type = type;
- this.enums = type.getEnumConstants();
- if (this.enums == null)
- throw new IllegalArgumentException(type.getSimpleName()
- + " does not represent an enum type.");
- }
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i,
- UserStatus parameter, JdbcType jdbcType) throws SQLException {
- // baseTypeHandler已经帮我们做了parameter的null判断
- ps.setInt(i, parameter.getStatus());
- }
- @Override
- public UserStatus getNullableResult(ResultSet rs, String columnName)
- throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int i = rs.getInt(columnName);
- if (rs.wasNull()) {
- return null;
- } else {
- // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(i);
- }
- }
- @Override
- public UserStatus getNullableResult(ResultSet rs, int columnIndex)
- throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int i = rs.getInt(columnIndex);
- if (rs.wasNull()) {
- return null;
- } else {
- // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(i);
- }
- }
- @Override
- public UserStatus getNullableResult(CallableStatement cs, int columnIndex)
- throws SQLException {
- // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
- int i = cs.getInt(columnIndex);
- if (cs.wasNull()) {
- return null;
- } else {
- // 根据数据库中的code值,定位EnumStatus子类
- return locateEnumStatus(i);
- }
- }
- /**
- * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
- * @param code 数据库中存储的自定义code属性
- * @return code对应的枚举类
- */
- private UserStatus locateEnumStatus(int code) {
- for(UserStatus status : enums) {
- if(status.getStatus()==(Integer.valueOf(code))) {
- return status;
- }
- }
- throw new IllegalArgumentException("未知的枚举类型:" + code + ",请核对" + type.getSimpleName());
- }
- }
mapper.xml里这样配置:
- <resultMap type="User" id="userResult">
- ……省略其他属性配置
- <result column="USER_STATUS" property="user_status" typeHandler="cn.com.shuyangyang.mybatis.EnumStatusHandler"/>
- ……省略其他属性配置
- </resultMap>
现在来看看结果:
[User [user_id=782cba19-559f-41c3-a1b0-25fcac4cf118, user_name=系统管理员, login_name=admin, login_password=admin,user_status=AVAILABLE, create_time=Mon Jan 26 21:17:09 CST 2015, update_time=Mon Jan 26 21:17:09 CST 2015]]
完美结果。
MyBatis对于Java对象里的枚举类型处理的更多相关文章
- Java基础教程:枚举类型
Java基础教程:枚举类型 枚举类型 枚举是将一具有类似特性的值归纳在一起的方法.比如,我们可以将周一到周日设计为一个枚举类型.彩虹的七种颜色设计为一个枚举类型. 常量实现枚举 我们通过定义常量的方式 ...
- 创建Java不可变型的枚举类型Gender
创建Java不可变型的枚举类型,其实例如下: // 创建不可变型的枚举类 enum Gender { // 此处的枚举值必须调用对应的构造器来创建 MALE("男"), FEMAL ...
- Java魔法堂:枚举类型详解
一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...
- mybatis 查询单个对象,结果集类型一定要明确
简单介绍:用ssm框架已经有很长时间了,但是似乎从来都没有对于查询单个对象,存在问题的,好像也就是那回事,写完sql就查出来了,也从来都没有认真的想过,为什么会这样,为什么要设置结果集类型 代码: / ...
- Java基础教程(15)--枚举类型
枚举类型定义了一个枚举值的列表,每个值是一个标识符.例如,下面的语句声明了一个枚举类型,用来表示星期的可能情况: public enum Day { SUNDAY, MONDAY, TUESDAY ...
- java对象转化成String类型
在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object#toString(),(String)要转换的对象,St ...
- Java中的Enum枚举类型总结
废话不多说,直接上代码,该例子来源于:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html public enum Planet { ...
- java对象中含有Integer类型字段转json字符串问题
问题:对于含有Integer类型字段的java对象,在通过下面这种方式转为json字符串时,Integer类型的字段如果为空的情况下,会默认转化为0,但是我想让它为空的时候直接转化为null,不要默认 ...
- Java练习 SDUT-1959_简单枚举类型——植物与颜色
简单枚举类型--植物与颜色 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定义具有red, orange, yell ...
随机推荐
- lufylegend:加载进度
实现图片加载进度 LoadingSample Class 用来显示进度条的对象. 引擎中目前提供的进度条类有:LoadingSample1-7 你可以制作自己的进度条,自制进度条类中要包含setPro ...
- 从零開始学android<使用嵌套布局实现计算器界面.十七.>
所谓的嵌套布局就是在一个文件里嵌套多个布局文件 <span style="font-size:18px;"> <LinearLayout android:layo ...
- 使用Spire.Office for .NET(Word、Excel、PPT、PDF等)的初步感受
前言 本文大部分内容来自http://www.codeproject.com/Articles/710747/First-thoughts-on-Spire-Doc-for-NET. 针对我个人来说, ...
- securecrt 多窗口执行命令
首先在SecureCRT里同时打开多个服务器session(必须是有相同目录结构) 选择菜单栏View –>Chat Windows 对号,此时所有服务器连接下方应该有个空白的部分 在空白的部分 ...
- Node.js SDK与fabric链码交互开发
1.本篇背景 前面已经对链码开发作了比较详细的介绍,并且对官方提供的 fabcar 链码进行了解读,本篇将介绍如何使用 Node.js SDK 与区块链网络中的链码进行交互. 本篇内容基本来自官方 H ...
- [转]Win7与虚拟机VMware下运行的Ubuntu共享文件夹
From : http://blog.csdn.net/gaojinshan/article/details/9231853 安装VMware Tools,在VMware面板上选择“虚拟机-重新安装V ...
- iOS:移动端“用户反馈和客服”的几个平台SDK的介绍
简单阐述: 用户反馈功能几乎是每个app都有的一个功能点,通过反馈功能实现与用户的连接.沟通,随时随地收集用户意见反馈和Bug报告,即时和用户保持沟通,在一定程度上提升了app的竞争力.而给app评分 ...
- verilog语法实例学习(8)
常用的时序电路介绍 在电平敏感的锁存器时钟信号有效期(高电平)期间,锁存器的状态随着输入信号的变化而变化.有时候,我们需要存储器的状态在一个时钟周期只改变一次,这个时候就用到了触发器.触发器(flip ...
- 基于fasttext的情感分析,准备先做一版
博客文章地址: https://blog.csdn.net/sinat_33741547/article/details/78803766 代码地址: https://github.com/lpty/ ...
- 深度学习Github排名,很不错的介绍
今天看到这篇文章,把深度学习github排名靠前的项目,介绍了一下,很不错: https://blog.csdn.net/yH0VLDe8VG8ep9VGe/article/details/81611 ...