mybatis查找typeHandler过程分析

mybatis查找typeHandler过程分析,第1张

将sql中的所有待填参数类型和参数的类型做组合

orgapacheibatisbuilderSqlSourceBuilder#parse

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

orgapacheibatisbuilderSqlSourceBuilderParameterMappingTokenHandler#buildParameterMapping

处理结果:通过类型查找typeHandler

orgapacheibatisexecutorresultsetResultSetWrapper#getTypeHandler

获取typeHandler

orgapacheibatistypeTypeHandlerRegistry

封装resultMap,其中已经封装好了所使用的typeHandler,如果查询语句没有使用resultMap,这里封装时没有添加typehandler

orgapacheibatisbuilderMapperBuilderAssistant#addMappedStatement(javalangString, orgapacheibatismappingSqlSource, orgapacheibatismappingStatementType, orgapacheibatismappingSqlCommandType, javalangInteger, javalangInteger, javalangString, javalangClass<>, javalangString, javalangClass<>, orgapacheibatismappingResultSetType, boolean, boolean, boolean, orgapacheibatisexecutorkeygenKeyGenerator, javalangString, javalangString, javalangString, orgapacheibatisscriptingLanguageDriver, javalangString)

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太多压力,为什么换个想法,在得到查询结果后再对list集合排序呢?这样就算再复杂的排序也可以做到,并且可以自定义比较器来动态的制定排序方式,配置文件的可读性也会增强。

1、定义 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。 2、使用原因 MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射

不使用@Param注解时

当传入的参数只有一个时,在test语句中必须使用 _parameter 获取这个参数

在sql中则 #{}可以通过任意的key来获取这个参数

所以这里when test 中使用的_parameter代表这个参数,而在sql中使用#{keyword}代表这个参数

LOCATE(substr,str,pos) 这是sql的函数,返回第一次出现在字符串str的子串substr的位置,从位置pos开始,substr不在str中,则返回0。

所以LOCATE(#{keyword}, pproject_name,1)>0 和 pproject_name = #{keyword} 是不一样的条件。它等价于 pproject_name like ‘%#{keyword}%’,当然这里不能直接这么写,要使用like在mybatis的sql中需要使用CONCAT函数。

LOCATE(#{keyword}, pproject_name,1)>0 等价于 pproject_name like CONCAT('%',#{keyword},'%')

以上就是关于mybatis查找typeHandler过程分析全部的内容,包括:mybatis查找typeHandler过程分析、Mybatis参数问题..、获取不到my batis system 异常等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9701343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存