SqlSession是啥???

SqlSession是啥???Mybatis 的 SqlSession 运行原理前言 SqlSession 是 Mybatis 最重要的构建之一 可以简单的认为 Mybatis 一系列的配置目的是生成类似 JDBC 生成的 Connection 对象的 SqlSession 对象 这样才能与数据库开启 沟通 通过 SqlSession 可以实现增删改查 当然现在更加推荐是使用 Mapper 接口形式 那么它是如何执行实现的 这就是本篇博文所介绍的东西

了解SqlSession的运作原理是学习Mybatis插件的必经之路,因为Mybatis的插件会在SqlSession运行过程中“插入”运行,如果没有很好理解的话,Mybatis插件可能会覆盖相应的源码造成严重的问题。鉴于此,本篇博文尽量详细介绍SqlSession运作原理!

建议:在我之前的博文《Mybatis缓存(1)——–系统缓存及简单配置介绍》中介绍到SqlSession的产生过程,可以先理解后再读此博文可能会更加好理解!

注:本篇博文也是我最近真正理解Mybatis才开始编写的,可能有些地方不太准确,如果有错误之处敬请指出,另外创作不易,望转载告之,谢谢!

参数资料:《深入浅出Mybatis基础原理与实践》(我这里只有电子版PDF,需要的朋友可以联系我)

SqlSession提供select/insert/update/delete方法,在旧版本中使用使用SqlSession接口的这些方法,但是新版的Mybatis中就会建议使用Mapper接口的方法。

映射器其实就是一个动态代理对象,进入到MapperMethod的execute方法就能简单找到SqlSession的删除、更新、查询、选择方法,从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession的接口方法(getMapper()方法等到Mapper)执行SQL查询(也就是说Mapper接口方法的实现底层还是采用SqlSession接口方法实现的)。

注:以上虽然只是简单的描述,但实际上源码相对复杂,下面将结合源码进行简单的介绍!

(2)SqlSession重要的四个对象

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

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

3)ParammeterHandler:处理SQL参数;

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

执行器起到至关重要的作用,它是真正执行Java与数据库交互的东西,参与了整个SQL查询执行过程中。

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

/

  • @author Clinton Begin
    */
    public enum ExecutorType {

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












首先,以SimpleExecutor为例,查看源码我们得到如下几点重要知识点:

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

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

(2)StatementHanlder数据库会话器

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

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

我们从上述Executor的prepareStatement()方法中调用了StatementHandler的parameterize()开始一步步地查看源码,如下得到几点重要的知识点:

第一:StatementHandler的生成是由Configuration方法中newStatementHandler()方法生成的,但是正在创建的是实现了StatementHandler接口的RoutingStatementHandler对象

switch (ms.getStatementType()) { case STATEMENT: delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case PREPARED: delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case CALLABLE: delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; default: throw new ExecutorException("Unknown statement type: " + ms.getStatementType()); } 

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

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

查看并学习源码,得到以下几点重要知识点:

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

Object getParameterObject();

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

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

第一:ResultSetHandler接口,handlerResultSets()是包装并返回结果集的,handleOutputParameters()是处理存储过程输出参数的

List handleResultSets(Statement stmt) throws SQLException;

Cursor handleCursorResultSets(Statement stmt) throws SQLException;

第三:在Executor中doQuery()方法返回了封装的结果集

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

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

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

2)parameterize设置参数

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

3)doUpdate/doQuery执行SQL

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

(2)运行图总结

1)SqlSession内部总运行图

2)prepare()方法运行图:                              3)parameterize()方法运行图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224155.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:35
下一篇 2026年3月17日 下午12:35


相关推荐

  • h3c路由器配置nat转换命令_路由器nat地址转换配置

    h3c路由器配置nat转换命令_路由器nat地址转换配置#NAT的配置第一步,使用ACL来定义,需要做转换的源地址acladvanced6002rule2permitipsource192.168.55.00.0.0.255#NAT的配置第二步:用address-group来定义,希望转成什么公网地址nataddress-group1address192.168.88.155192.168.88.155natoutbound6002#NAT的配置第三步:在路由器的出接口,启用NAT参考资料:一看…

    2022年10月17日
    6
  • NLTK使用汇总_bom用量计算公式

    NLTK使用汇总_bom用量计算公式0.如何离线安装NLTK1.LookupError:Resourcenotfound.2.分句、分词和停用词3.词性标注和词形还原4.分句5.N-gram

    2025年7月21日
    6
  • display属性详解

    display属性详解根据 CSS 规范的规定 每一个网页元素都有一个 display 属性 用于确定该元素的类型 每一个元素都有默认的 display 属性值 比如 div 元素 它的默认 display 属性值为 block 称为块元素 而 span 元素的默认 display 属性值为 inline 称为 行内 元素 块元素与行元素是可以转换的 也就是说 display 的属性值可以由我们来改变 display 常用属性值 1 none 隐藏对象 2 inline 指定对象为行内元素 3 block 指定对象为块元素 4 inline bl

    2026年3月20日
    2
  • MCP智能体开发宝典:最全构建指南与实操解析(附代码示例)

    MCP智能体开发宝典:最全构建指南与实操解析(附代码示例)

    2026年3月15日
    4
  • 美女图片采集器 (源码+解析)[通俗易懂]

    美女图片采集器 (源码+解析)[通俗易懂]前言:有一段时间没写博客了,”持之以恒”徽章都暗了,实在不该。前一段确实比较忙,…小小地给自己的懒找个借口吧。大二即将结束,学习iOS也有一段时间了。今天抽点时间,开源一个前几天刚上传的App里面的一个功能,RT,美女图片采集器。 美女..相信没有人不喜欢吧,基于此,这个小Demo应运而生。注: 本文正在参加博

    2025年11月14日
    5
  • nbtscan在windows和linux下编译

    nbtscan在windows和linux下编译nbtscan 在 windows 和 linux 下编译 windows 下载编译 linux 下载编译参考文章 windows 下载 http unixwiz net tools nbtscan source 1 0 35 zip 解压之后 修改 nbtscan c 的 66 行 include getopt i 为 include getopt h 修改 nbtscan common h 为 libcommon h 修改文件中 nbtscan common h 为 libcommon h 编译 CMakeLists txtcma

    2026年3月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号