MyBatis 09-使用枚举或其他对象
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" 转载请保留原文链接及作者。