重学Mybatis:类型处理器,这个你得会玩

本文介绍了在Mybatis中遇到的类型转换问题,特别是当数据库字段与Java枚举类型不匹配时导致的错误。通过创建自定义类型处理器`SexEnumTypeHandle`,实现了枚举SexEnum与数据库中数字类型的转换,从而解决了查询和插入数据时的异常。文章详细讲解了自定义类型处理器的实现过程,并提供了注册和使用方法。
摘要由CSDN通过智能技术生成

return result == 0 && rs.wasNull() ? null : result;
}

@Override
public Integer getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
int result = rs.getInt(columnIndex);
return result == 0 && rs.wasNull() ? null : result;
}

@Override
public Integer getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
int result = cs.getInt(columnIndex);
return result == 0 && cs.wasNull() ? null : result;
}
}

mybatis内部默认实现了很多类型转换器,每种类型转换器能够处理哪些java类型以及能够处理的JdbcType的类型,这些都在TypeHandlerRegistry进行注册的,大家可以去看一下这个类源码,IntegerTypeHandler也是在这个类中进行注册的,代码如下:

register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());

所以当我们参数是Integer或者int类型的时候,mybatis会调用IntegerTypeHandler转换器中的setInt方法去设置参数,上面我们的UserModel的id字段是Integer类型的,所以插入数据的时候会调用IntegerTypeHandler处理器中的setInt方法去设置参数,当mybatis将t_user表的数据自动映射为UserModel类型的时候,mybatis会发现id类型是Integer类型,然后会找到IntegerTypeHandler中对应的读取结果集的方法去读取数据,即调用ResultSet的getInt方法读取id字段的数据,然后赋值给UserModel中的id属性。

自定义类型转换器

我们在用户表新增一个性别字段sex,java中我们通过一个枚举来表示这个类型,db脚本如下:

DROP DATABASE IF EXISTS javacode2018;
CREATE DATABASE javacode2018;

USE javacode2018;

DROP TABLE IF EXISTS t_user;
CREATE TABLE t_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值