MyBatis 的 4 个基本构成:

SqlSessionFactoryBuilder(构造器):

  根据配置信息或者代码来生成 SqlSessionFactory(工厂接口)

SqlSessionFactory:

  依靠工厂来生成 SqlSession(会话),每个 MyBatis 的应用都是以 SqlSessionFactory 的实例为中心的。SqlSessionFactory 通过 SqlSessionFactoryBuilder 获得。MyBatis 提供了两个 SqlSessionFactory 的实现类,DefaultSqlSessionFactory 和 SqlSessionManager,Mybatis 使用的是前者,不过本篇的主角是 SqlSessionManager

SqlSession:

  是一个既可以发送 SQL 去执行并返回结果,也可以获取 Mapper 的接口。SqlSession 类似于一个 JDBC 的 Connection 对象。

SQL Mapper:

  它是 MyBatis 新设计的组件,它是由一个 Java 接口和 XML 文件(或注解)构成的,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果

SqlSessionManager 分析:

实现 SqlSessionFactory、SqlSession 两个接口

SqlSessionFactory 接口中方法包括

  • openSession()
  • ...

SqlSession 接口中方法包括,对数据的各种操作:

  • selectOne()
  • selectList()
  • update()
  • insert()
  • ...

类属性:

  • SqlSessionFactory SqlSessionFactory:用于在 openSession 方法中创建 SqlSession
  • SqlSession sqlSessionProxy:用于与 mapper 交互,注意其属性名带有 Proxy,所以它是通过反射创建的
  • ThreadLocal<SqlSession>:用于用户自己控制 SqlSession 时使用,通过 SqlSessionFactory 工厂创建

构造方法:

私有构造方法:

    入参为 SqlSessionFactory,其中 sqlSessionProxy 通过 JDK 提供的动态代理实现,
    Proxy.newProxyInstance() 入参说明:

    • loader:定义代理类的类加载器
    • interfaces:代理类要实现的接口列表
    • h:指派方法调用的调用处理程序

    Proxy.newProxyInstance() 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序

newInstance 方法:

构建模式,通过该方法来调用构造方法,来初始化 sqlSessionFactory 和 sqlSessionProxy

startManagedSession 方法:

初始化 localSqlSession 属性,通过 sqlSessionFactory.openSession()获得 SqlSession,再将其 set 到 localSqlSession 中

openSession 方法:

该方法来自 SqlSessionFactory 接口的方法列表,通过 sqlSessionFactory.openSession()来获得 SqlSession,openSession 由 DefaultSqlSessionFactory 实现

余下的方法都是 SqlSession 接口的方法实现:

由 sqlSessionProxy 这个 SqlSession 代理对象来执行

内部类 SqlSessionInterceptor:

实现 InvocationHandler 接口,当执行 SqlSession 接口的方式实现时,就会进入这个代理方法中。
可以看到 SqlSession 通过 openSession 方法获得,此处的 sqlSession 实例便是 SqlSession 的代理对象 SqlSessionProxy,之后执行 commit 操作,注意这里使用了 try catch 块,在 finally 中执行 SqlSession 的 close 方法,这使得开发者不必再在代码中去手动 close

参考资料

[1] mybatis 3.4.2 DefaultSqlSessionFactory的优化版SqlSessionManager

[2] MyBatis中SqlSessionManager设计疑问

[3] mybatis源码分析(3)——SqlSessionManager类

MyBatis 之 SqlSessionManager 源码分析的更多相关文章

  1. Springboot中mybatis执行逻辑源码分析

    Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...

  2. MyBatis架构与源码分析<资料收集>

    1.架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html .https://www.cnblogs.com/wangdaijun/p/5296 ...

  3. mybatis 学习四 源码分析 mybatis如何执行的一条sql

    总体三部分,创建sessionfactory,创建session,执行sql获取结果 1,创建sessionfactory      这里其实主要做的事情就是将xml的所有配置信息转换成一个Confi ...

  4. Mybatis原理及源码分析

    什么是Mybatis? Mybatis是一个半自动化的持久层框架. Mybatis可以将向PreparedStatement中的输入参数自动进行映射(输入映射),将结果集映射成Java对象(输出映射) ...

  5. Mybatis源码学习第七天(插件源码分析)

    为了不把开发和源码分析混淆,决定分开写; 接下来分析一下插件的源码,说道这里老套路先说一个设计模式,他就是责任链模式 责任链模式:就是把一件工作分别经过链上的各个节点,让这些节点依次处理这个工作,和装 ...

  6. spring security 实践 + 源码分析

    前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...

  7. Mybatis Mapper接口是如何找到实现类的-源码分析

    KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...

  8. 精尽MyBatis源码分析 - MyBatis-Spring 源码分析

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

随机推荐

  1. 使用 TensorFlow 的起始步骤

    1 学习目标: 学习基本的 TensorFlow 概念 在 TensorFlow 中使用 LinearRegressor 类并基于单个输入特征预测各城市街区的房屋价值中位数 使用均方根误差 (RMSE ...

  2. 《JAVA与模式》之原型模式(转载)

    原型模式其实就是java的拷贝机制 原文出处:http://blog.csdn.net/zhengzhb/article/details/7393528   定义:用原型实例指定创建对象的种类,并通过 ...

  3. PreparedStatement的用法及优点

    jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力.在使用statem ...

  4. 关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结

    关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR. 根据网上解决的说法,分析源码: if (mFirstLayout) { // We don ...

  5. 使用Object#tap使代码更优雅

    今天看spree源码的时候经常看到Object#tap方法.以前只知道有这个方法,而且感觉这个方法调试的作用大于实际,今日看来以前的理解应该不够准确. 先看下官方文档上tap的例子 Yields se ...

  6. python制作exe可执行文件的方法---使用pyinstaller

    python制作exe可执行文件的方法---使用pyinstaller   python生成windows下exe格式的可执行程序有三种可选方案: py2exe是大家所熟知的,今天要介绍pyinsta ...

  7. php把采集内容中图片地址下载并替换成本地地址

    把字符串中地址全部获取到一个数组我们利用preg_match_all函数 代码如下 复制代码 <?php$str='<p><img border="0" s ...

  8. 浅谈cocos2dx(18) 中工厂模式

    ----我的生活.我的点点滴滴! ! cocos2d-x中也有工厂模式.何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其它类对象的类,我们把这个创建其它类对象的类叫做工厂类.而这些被创建的 ...

  9. eclipse 反编译插件 jadclipse

    1. 下载 JadClipse 下载JadClipse:http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download 注意选择与 ...

  10. eclipse热部署配置

    1. 方法一 打开server.xml,找到 比对下:改成下面这样: <Context docBase="dreamlive" path="/ROOT"  ...