debug重點方法標(biāo)注:
將sql中的所有待填參數(shù)的類型和參數(shù)的類型做組合
org.apache.ibatis.builder.SqlSourceBuilder#parse
參數(shù)處理:通過sql中的參數(shù)“authorId,jdbcType=VARCHAR”解析jdbcType雄可,java類型是通過參數(shù)類型解析的。因此如果sql中沒有寫jdbcType=VARCHAR击你,這里將解析不到j(luò)dbcType症汹,所以查找typehandler時將只通過javaType查找
org.apache.ibatis.builder.SqlSourceBuilder.ParameterMappingTokenHandler#buildParameterMapping
處理結(jié)果:通過類型查找typeHandler
org.apache.ibatis.executor.resultset.ResultSetWrapper#getTypeHandler
獲取typeHandler
org.apache.ibatis.type.TypeHandlerRegistry
封裝resultMap胖喳,其中已經(jīng)封裝好了所使用的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)
總結(jié):
mybatis sql的執(zhí)行過程有sql的解析和結(jié)果集映射,這兩個過程都使用了typehandler抵皱。
(1)sql解析:
sql解析時會將參數(shù)填充到sql中善榛,此時會通過jdbcType和javaType來查找對應(yīng)的typeHandler(如果sql中沒有使用類似“jdbcType=BIGINT”,則無法獲取該jdbcType叨叙,因此只能通過javaType去查找對應(yīng)的typeHandler)锭弊。
例如sql如下:
update author
set author_id = #{authorId,jdbcType=VARCHAR},
author_name = #{authorName,jdbcType=VARCHAR},
content = #{content,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT};
jdbcType是通過sql中“jdbcType=BIGINT”來獲取的,所以如果我們在寫sql時如果不填寫“jdbcType=BIGINT”擂错,則sql解析時將無法獲取該字段的jdbcType。javaType是通過參數(shù)的名字樱蛤,通過反射獲取該屬性的類型的钮呀。
(2)結(jié)果集映射
結(jié)果集映射時分兩種:使用ResultMap和不使用ResultMap
①使用ResultMap
<resultMap id="BaseResultMap" type="com.qunar.corp.demo.model.Author" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="author_id" property="authorId" jdbcType="VARCHAR" />
<result column="author_name" property="authorName" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
</resultMap>
如上述所示,如果使用ResultMap昨凡,則mybatis會根據(jù)其中的jdbcType和反射得到的java類型爽醋,來查找typeHandler。
②不使用ResultMap
例如sql如下:
<select id="selectByPrimaryKey" resultType="com.qunar.corp.demo.model.Author" parameterType="java.lang.Long" >
select
id, author_id, author_name, content
from author
where id = #{id,jdbcType=BIGINT}
</select>
這種情況下查詢到結(jié)果集并映射到實體類時便脊,無法獲取到每個字段的jdbcType蚂四,而每個字段的javaType會通過反射獲取到。然后通過javaType去查找typeHandler哪痰。