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 使用枚举或其他对象的更多相关文章

  1. 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代码 ...

  2. MyBatis从入门到精通(第9章):Spring集成MyBatis(下)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(下) springmvc执行流程原理 mybatis-spring  可以帮助我们将MyBatis代码无缝整合到Spring中.使 ...

  3. MyBatis从入门到精通(第9章):Spring集成MyBatis(中)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...

  4. MyBatis从入门到精通(第9章):Spring集成MyBatis(上)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(上) Spring是一个为了解决企业级Web应用开发过程中面临的复杂性,而被创建的一个非常流行的轻量级框架. mybatis-sp ...

  5. MyBatis从入门到精通(第5章):MyBatis代码生成器

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...

  6. MyBatis从入门到精通(第3章):MyBatis注解方式的基本使用

    MyBatis 注解方式就是将 SQL 语句直接写在DAO层的接口上. 在黑马录制的2018年双元视频课:\08 SSM整合案例[企业权限管理系统]\07.订单操作  有使用MyBatis注解进行多表 ...

  7. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  8. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.1高级结果映射之一对一映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.2.4 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  9. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

随机推荐

  1. 104-PHP定义并实例化类

    <?php class ren{ //定义人类 } class mao{ //定义猫类 } echo '实例化一个人类:'; var_dump(new ren()); //实例化人类 echo ...

  2. AFNetworking实现表单(multipart)形式上传图片

    最近遇到个问题,就是上传图片到服务器,后台说用表单形式... 由于没弄过这种上传,所以搜了大堆资料,但也没解决问题. 最后通过请教一位大神才得以解决这个简单的问题... 现在将此方法做个笔记... & ...

  3. 实验吧-密码学-这里没有key(VBScript脚本加密)

    打开网页,查看源代码,发现一段乱码,这就是加密后的密文. #@~^TgAAAA=='[6*liLa6++p'aXvfiLaa6i[[avWi[[a*p[[6*!I'[6cp'aXvXILa6fp[:6 ...

  4. MongoDB七-运维技术

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...

  5. [CISCN2019 华北赛区 Day1 Web5]CyberPunk

    0x00 知识点 PHP伪协议直接读取源码 http://xxx.xxx/index.php?file=php://filter/convert.base64-encode/resource=inde ...

  6. 每天一点点之vue框架开发 - vue坑-input 的checked渲染问题

    选中radio或者checkbox需要注意的是: 不管<input type='radio checked='true''>  你的checked属性值是true或者false,他都会选中 ...

  7. 每天一点点之laravel框架开发 - API通过access_token获取用户id报 Unauthenticated. 错误(passport)

    1.首先保证你的config/auth.php 中 guards 的 api 的 driver 选项改为 passport 2.注册中间件,在 app/Http/Kernel.php 文件中的 $ro ...

  8. POJ1833 & POJ3187 & POJ3785

    要是没有next_permutation这个函数,这些题觉得还不算特别水,不过也不一定,那样可能就会有相应的模板了.反正正是因为next_permutation这个函数,这些题包括之前的POJ1226 ...

  9. RecyclerView使用介绍

    来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在 ...

  10. UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题

    很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...