- 浏览: 1238475 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (242)
- java (58)
- netty (14)
- javascript (21)
- commons (13)
- 读书笔记 (5)
- java测试 (6)
- database (5)
- struts2 (8)
- hibernate (6)
- english (27)
- spring (10)
- 生活 (4)
- 多线程 (4)
- 正则表达式 (1)
- 杂项 (1)
- maven (4)
- 数据库 (10)
- 学习笔记 (1)
- mongodb (1)
- 百度bcs (4)
- 云推送javasdk (2)
- webservice (3)
- IllegalAnnotationException: Two classes have the same XML type name (0)
- drools (3)
- freemarker (3)
- tomcat (1)
- html5 (2)
- mq (11)
- fastjson (3)
- 小算法 (2)
最新评论
-
longxitian:
https://www.cnblogs.com/jeffen/ ...
万恶的Mybatis的EnumTypeHandler -
asialee:
ddnzero 写道博主请问FileUtils这个类是哪个包的 ...
使用mockftpserver进行ftp测试 -
ddnzero:
博主请问FileUtils这个类是哪个包的?还是自己的呢?能放 ...
使用mockftpserver进行ftp测试 -
yizishou:
为什么会intMap.get("bbb") ...
浅谈System.identityHashCode -
liguanqun811:
感觉LogManager打开了所有的LogSegment(文件 ...
jafka学习之LogManager
项目里面使用了Mybatis,然后里面一些POJO有使用到Enum的情况,在数据库里面的字段类型是SMALLINT,然后再Mybatis里面不能正确的转换。然后我在网上找了下,提到了EnumTypeHandler,那我们就来看这个TypeHandler的实现吧:
我们主要来看上面的setNonNullParameter方法,看到它是转换为字符串设置了,那我们用它的这个TypeHandler当然不行了,就想到自定义吧。
Mybatis在实现TypeHandler的时候,是直接调用的EnumTypeHandler的构造函数,但是注册其他的TypeHandler都是调用无参数的构造函数。
最后没有办法,我只能每个Enum,写一个TypeHandler,因为在typeHanderl里面没有办法拿到JavaType. 当然了大家如果有什么好的办法也欢迎交流讨论。
遗留系统,没办法
怎么了?
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); } }
评论
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;
}
}
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> {
}
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> {
}
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];
在父类的默认构造方法里写入
ParameterizedType parameterizedType = (ParameterizedType) getClass()
.getGenericSuperclass();
type = (Class<E>) parameterizedType.getActualTypeArguments()[0];
发表评论
-
maven的system scope的依赖在打包的时候不出现在lib里面的解决
2017-09-20 11:21 0上周遇到一个问题,一个sytem scope的依赖,在导出的 ... -
JAVA静态代码块
2015-04-07 16:26 2043今天遇到下面的代码 ... -
StringUtils.repeat函数赏析与疑问
2014-09-01 18:43 6102今天实现一个字符串拼接的一个需求,比如: ... -
java服务的培训ppt
2014-08-30 23:01 1592给应届生培训java web 服 ... -
给新人制定的java学习计划
2014-08-30 22:52 2526花了一点时间,给团队应届生和实习生制定 ... -
获取手机的mac地址
2014-04-10 22:20 3413与IP不同,MAC是指连接WIFI使用的无线网卡的物理地址, ... -
解决errorpage里面取不到Authentication的问题
2013-01-20 23:56 2464本人原创,发现一些网站无道德的抓取 ... -
SimpleDateFormat使用的时候的注意点
2012-12-06 20:59 2062今天在帮助同事查找一个项目bug的时候发现一个很奇怪 ... -
java和javascript的正则表达式有点不同
2012-11-06 18:54 1453今天在项目中遇 ... -
velocity 1.6.4的一个bug
2012-09-10 17:24 2186$.ajax()在Velocity中会冲突, 总之 ... -
一种多数据源分页算法
2012-09-10 17:13 7560以前开发一个系统,需要去多个系统去取数据,简单期间,比 ... -
使用stringBuffer和StringBuilder拼串要注意的问题
2012-07-30 17:30 8104今天在和同事排除一个问题的时候发现,从 ... -
java获取当月的工作日
2012-05-10 12:07 6144在这个记录一下,记录java获取某个月的工作日的代码,方便以 ... -
webservice引用传参
2012-04-19 19:38 1480http://www.blogjava.net/xylz/ar ... -
java获取当天的开始时间,当前周的开始时间
2012-04-16 17:31 19604在程序里面要获取当前的开始时间和结束时间,以及当前天 ... -
edtFTPj源码学习
2012-04-11 16:25 1277下面是edtFTPj的源码学习,下面的类图都是我自己亲手花的, ... -
ftp协议研究
2012-03-12 17:34 1297ACTIVE FTP OPERATION 1、客户端使用源 ... -
西安交通大学的错误日志
2011-12-14 13:30 1015西安交大的网站报错了,记录下出错日志,改天研究一下。 HT ... -
tomcat的favicon.ico的用法
2011-12-01 20:00 22571. web.xml文件添加下面的mime-mapping ... -
htmlunit模拟sso登陆
2011-07-27 14:45 6952import java.io.IOException; ...
相关推荐
mybatis 项目中用到的自定义枚举处理器,希望对大家有所帮助。。。 如有疑问欢迎交流。。。 email: yaketony@163.com
本文将深入探讨MyBatis中的TypeHandler,特别是`EnumOrdinalTypeHandler`和`EnumTypeHandler`,以及如何自定义TypeHandler来处理枚举类与数据库字典的映射。我们将通过三个具体的使用案例进行讲解。 首先,让我们...
在处理枚举类型时,Mybatis-Plus提供了通用枚举(Generic Enum)的功能,使得枚举在数据库交互中的使用更加优雅。 在数据库设计中,我们常常会遇到一些具有固定选项的字段,如性别、状态等,这些字段通常可以使用...
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2.6版本的源码之前,我们首先需要了解MyBatis的基本概念和功能。 MyBatis的核心部分主要包括SqlSessionFactory、...
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs...
MybatisGenerate是一个强大的工具,主要用于自动化生成Mybatis相关的代码,以提高开发效率并减少手动编写重复性工作的负担。这个工具是基于tk.mybatis框架的,它整合了Mybatis的优秀特性,使得开发者能够更加便捷地...
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 ...
MyBatis入门 MyBatis是一个优秀的持久层框架,使用XML将SQL与程序解耦,便于维护。MyBatis学习简单,执行高效,是JDBC的延伸。MyBatis提供了数据库增删改查的便捷操作,极大提高了开发效率、统一的编码规则、利于...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
MyBatis是一款流行的Java持久层框架,它的设计理念是通过简单的XML或注解用于配置和映射原始类型、接口和Java POJOs(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。MyBatis可以与各种数据库交互,...
这个压缩包文件“mybatisx.zip”包含了多个版本的MybatisX插件,包括MybatisX-1.4.16.zip、MybatisX-1.4.8.zip、MybatisX-1.4.6.zip以及MybatisX-1.1.2.zip。这些版本的差异可能体现在功能增强、性能优化或者修复...
MyBatis是一款强大的Java持久层框架,它将SQL与Java代码分离,使开发者可以更方便地操作数据库。这篇“MyBatis入门到精通”的学习资料是针对初学者设计的,旨在帮助新手快速掌握MyBatis的基本用法和高级特性。 1. *...
mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例...
MyBatis 官方中文文档 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
Mybatis是中国著名的开源Java持久层框架,它支持定制化SQL、存储过程以及高级映射。这个压缩包文件“Mybatis用到的资料”显然包含了学习和理解Mybatis所需的各种资源,对于想要深入研究Mybatis的开发者来说是宝贵的...
MyBatis 是一款深受开发者喜爱的持久层框架,它提供了灵活的 SQL 执行和映射功能,有效地将数据库操作与应用程序代码分离。MyBatis 插件系统是 MyBatis 框架的一个强大特性,允许用户自定义拦截器来增强其功能。...
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的...
MyBatis学习总结笔记 MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始...