大家都知道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