打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
万恶的Mybatis的EnumTypeHandler

万恶的Mybatis的EnumTypeHandler

  • 博客分类: java

JavaSQLiBATISApache

           项目里面使用了Mybatis,然后里面一些POJO有使用到Enum的情况,在数据库里面的字段类型是SMALLINT,然后再Mybatis里面不能正确的转换。然后我在网上找了下,提到了EnumTypeHandler,那我们就来看这个TypeHandler的实现吧: 

Java代码  

  1. package org.apache.ibatis.type;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. public class EnumTypeHandler extends BaseTypeHandler implements TypeHandler {  
  9.   
  10.   private Class type;  
  11.   
  12.   public EnumTypeHandler(Class type) {  
  13.     this.type = type;  
  14.   }  
  15.   
  16.   public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  
  17.     ps.setString(i, parameter.toString());  
  18.   }  
  19.   
  20.   public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {  
  21.     String s = rs.getString(columnName);  
  22.     return s == null ? null : Enum.valueOf(type, s);  
  23.   }  
  24.   
  25.   public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {  
  26.     String s = cs.getString(columnIndex);  
  27.     return s == null ? null : Enum.valueOf(type, s);  
  28.   }  
  29.   
  30. }  


           

     我们主要来看上面的setNonNullParameter方法,看到它是转换为字符串设置了,那我们用它的这个TypeHandler当然不行了,就想到自定义吧。 

      Mybatis在实现TypeHandler的时候,是直接调用的EnumTypeHandler的构造函数,但是注册其他的TypeHandler都是调用无参数的构造函数。 

           

Java代码  

  1. public TypeHandler getTypeHandler(Class<?> type, JdbcType jdbcType) {  
  2.   Map<JdbcType, TypeHandler> jdbcHandlerMap = TYPE_HANDLER_MAP.get(type);  
  3.   TypeHandler handler = null;  
  4.   if (jdbcHandlerMap != null) {  
  5.     handler = jdbcHandlerMap.get(jdbcType);  
  6.     if (handler == null) {  
  7.       handler = jdbcHandlerMap.get(null);  
  8.     }  
  9.   }  
  10.   if (handler == null && type != null && Enum.class.isAssignableFrom(type)) {  
  11.     handler = new EnumTypeHandler(type);  
  12.   }  
  13.   return handler;  
  14. }  



      

       最后没有办法,我只能每个Enum,写一个TypeHandler,因为在typeHanderl里面没有办法拿到JavaType. 当然了大家如果有什么好的办法也欢迎交流讨论。 

      

Java代码  

  1. public class ProcessStateTypeHandler extends BaseTypeHandler implements TypeHandler {  
  2.       
  3.   public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  
  4.       ps.setInt(i, ((ProcessState)parameter).ordinal());  
  5.   }  
  6.   
  7.   public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {  
  8.     Integer s = rs.getInt(columnName);  
  9.     return s == null ? null : ProcessState.fromValue(s);  
  10.   }  
  11.   
  12.   public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {  
  13.     Integer s = cs.getInt(columnIndex);  
  14.     return s == null ? null : ProcessState.fromValue(s);  
  15.   }  
  16.   
  17. }  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ibatis支持枚举类型
Mybatis类型转换介绍
面试官问:Mybatis中的TypeHandler你用过吗?
扔掉工具类!MyBatis 一个简单配置搞定加密、解密,不能太方便了~!
mybatis使用Map返回时数据库为空的字段不返回问题
大厂面试题:请讲下MyBatis 的执行流程!网友:讲的太好了!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服