zoukankan      html  css  js  c++  java
  • spring-mybatis中的SqlSessionTemplate 讲解(转载)

    读完这篇文章,你将会知道:

    • SqlSessionTemplate 和 SqlSessionManager 有什么不同。
    • SqlSessionTemplate 如何实现线程安全。
    • SqlSessionTemplate 怎么和数据库打交道。

    目录

    SqlSessionTemplate 和 SqlSessionManager 有什么不同。

    SqlSessionTemplate 如何实现线程安全

    SqlSessionTemplate 怎么和数据库打交道

    ExecutorType:Executor的类型

    PersistenceExceptionTranslator:处理持久化框架的异常


    SqlSessionTemplate 和 SqlSessionManager 有什么不同

    SqlSessionTemplate是Mybatis为了接入Spring提供的Bean。通过TransactionSynchronizationManager中的ThreadLocal<Map<Object, Object>>保存线程对应的SqlSession,实现session的线程安全。

    SqlSessionManager是Mybatis不接入Spring时用于管理SqlSession的Bean。通过SqlSessionManagger的ThreadLocal<SqlSession>实现session的线程安全。

    SqlSessionTemplate里面有4个类变量

    字段 类型 描述
    sqlSessionFactorySqlSessionFactorysession工厂
    executorTypeExecutorTypeExecutor的类型:SIMPLE, REUSE, BATCH
    sqlSessionProxySqlSessionSqlSession代理对象,注册了SqlSessionInterceptor反射处理器,实际上的方法调用都是通过SqlSessionInterceptor反射实现的。
    exceptionTranslatorPersistenceExceptionTranslatorSpring提供的接口,用于处理持久化框架的异常

    SqlSessionTemplate实际上是通过内部类SqlSessionInterceptor提供的反射功能去执行具体的操作。

    下图是SqlSessionTemplate的构造函数中,sqlSessionProxy的构建方式,通过注册SqlSessionInterceptor这个反射处理器去执行SqlSession中的方法。

    SqlSessionTemplate 如何实现线程安全

    在进行反射的时候,invoke通过getSqlSession方法拿到DefaultSqlSession实例,getSqlSession方法里面处理了sqlSession的线程安全问题(通过ThreadLocal实现)。

    下面详细讲解 getSqlSession() 是如何工作的:

    (1)getSqlSession方法中,在资源同步管理器上获取资源(SqlSessionHolder),SqlSessionHolder实际上可认为是SqlSession的一层包装

    (2)在TransactionSynchronizationManager.getResource方法中,根据key生成一个autualKey,然后通过doGetResource方法获得对应的SqlSessionHolder。

    (3)在doGetResource(key)中,会用到resources这个 ThreadLocal<Map<Object, Object>> 对象,每个线程通过维护自己的recources资源(包括SqlSessionHolder)来保证线程安全。

    SqlSessionTemplate 怎么和数据库打交道

    SqlSessionTemplate不直接和数据库打交道,实际上SqlSessionTemplate调用的还是DefaultSqlSession这个类,由DefaultSqlSession去做具体的事情。

    那么SqlSessionTemplate中的DefaultSqlSession是怎么来的呢?

    我们继续看getSqlSession方法,在getSqlSession中,如果当前线程拿不到session,就是调用sqlSessionFacatory的opernSession方法,开启一个会话。

    在SqlSessionTemplate中,sqlSessionFacatory实际上的实现是“DefaultSqlSessionFacatory”。
    sessionFactory会创建事务、Executor,最终生成一个新的DefualtSqlSession对象。

    ExecutorType:Executor的类型

    类型实例化对象描述
    SIMPLESimpleExecutor每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
    REUSEReuseExecutor可复用Statement。执行update或select时,使用sql作为key在 Map<String, Statement> statementMap 中获得Statement(Statement或PrepareStatement),存在就使用,不存在就创建;用完后,不关闭Statement对象。
    BATCHBatchExecutor批量执行update(jdbc批处理不支持select)。

    PersistenceExceptionTranslator:处理持久化框架的异常

    Spring提供的接口,用于处理持久化框架的异常。

    转载:https://blog.csdn.net/u010841296/article/details/89367296?spm=1001.2014.3001.5501

  • 相关阅读:
    vscode的插件收集
    关于vue移动端的适配
    Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null objec
    android studio 使用 aidl(三)权限验证
    Android权限级别(protectionLevel)
    android studio 使用 aidl(二)异步回调
    android studio 使用 aidl(一)基础用法
    如何获取Android唯一标识(唯一序列号)
    android studio 生成aar和引用aar
    android studio 编译NDK android studio 生成.so文件
  • 原文地址:https://www.cnblogs.com/hujesse4/p/14669921.html
Copyright © 2011-2022 走看看