Mybatis的SqlSession运行原理--2019/10/28

Mybatis的SqlSession运行原理

1、SqlSession简单介绍

(1)SqlSession简单原理介绍

SqlSession提供select/insert/update/delete方法,在旧版本中使用使用SqlSession接口的这些方法,但是新版的Mybatis中就会建议使用Mapper接口的方法(实现底层还是采用SqlSession接口方法实现的)。
  (2)SqlSession重要的四个对象

1)Execute(执行):调度执行StatementHandler、ParmmeterHandler、ResultHandler执行相应的SQL语句;

2)StatementHandler(声明处理):使用数据库中Statement(PrepareStatement)执行操作,即底层是封装好了的prepareStatement;

3)ParammeterHandler(参数处理):处理SQL参数;

4)ResultHandler(结果处理):结果集ResultSet封装处理返回。

2、SqlSession四大对象

(1)Execute执行器**:它是真正执行Java与数据库交互的东西,参与了整个SQL查询执行过程中**

分类:

1)主要有三种执行器:
简易执行器SIMPLE(不配置就是默认执行器)、
REUSE是一种重用预处理语句、
BATCH批量更新、批量专用处理器

作用

白话版

Execute调用 (声明执行对象) 的(准备方法) ,同时设置一些参数 ,在调用(声明执行对象) 的(参数化方法) 设置参数 ,结果处理对象 吧查询结果返回调用者 完成一次查询 完成 预编译

正常版

Executor会先调用StatementHandler的prepare()方法预编译SQL语句,同时设置一些基本的运行参数,然后调用StatementHandler的parameterize()方法(实际上是启用了ParameterHandler设置参数)设置参数,resultHandler再组装查询结果返回调用者完成一次查询完成预编译,简单总结起来就是即先预编译SQL语句,之后设置参数(跟JDBC的prepareStatement过程类似)最后如果有查询结果就会组装返回。

重要知识点:

第一:Executor通过Configuration对象中newExecutor()方法中选择相应的执行器生成

第二:在执行器中StatementHandler是根据Configuration构建的

第三:Executor会执行StatementHandler的prepare()方法进行预编译---->填入connection对象等参数---->再调用parameterize()方法设置参数---->完成预编译

在这里插入图片描述

(2)StatementHanlder数据库会话器

1)作用:简单来说就是专门处理数据库会话。详细来说就是进行预编译并且调用ParameterHandler的setParameters()方法设置参数。

2)数据库会话器主要有三种:SimpleStatementHandler、PrepareStatementHandler、CallableStatementHandler,分别对应Executor的三种执行器(SIMPLE、REUSE、BATCH)

重要的知识点:

第一:StatementHandler的生成是由Configuration方法中newStatementHandler()方法生成的,但是正在创建的是实现了StatementHandler接口的RoutingStatementHandler对象
第二:RoutingStatementHandler的通过适配器模式找到对应(根据上下文)的StatementHandler执行的,并且有SimpleStatementHandler、PrepareStatementHandler、CallableStatementHandler,分别对应Executor的三种执行器(SIMPLE、REUSE、BATCH),之后主要以PrepareStatementHandler为例,我们观察到:它是实现BaseStatementHandler接口的,最后BaseStatementHandler又是实现StatementHandler接口的 它主要有三种方法:prepare、parameterize和query

第三:在BaseStatementHandler中重写prepare()方法,instantiateStatement()方法完成预编译,之后设置一些基础配置(获取最大行数,超时)

第四:instantiateStatement()预编译实际上也是使用了JDBC的prepareStatement()完成预编译

第五:在prepareStatement中重写parameterize()方法。prepare()预编译完成之后,Executor会调用parameterize()方法(在上面的Executor部分中已经做了介绍),实际上是调用ParameterHandler的setParameters()方法

(3)ParameterHandler参数处理器

作用:对预编译中参数进行设置,如果有配置typeHandler,自然会对注册的typeHandler对参数进行处理

重要知识点

第一:Mybatis提供了ParamterHandler的默认实现类DefalutParameterHandler

第二:从parameterObject中取到参数,然后使用typeHandler(注册在Configuration中)进行参数处理:

(4)ResultSetHandler结果集处理器

作用:很简单,就是组装结果返回结果集

重要知识点

第一:ResultSetHandler接口,handlerResultSets()是包装并返回结果集的,handleOutputParameters()是处理存储过程输出参数的
 第二:Mybatis提供了默认的ResultSetHandler实现类DefaultResultSetHandler,其中重点是handlerResultSets()的实现,
  第三:在Executor中doQuery()方法返回了封装的结果集

第四:实际上是返回结果是调用了resultSetHandler的handleResultSets()方法

3、SqlSession运行总结

SqlSession的运行主要是依靠Executor执行器调用(调度)StatementHandler、parameterHanlder、ResultSetHandler,Executor首先通过创建StamentHandler执行预编译并设置参数运行,而整个过程需要如下几步才能完成:

private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
    Statement stmt;
    Connection connection = getConnection(statementLog);
    stmt = handler.prepare(connection, transaction.getTimeout());
    handler.parameterize(stmt);
    return stmt;
  }

1)prepare预编译SQL

由适配模式生成的RoutingStatementHandler根据上下文选择生成三种相应的XXXStatementHandler;

在生成的XXXStatementHandler内部instantiateStatement()方法执行底层JDBC的prepareStatement()方法完成预编译

2)parameterize设置参数

默认是DefaultParameterHandler(实现了parameterHandler接口)中setParameter()方法完成参数配置,其中参数从ParameterObject中取出,交给typeHandler处理

3)doUpdate/doQuery执行SQL

返回的结果通过默认的DefaultResultSetHandler(实现了ResultSetHandler接口)封装

运行图总结

在这里插入图片描述

在这里插入图片描述

3)parameterize()方法运行图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值