mybatis进击二:jdbcType和JavaType类型转换

大家都知道jdbc type和java type是完全不一样的类型系统,那么他们是怎么转换的?控制是在哪里?假如我们要写这样的功能应该怎么设计呢?

1、考虑写一个map,里面存储所有映射关系,显然这是非常简单的事情

2、如果想增加扩展,应该怎么去实现呢?

一、Types

这是java.sql中的类,定义了java类型与SQL数据类型的映射关系,或者说是屏蔽掉了底层不同数据库的sql类型表示

二、JdbcType

mybatis 重新对Types进行封装,定义了自己的jdbc类型,这样的好处就是一起尽在自己掌握中,认它风水与雨打

三、TypeHandler

定义了类型之后,怎么进行类型直接的互相转换呢?这就是TypeHandler的作用了

//对入参进行转换
void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
//对返回值进行转换
  T getResult(ResultSet rs, String columnName) throws SQLException;

  T getResult(ResultSet rs, int columnIndex) throws SQLException;

  T getResult(CallableStatement cs, int columnIndex) throws SQLException;
org.apache.ibatis.type 下定义了各种不同的基本数据类型的定义,特别的对应java8,支持了LocalDateTime<->Timestamp, LocalDate<->Date, LocalTime<->Time的转换,所以时间类型我们完全可以使用java8的时间类型

四、接着就是map

官方叫registry(TypeHandlerRegistry)其实就是一个大map,存储了类型和handler的映射关系

我们仔细看会发现,这个registry中的方法都是实例方法,那么肯定有一处要加载进来

五、org.apache.ibatis.session.Configuration

这个类定义了一系列的配置,其中有

通过这里就可以加载到系统自待的typeHandler了

六、自定义

这时候,我们虽然找到了系统自待的typeHandler了,那如何实现自定义呢?通过查看Configuration.getTypeHandlerRegistry()这个方法调用的地方,发现SqlSessionFactoryBean中存在下面两个处理逻辑,也就是说我们可以通过这里设置并加载自定义的typeHandler

七、应用

https://blog.csdn.net/havedream_one/article/details/87548949

https://blog.csdn.net/havedream_one/article/details/95484862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值