美文网首页
mybatis查找typeHandler过程分析

mybatis查找typeHandler过程分析

作者: tomorrowsg | 来源:发表于2020-11-07 23:05 被阅读0次

    debug重点方法标注:

    将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。

    (1)sql解析:

    sql解析时会将参数填充到sql中,此时会通过jdbcType和javaType来查找对应的typeHandler(如果sql中没有使用类似“jdbcType=BIGINT”,则无法获取该jdbcType,因此只能通过javaType去查找对应的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是通过参数的名字,通过反射获取该属性的类型的。

    (2)结果集映射

    结果集映射时分两种:使用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会根据其中的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>
    

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

    相关文章

      网友评论

          本文标题:mybatis查找typeHandler过程分析

          本文链接:https://www.haomeiwen.com/subject/mpccbktx.html