mybatis 05 JDBC处理器StatementHandler解析

  1. StatementHandler的结构
  2. StatementHandler的执行流程
    1. 参数处理器
      1. 程序结构
      2. ParamNameResolver 参数转换
      3. ParameterHandler 参数映射
      4. TypeHandler 参数类型处理器
    2. 结果集处理器

StatementHandler的结构

  • 调用流程

    SqlSession -> Executor -> StatementHandler

  • 定义

    StatementHandler是JDBC处理器,基于JDBC构建Statement,设置参数然后执行sql
    每次调用SqlSession,都会生成与之对应的唯一Statement实例对象

    可以看到有三种可选方案,默认是SimpleStatementHandler。通常来说,我们都会设置为PreparedStatementHandler,因为它的效率更高,更加安全

StatementHandler的执行流程

我们可以了解到,PreparedStatementHandler会为PreparedStatement设置SQL参数,而后又对其JDBC的结果集进行解析。这里的参数处理器、结果集处理器是很核心的两个概念

参数处理器

程序结构

大体调用结构,参数转换,参数映射,参数赋值:

这块功能的实现代码不多,核心都在下面这个方法中


ParamNameResolver 参数转换

1、单个参数的情况下,默认不作任何处理,忽略sql中的引用名称。除非设置了@Param

2、多个参数的情况下,全部转换成map。怎么转呢?

  • 转换成param1、param2

  • 基于@Param中name属性转换(底层是转换成map)

  • 基于反射转换成变量名,如果不支持转换成arg0、arg1。JDK1.8之开始,在设置VM参数 -paramters后 ,可用反射获取方法的参数名称。但不建议用这个功能:考虑到实际工作中太多环境都要管理,开发、Jenkins、测试、生产

ParameterHandler 参数映射

参数类型 描述
单个原始类型 直接映射,忽略SQL中引用的名称
Map类型 基于Map key映射
Object类型 基于属性名称映射,支持嵌套对象属性(ognl表达式)访问

TypeHandler 参数类型处理器

在mybatis中用于实现java类型和JDBC类型的相互转换
prepareStatement进行参数设置时,需要通过它将传入的java参数设置成合适的jdbc类型参数

结果集处理器

流程:ResultSetHandler -> ResultContext -> ResultHandler。每处理一行,都会走一遍这个逻辑

  • ResultSetHandler:程序读取jdbc ResultSet数据,每一行都会被转换成相对应的对象。
  • ResultContext:可在转换的过程当中用ResultContext来控制(stop方法)是否要继续转换。
  • ResultHandler:转换后的对象都会暂存在ResultHandler中,最后统一封装成list返回给调用方

ResultContext的stop方法,应用场景是什么呢?

  • 查找某一种业务内容,查到后停止。
  • 如果数据量大的话,就会导致大对象,内存溢出(OOM)。

转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:mybatis 05 JDBC处理器StatementHandler解析

字数:621

本文作者:夏来风

发布时间:2020-06-07, 15:37:24

原始链接:http://www.demo1024.com/blog/mybatis-05-statementHandler/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。