MyBatis 09-使用枚举或其他对象

  1. 使用 MyBatis 提供的枚举处理器
  2. 使用自定义的类型处理器
  3. 对 Java8 日期的支持

http://www.broadview.com.cn/book/3643
https://github.com/mybatis-book/book

使用 MyBatis 提供的枚举处理器

public enum Enabled {
    enabled,  // 启用
    disabled; // 禁用
}

修改 SysRole 中 enabled 的类型

private Enabled enabled;

MyBatis 处理枚举类型时默认使用 org.apache.ibatis.type.EnumTypeHandler 处理器,这个处理器会将枚举类型转换为字符串类型的字面值并使用。对于 Enabled 而言便是 "enabled","disabled" 字符串。由于数据库中使用的是 int 类型,所以转换时肯定会报错。

MyBatis 还提供了另一个 org.apache.ibatis.type.EnumOrdinalTypeHandler 处理器,这个处理器使用枚举的索引进行处理,可以解决遇到的问题,在 mybatis-config.xml 中添加配置:

<typeHandlers>
    <typeHandler
        javaType="tk.mybatis.simple.type.Enabled"
        handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</typeHandlers>

使用自定义的类型处理器

有时候,值既不是枚举的字面值,也不是枚举的索引值,这样就需要自己来实现类型处理器了。

public enum Enabled {
    enabled(1), //启用
    disabled(0);//禁用

    private final int value;

    private Enabled(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
/**
 * 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);
    }

}

在 mybatis-config.xml 中修改配置:

<typeHandlers>
    <typeHandler
        javaType="tk.mybatis.simple.type.Enabled"
        handler="tk.mybatis.simple.type.EnabledTypeHandler"/>
</typeHandlers>

对 Java8 日期的支持

https://github.com/mybatis/typehandlers-jsr310

MyBatis 从 3.4.0 版本开始增加对 Java8 日期的支持。如果使用 3.4.0 及以上版本时,只需添加依赖即可。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>l.0.2</version>
</dependency>

如果使用更早的版本,还需要在 mybatis-config.xml 中添加如下配置。

<typeHandlers>
    <!-- ... -->
    <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
    <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>

为什么这些 typeHandler 都没有配置 javaType 呢?看看 InstantTypeHandler 的源码

public class InstantTypeHandler extends BaseTypeHandler<Instant> {
    // ...
}

InstantTypeHandler 继承了 BaseTypeHandler<T> 类,而 BaseTypeHandler<T> 又继承了 TypeReference<T> 类。MyBatis 会获取这里指定的泛型类型作为 javaType 属性。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:MyBatis 09-使用枚举或其他对象

文章字数:740

本文作者:Bin

发布时间:2019-12-01, 14:33:25

最后更新:2019-12-01, 15:13:20

原始链接:http://coolview.github.io/2019/12/01/MyBatis/MyBatis%2009-%E4%BD%BF%E7%94%A8%E6%9E%9A%E4%B8%BE%E6%88%96%E5%85%B6%E4%BB%96%E5%AF%B9%E8%B1%A1/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录