上一章我们提到typeHandler但是并没有做详细的介绍,那么现在我将详细说明一下typeHandler的作用以及自定义方式。
众所周知,mybatis是一个ORM框架,即对象关系映射框架。那我们在执行sql语句的时候是如何将Java类型的数据映射成数据库类型的值呢,这个时候就用到了typeHandler。在执行sql语句前,它会将JavaType类型的传参映射成jdbcType类型的参数,执行sql语句后它将会把jdbcType类型的执行结果映射成JavaType类型返回出去。
那mybatis框架目前支持哪些类型的转换呢,下图是mybatis支持的其中一部分类型,其实所有支持的类型都会被注册到TypeHandlerRegistry的jdbcTypeHandlerMap中。
如果我们在项目开发过程中遇到了mybatis不支持的数据类型应该如何去解决呢?这个时候我们可以自定义typeHandler,据我所知mysql是在5.7版本才支持json类型的字段,而恰好mybatis目前不支持这个类型字段的映射,我将自定义一个typeHandler来支持json字段的映射。
上图可以看到我自定义的com.alibaba.fastjson.JSONObject的typeHandler,我们只需要继承BaseTypeHandler类,泛型标注我们的javaType,当然也可以使用@MappedTypes和@MappedJdbcTypes注解来分别指定自定义typeHandler支持的JavaType和jdbcType。
这只是其中一种方式,我们还可以通过另一种方式来自定义,通过实现TypeHandler接口。两种方式的本质其实都是实现了TypeHandler接口,最主要是重写了TypeHandler接口的setParameter和getResult方法,他们则是我在文章开头提到的两种类型数据的相互转换。
大家好我是Java最前沿,每天都会给大家分享有用的技术干货,感兴趣的可以关注我哟。