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 ...
随机推荐
- 054-for循环
<?php for($i=1;$i<=5;$i++){ echo "$i<br />"; //循环体 } ?>
- pycharm 设置项目的编译器
设置编译器(interpreter) File---Setting--在搜索框输入(interpreter)
- springmvc无法访问JS,CSS等文件
配置好web.xml中的dispatchservlet后,js,css,都不能正常显示 web.xml配置文件 <!-- 核心控制器 --> <servlet> <ser ...
- springboot - 映射 /error 到自定义且实现了ErrorController的Controller
1.总览 2.代码 1).pom.xml <dependencies> <dependency> <groupId>org.springframework.boot ...
- html语一化/块/行级元素
html文件不区分大小写.//vue项目中组件名字驼峰 使用时候却全部小写 说明不区分 html语义化的意思, 就是标签名带有一定含义和一些css样式.比如h1-h6是标题 自动放大变粗,img是图片 ...
- Ubuntu 安装phpmyadmin (9.17第六天)
PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等,这样 M ...
- webservice 的wsdl文件详解
转 WSDL(Web Service Description Language)Web服务描述语言 ################################################## ...
- js interval ,timeout
var inter; intervatest("2019-08-22 09:12:00"); function intervatest(str) { ShowCountDown(s ...
- 一个简单完整的promiseDemo
想要完全理解代码,需要理解 this 和闭包的含义. Promise是什么 简单来说,Promise 主要就是为了解决异步回调的问题.用 Promise 来处理异步回调使得代码层次清晰,便于理解,且更 ...
- Swift实现iOS录音与播放音频功能
作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ...