mybatis查找typeHandler过程分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis查找typeHandler过程分析相关的知识,希望对你有一定的参考价值。

参考技术A 将sql中的所有待填参数的类型和参数的类型做组合
org.apache.ibatis.builder.SqlSourceBuilder#parse

参数处理:通过sql中的参数“authorId,jdbcType=VARCHAR”解析jdbcType,java类型是通过参数类型解析的。因此如果sql中没有写jdbcType=VARCHAR,这里将解析不到jdbcType,所以查找typehandler时将只通过javaType查找
org.apache.ibatis.builder.SqlSourceBuilder.ParameterMappingTokenHandler#buildParameterMapping

处理结果:通过类型查找typeHandler
org.apache.ibatis.executor.resultset.ResultSetWrapper#getTypeHandler

获取typeHandler
org.apache.ibatis.type.TypeHandlerRegistry

封装resultMap,其中已经封装好了所使用的typeHandler,如果查询语句没有使用resultMap,这里封装时没有添加typehandler
org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)

mybatis sql的执行过程有sql的解析和结果集映射,这两个过程都使用了typehandler。

sql解析时会将参数填充到sql中,此时会通过jdbcType和javaType来查找对应的typeHandler(如果sql中没有使用类似“jdbcType=BIGINT”,则无法获取该jdbcType,因此只能通过javaType去查找对应的typeHandler)。
例如sql如下:

jdbcType是通过sql中“jdbcType=BIGINT”来获取的,所以如果我们在写sql时如果不填写“jdbcType=BIGINT”,则sql解析时将无法获取该字段的jdbcType。javaType是通过参数的名字,通过反射获取该属性的类型的。

结果集映射时分两种:使用ResultMap和不使用ResultMap
①使用ResultMap

如上述所示,如果使用ResultMap,则mybatis会根据其中的jdbcType和反射得到的java类型,来查找typeHandler。

②不使用ResultMap
例如sql如下:

这种情况下查询到结果集并映射到实体类时,无法获取到每个字段的jdbcType,而每个字段的javaType会通过反射获取到。然后通过javaType去查找typeHandler。

mybatis之typehandles

mybatis之typehandles
无论是Mybatis在预处理语句PreparedStatement中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成java类型。

重写类型类型处理器或者创建自己的类型处理器来处理不支持或者类标准的类型:
实现:org.apache.ibatis.type.Typehandler接口
setParameter:通过preparedStatement对象设置参数,将T类型的数据存入数据库。
getResult:通过列名或者下标来获取结果数据,也可以通过CallableStatement获取数据。
继承:org.apache.ibatis.type.BaseTypeHandler

XML:configuration中属性配置是有顺序的

Mybatis设置类型处理器的java类型:
在typehandler element 上增加一个javaType 属性,比如:javaType=“String”,
在TypeHandler class 上增加一个 @MapperdYTypes 注解来指定与其关联的Java类型列表。
设置两种方式来指定被关联的JDBC类型:
在类型处理器的配置元素上增加一个jdbcType属性:jdbcType=“VARCHAR”,
在类型处理器上增加一个@MappedJdbcTypes注解来指定与其关联的JDBC类型列表。

如果在配置xml上指定,则注解方式被忽略。

注意在使用自动检索autodiscovery功能的时候,只能通过注解方式指定JDBC类型。

Mybatis之EnumTypeHandler 和 EnumOrdinalTypeHandler

一对一映射:
嵌套结果映射:
<association resultMap="XxxResult">
一次查询多张表将数据分别映射
嵌套结果查询:
<association property="address" column="addr_id" select="findAddressById"></assocaiation>
一次查询一张表,多次查询,最终组合信息得到完整信息。
一对多映射:
主键放在一分那个表外键放在多的那个表。
collection
多对多映射:
桥表
表各自放各自信息,桥表负责拿其他表主键当外键。
有特殊符号的话 需要用 <![CDATA[ 特殊符号 ]]> 例如 < &




























以上是关于mybatis查找typeHandler过程分析的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis自定义TypeHandler实现数据库Json数组转List<T>对象

Mybatis自定义TypeHandler实现数据库Json数组转List<T>对象

Mybatis TypeHandler 的简单应用及源码分析

MyBatis 源码分析 - 配置文件解析过程

Mybatis 系列5

Mybatis 3.4.4 升级到3.4.5+版本导致读写操作的时候使用不同的TypeHandler的解决方案