`

万恶的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入门之typeHanlder的三种使用案例

    本文将深入探讨MyBatis中的TypeHandler,特别是`EnumOrdinalTypeHandler`和`EnumTypeHandler`,以及如何自定义TypeHandler来处理枚举类与数据库字典的映射。我们将通过三个具体的使用案例进行讲解。 首先,让我们...

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

    在处理枚举类型时,Mybatis-Plus提供了通用枚举(Generic Enum)的功能,使得枚举在数据库交互中的使用更加优雅。 在数据库设计中,我们常常会遇到一些具有固定选项的字段,如性别、状态等,这些字段通常可以使用...

    mybatis demo mybatis 实例

    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs...

    mybatis-3-mybatis-3.2.6

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2.6版本的源码之前,我们首先需要了解MyBatis的基本概念和功能。 MyBatis的核心部分主要包括SqlSessionFactory、...

    mybatis的中文api文档

    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs...

    MybatisGenerate_代码生成_tkMybatis_mybatisgenerate_mybatis_

    MybatisGenerate是一个强大的工具,主要用于自动化生成Mybatis相关的代码,以提高开发效率并减少手动编写重复性工作的负担。这个工具是基于tk.mybatis框架的,它整合了Mybatis的优秀特性,使得开发者能够更加便捷地...

    mybatis3.5.7.zip

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

    MyBatis入门.pdf

    MyBatis入门 MyBatis是一个优秀的持久层框架,使用XML将SQL与程序解耦,便于维护。MyBatis学习简单,执行高效,是JDBC的延伸。MyBatis提供了数据库增删改查的便捷操作,极大提高了开发效率、统一的编码规则、利于...

    mybatis中文离线文档

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    MyBatis3官方中文文档

    MyBatis是一款流行的Java持久层框架,它的设计理念是通过简单的XML或注解用于配置和映射原始类型、接口和Java POJOs(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。MyBatis可以与各种数据库交互,...

    mybatisx.zip

    这个压缩包文件“mybatisx.zip”包含了多个版本的MybatisX插件,包括MybatisX-1.4.16.zip、MybatisX-1.4.8.zip、MybatisX-1.4.6.zip以及MybatisX-1.1.2.zip。这些版本的差异可能体现在功能增强、性能优化或者修复...

    MyBatis入门到精通

    MyBatis是一款强大的Java持久层框架,它将SQL与Java代码分离,使开发者可以更方便地操作数据库。这篇“MyBatis入门到精通”的学习资料是针对初学者设计的,旨在帮助新手快速掌握MyBatis的基本用法和高级特性。 1. *...

    mybatis入门案例 mybatis入门案例

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

    mybatis_3.5.9官方中文文档pdf

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

    MyBatis-3.4.6.zip

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    Mybatis用到的资料

    Mybatis是中国著名的开源Java持久层框架,它支持定制化SQL、存储过程以及高级映射。这个压缩包文件“Mybatis用到的资料”显然包含了学习和理解Mybatis所需的各种资源,对于想要深入研究Mybatis的开发者来说是宝贵的...

    mybatis_plugin 2.92

    MyBatis 是一款深受开发者喜爱的持久层框架,它提供了灵活的 SQL 执行和映射功能,有效地将数据库操作与应用程序代码分离。MyBatis 插件系统是 MyBatis 框架的一个强大特性,允许用户自定义拦截器来增强其功能。...

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

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

    mybatis 3.2.6

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

Global site tag (gtag.js) - Google Analytics