MyBatis从入门到精通(第6章):6.3 使用枚举或其他对象
6.3 使用枚举或其他对象
在 sys_role 表中存在一个字段 enabled,这个字段只有两个可选值,0 为禁用,1 为启用。但是在 SysRole 类中,我们使用的是 Integer enabled,这种情况下必须手动校验 enabled 的值是否符合要求。在只有两个值的情况下,处理起来还比较容易,但是当出现更多的可选值时,对值进行校验就会变得复杂。因此在这种情况下,我们通常会选择使用枚举来解决。
6.3.1 使用 MyBatis 提供的枚举处理器
在 tk.mybatis.simple.type 包中新增 Enabled 枚举类,代码如下。
public enum Enabled {
enabled(1), //启用
disabled(0);//禁用
private final int value;
private Enabled(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
因为枚举除了本身的字面值外,还可以通过枚举的 ordinal()方法获取枚举值的索引。在这个枚举类中,disabled 对应索引 0,enabled 对应索引 1。
增加枚举后,修改 SysRole 中 enabled 的类型,部分修改后的代码如下。

将 enabled 改为枚举类型后,可选值的问就解决了,在 Java 中处理该值也变得简单了。但是这个值该如何和数据库的值进行交互呢?
在数据库中不存在一个和 Enabled 枚举对应的数据库类型,因此在和数据库交互的时候,不能直接使用枚举类型,在查询数据时,需要将数据库 int 类型的值转换为 Java 中的枚举值。在保存、更新数据或者作为查询条件时,需要将枚举值转换为数据库中的 int 类型。
MyBatis 在处理 Java 类型和数据库类型时,使用 TypeHandler (类型处理器)对这两者进行转换。Mybatis 为 Java 和数据库 JDBC 中的基本类型和常用的类型提供了 TypeHandler 接口的实现。MyBatis 在启动时会加载所有的 JDBC 对应的类型处理器,在处理枚举类型时默认使用org.apache.ibatis.type.EnumTypeHandler 处理器,这个处理器会将枚举类型转换为字符串类型的字面值并使用,对于 Enabled 而言便是"disabled"和"enabled"字符串。在这个例子中,由于数据库使用的是 int 类型,所以在 Java 的 String 类型和数据库 int 类型互相转换时,肯定会报错。

从第一个方法查询的返回值可以看到,MyBatis 将 1 处理为 enabled。在第二个更新方法中,MyBatis 将 disabled 处理为 0 来更新数据库。通过typeHandler 配置就实现了 Java 类型和 JDBC 类型的互相转换。
6.3.2 使用自定义的类型处理器
上面的配置解决了枚举问题,但有的时候,值既不是枚举的字面值,也不是枚举的索引值,这种情况下就需要自己来实现类型处理器了。简单修改枚举类 Enabled,代码如下。

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map; import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler; /**
* Enabled 类型处理器
*/
public class EnabledTypeHandler implements TypeHandler<Enabled> {
private final Map<Integer, Enabled> enabledMap = new HashMap<Integer, Enabled>(); public EnabledTypeHandler() {
for(Enabled enabled : Enabled.values()){
enabledMap.put(enabled.getValue(), enabled);
}
} public EnabledTypeHandler(Class<?> type) {
this();
} @Override
public void setParameter(PreparedStatement ps, int i, Enabled parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getValue());
} @Override
public Enabled getResult(ResultSet rs, String columnName) throws SQLException {
Integer value = rs.getInt(columnName);
return enabledMap.get(value);
} @Override
public Enabled getResult(ResultSet rs, int columnIndex) throws SQLException {
Integer value = rs.getInt(columnIndex);
return enabledMap.get(value);
} @Override
public Enabled getResult(CallableStatement cs, int columnIndex) throws SQLException {
Integer value = cs.getInt(columnIndex);
return enabledMap.get(value);
} }
EnabledTypeHandler

修改后再次执行测试方法,测试会正确执行。这里只是实现了一个简单的类型处理器,如果需要用到复杂的类型处理,可以参考 MyBatis 项目中org.apache.ibatis.type 包下的各种类型处理器的实现。
6.3.3 对 Java 8 日期(JSR-310)的支持
MyBatis 从 3.4.0 版本开始增加了对 Java 8 日期(JSR-310)的支持。如果使用 3.4.0 及以上版本,只需要在 Maven 的 pom.xml 中添加如下依赖即可。


=====================================================================
end
MyBatis从入门到精通(第6章):6.3 使用枚举或其他对象的更多相关文章
- MyBatis从入门到精通(第5章):5.4 Example 介绍
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(下)
MyBatis从入门到精通(第9章):Spring集成MyBatis(下) springmvc执行流程原理 mybatis-spring 可以帮助我们将MyBatis代码无缝整合到Spring中.使 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(中)
MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(上)
MyBatis从入门到精通(第9章):Spring集成MyBatis(上) Spring是一个为了解决企业级Web应用开发过程中面临的复杂性,而被创建的一个非常流行的轻量级框架. mybatis-sp ...
- MyBatis从入门到精通(第5章):MyBatis代码生成器
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...
- MyBatis从入门到精通(第3章):MyBatis注解方式的基本使用
MyBatis 注解方式就是将 SQL 语句直接写在DAO层的接口上. 在黑马录制的2018年双元视频课:\08 SSM整合案例[企业权限管理系统]\07.订单操作 有使用MyBatis注解进行多表 ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.1高级结果映射之一对一映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.2.4 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】
(第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...
随机推荐
- Essay写作常见错误精选
Essay写作常见错误精选.Essay写作有许多不为人注意的小细节,如果申请人在这些细节上不注意,往往会犯一些很典型的错误.和小编一起来看看留学Essay写作常见错误解析. 1)直接把申请学校A的Es ...
- you-get加ffmpeg获取视频素材并转格式
最近做视频,觉得素材不好下载,下载了转格式又很麻烦,终于,在网上ob了很久的我找到了属于自己的工具. you-get视频下载 当你在网上找视频素材的时候发现了一个自己觉得很有意思的视频,但是获取这个视 ...
- mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下
借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...
- python EasyUI + Django--整合 CSRF 防护去除
先来张完整图: 关于Django 得CSRF 中间件 防护 GET 是不做CSRF验证得 但POST 默认验证 $.cookie('csrftoken')) "v ...
- 启用sql日志
SHOW VARIABLES LIKE "general_log%"; -- 查询是否启用日志 SET GLOBAL general_log = 'ON'; -- 设置启用 SE ...
- 【LeetCode】二叉树的最大深度
[问题]给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数.说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...
- sql server 日期时间数据类型
1.日期和时间数据类型 (1)在sqlserver 2008之前,SQL Server 支持datetime 和 smalldatetime 两种日期时间数据类型.这两种数据类型日期和时间是不可分割的 ...
- 04-String——课后作业1:字串加密
题目:请编写一个程序,加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 程序设计思想:首先由用户选择是加密还是解密,利用String类中的charAt函数依次取出字串中的字符, ...
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的“坦克大战”,你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygame1.9.6 ...
- 多线程进阶——JUC并发编程之CountDownLatch源码一探究竟
1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍Coun ...