`

万恶的Mybatis的EnumTypeHandler

    博客分类:
  • java
阅读更多
           项目里面使用了Mybatis,然后里面一些POJO有使用到Enum的情况,在数据库里面的字段类型是SMALLINT,然后再Mybatis里面不能正确的转换。然后我在网上找了下,提到了EnumTypeHandler,那我们就来看这个TypeHandler的实现吧:
package org.apache.ibatis.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class EnumTypeHandler extends BaseTypeHandler implements TypeHandler {

  private Class type;

  public EnumTypeHandler(Class type) {
    this.type = type;
  }

  public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter.toString());
  }

  public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
    String s = rs.getString(columnName);
    return s == null ? null : Enum.valueOf(type, s);
  }

  public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    String s = cs.getString(columnIndex);
    return s == null ? null : Enum.valueOf(type, s);
  }

}

          
     我们主要来看上面的setNonNullParameter方法,看到它是转换为字符串设置了,那我们用它的这个TypeHandler当然不行了,就想到自定义吧。
      Mybatis在实现TypeHandler的时候,是直接调用的EnumTypeHandler的构造函数,但是注册其他的TypeHandler都是调用无参数的构造函数。
          
  public TypeHandler getTypeHandler(Class<?> type, JdbcType jdbcType) {
    Map<JdbcType, TypeHandler> jdbcHandlerMap = TYPE_HANDLER_MAP.get(type);
    TypeHandler handler = null;
    if (jdbcHandlerMap != null) {
      handler = jdbcHandlerMap.get(jdbcType);
      if (handler == null) {
        handler = jdbcHandlerMap.get(null);
      }
    }
    if (handler == null && type != null && Enum.class.isAssignableFrom(type)) {
      handler = new EnumTypeHandler(type);
    }
    return handler;
  }


     
       最后没有办法,我只能每个Enum,写一个TypeHandler,因为在typeHanderl里面没有办法拿到JavaType. 当然了大家如果有什么好的办法也欢迎交流讨论。
     
public class ProcessStateTypeHandler extends BaseTypeHandler implements TypeHandler {
	
  public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
	  ps.setInt(i, ((ProcessState)parameter).ordinal());
  }

  public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
    Integer s = rs.getInt(columnName);
    return s == null ? null : ProcessState.fromValue(s);
  }

  public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
	Integer s = cs.getInt(columnIndex);
    return s == null ? null : ProcessState.fromValue(s);
  }

}

2
3
分享到:
评论
8 楼 longxitian 2019-02-13  
https://www.cnblogs.com/jeffen/p/6380982.html?utm_source=itdadao&utm_medium=referral
7 楼 asialee 2014-01-27  
dieslrae 写道
为毛不直接把字段改成enum

遗留系统,没办法
6 楼 dieslrae 2014-01-27  
为毛不直接把字段改成enum
5 楼 卧室的门 2013-04-12  
public interface MyEnum{
    int getIntValue();
}
-------
@MappedJdbcTypes(JdbcType.SMALLINT)
public class MyTypeHandler extends BaseTypeHandler<MyEnum>{
private Class<MyEnum> type;

public MyTypeHandler(Class<MyEnum> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}

@Override
public MyEnum getNullableResult(ResultSet rs, String name) throws SQLException {
return convert(rs.getInt(name));
}

@Override
public MyEnum getNullableResult(ResultSet rs, int i) throws SQLException {
return convert(rs.getInt(i));
}

@Override
public MyEnum getNullableResult(CallableStatement cs, int i)
throws SQLException {
return convert(cs.getInt(i));
}

@Override
public void setNonNullParameter(PreparedStatement ps, int i, MyEnum enumObj,
JdbcType type) throws SQLException {
ps.setInt(i, enumObj.getIntValue());
}

private MyEnum convert(int status){
MyEnum[] objs = type.getEnumConstants();
for(MyEnum em:objs){
if(em.getIntValue()==status){
return  em;
}
}
return null;
}
}
4 楼 卧室的门 2013-04-12  
2楼可以的,枚举类实现个getIntValue()接口就行了
3 楼 asialee 2013-02-26  
panquanyi 写道
public interface IntEnum<E extends Enum<E>> {
    int getIntValue();
}

public enum BookType implements IntEnum<BookType> {


}
public enum RoleType implements IntEnum<RoleType> {

}

public class IntEnumTypeHandler<E extends Enum<E> & IntEnum<E>> extends BaseTypeHandler<E> {

}

怎么了?
2 楼 panquanyi 2013-02-26  
public interface IntEnum<E extends Enum<E>> {
    int getIntValue();
}

public enum BookType implements IntEnum<BookType> {


}
public enum RoleType implements IntEnum<RoleType> {

}

public class IntEnumTypeHandler<E extends Enum<E> & IntEnum<E>> extends BaseTypeHandler<E> {

}
1 楼 cd_tiger 2012-11-23  
写个子类采用泛型继承父类

在父类的默认构造方法里写入

ParameterizedType parameterizedType = (ParameterizedType) getClass()
.getGenericSuperclass();
type = (Class<E>) parameterizedType.getActualTypeArguments()[0];

相关推荐

    mybatis Enum自定义EnumTypeHandler(自定义枚举处理器)

    mybatis 项目中用到的自定义枚举处理器,希望对大家有所帮助。。。 如有疑问欢迎交流。。。 email: yaketony@163.com

    Mybatis-Plus通用枚举的使用详解

    主要介绍了Mybatis-Plus通用枚举的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    mybatis-3-mybatis-3.2.6

    mybatis源码是mybatis-3.2.6的源码,用户使用mybatis时可以进行参考

    mybatis练习3mybatis练习3mybatis练习3mybatis练习3

    mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...

    mybatis入门案例 mybatis入门案例

    mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例...

    MyBatis-Plus入门+MyBatis-Plus文档手册 中文pdf高清版.rar

    mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的...

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    解决mybatis头文件报错 下载好压缩包 解压将文件放到本地文件夹 例如 D盘的哪个文件夹 D:\mybatis\ ;然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你...

    mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip

    mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip ...

    开发工具 mybatis-3.4.2

    开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2...

    mybatis demo mybatis 实例

    mybatis deom.mybatis 的简单入门实例。基于maven开发的。

    mybatis入门实战之枚举类型

    本项目为mybatis实战二之枚举类型,里面有简单的demo,适合初学者下载运行,能对mybatis的typehandler有一个初始的认识和运用

    MybatisGenerate_代码生成_tkMybatis_mybatisgenerate_mybatis_

    生成已tk.mybatis封装的mybatis代码

    mybatis_plugin 2.92

    mybatis_plugin2.9.2

    mybatis3.5.7.zip

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 ...

    mybatis、mybatis详细设计、mybatis配置

    mybatis、mybatis详细设计、mybatis配置

    mybatis慢SQL插件

    基于mybatis的慢SQL小插件,原理是mybatis拦截器。只需要在springboot的配置文件做简单的配置,mybatis拦截器将SQL中所有参数自动做了填充。拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL...

    Mybatis3_API Word版

    mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架...

    mybatis-spring.jar 最新版 适配MyBatis-3.4.0及以上

    该jar包是Mybatis和Spring整合必备jar包,适配Mybatis-3.4.0及以上版本。

    MyBatis学习代码

    MyBatis学习代码: mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in...

    free-idea-mybatis2019.12.18.zip

    free-idea-mybatis is an enchange plugin for idea to supoort mybatis,here is the main functions: generate mapper xml files navigate from the code to mapper and from the mapper back to code auto code...

Global site tag (gtag.js) - Google Analytics