• 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

    部分内容来自于学习编程期间收集于网络的免费分享资源和工作后购买的付费内容。
  • 相关阅读:
    无线电,电磁波
    ThinkPHP实现支付宝接口功能
    php中发送email
    编程基本功训练:流程图画法及练习
    PHP中的特殊类,接口类和抽象类(都不能直接实例化)
    PHP中面相对象对象的知识点整理
    memcache 与 mencached扩展的区别
    MVC框架 与Smarty
    浏览器缓存机制
    PHP中九大缓存技术总结
  • 原文地址:https://www.cnblogs.com/MarlonKang/p/12183358.html
Copyright © 2020-2023  润新知