5.API详解

Dao 中需要通过 SqlSession 对象来操作 DB。而 SqlSession 对象的创建,

需要其工厂对象 SqlSessionFactory。SqlSessionFactory 对象,

需要通过其构建器对象 SqlSessionFactoryBuilder 的 build()方法,在加载了主配置文件的输入流对象后创建

a)Resource类

  Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析 资源文件,返回不同类型的 IO 流对象。

b)SqlSessionFactoryBuilder

  SqlSessionFactory 的创建,需要使用 SqlSessionFactoryBuilder 对象的 build()方法。由于

  SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。

  所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。

c)SqlSessionFactoy接口

SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所 以一个应用只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。

  • openSession(true):创建一个有自动提交功能的 SqlSession
  • openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
  • openSession():同 openSession(false)

d)SqlSession接口

  SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,

  一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。

  SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将其关闭。

  再次需要会话,再次创建。而在关闭时会判断当前的 SqlSession 是 否被提交:若没有被提交,则会执行回滚后关闭;

  若已被提交,则直接将 SqlSession 关闭。 所以,SqlSession 无需手工回滚。

  SqlSession 封装了 各种 CRUD方法,当调用这些方法时,会去mapper.xml映射文件中去找相应标签下的SQL语句

e)源码分析

A、输入流的关闭

  在输入流对象使用完毕后,不用手工进行流的关闭。因为在输入流被使用完毕后,

  SqlSessionFactoryBuilder 对象的build() 方法会自动将输入流关闭

B、SqlSession的创建

  无参的openSession()方法,将事务的自动提交直接赋值为false。

  而所谓创建SqlSession,就是加载了主配置文件,创建了一个执行器对象(将来用于执行映射文件中的SQL语句)

  初始化了一个DB数据被修改的标志变量dirty,关闭了事务的自动提交功能

C、增删改的执行

  对于SqlSession的insert()、delete()、uodate()方法,其底层均是调用了update方法

  从源码可知,无论执行增、删还是改,均是对数据进行修改,均将dirty变量设置为true

  且在获取到映射文件中指定id的SQL语句后,由执行器executor执行

D、SqlSession的提交 commit()

  执行了SqlSession的更新,dirty变量的值发生了变化,表示数据被修改了,此时进行SqlSeesion的提交,

  才会顺利的让事务进行提交,在没有更新的情况下,是不会提交的

  执行SqlSession的无参commit()方法,最终会将事务进行提交

E、SqlSession的关闭

  执行了SqlSession的更新,dirty变量的值发生了变化,表示数据被修改了,此时进行SqlSeesion的关闭,

  才会进行事务的回滚,恢复数据

  若没有执行SqlSession的更新,dirty的值没有改变,

  在SqlSession进行关闭时,会将事务回滚后关闭。所以,对于MyBatis程序,无需通过显示地对SqlSession进行回滚

所以:dirty变量是一个很关键的变量,它决定了 事务是否进行提交和回滚

时间: 2024-10-12 23:25:31

5.API详解的相关文章

Android基础入门教程——8.3.16 Canvas API详解(Part 1)

Android基础入门教程--8.3.16 Canvas API详解(Part 1) 标签(空格分隔): Android基础入门教程 本节引言: 前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在Android基础入门教程--8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前

cublas 矩阵相乘API详解

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include "cublas_v2.h" void multiCPU(float *c, float *a, float *b, unsigned int aH, unsigned int aW, unsigned int

elasticsearch中api详解

一.cluster API详解 1.cluster health(获取集群的状态) 集群状态: green:绿色表示所有的碎片都被分配 yellow:黄色表示主碎片被分配,但副本不是     red:表示特定的碎片没有在集群中分配 请求参数 level: cluster,indices,shards wait_for_status: green,yellow,red [[email protected] ~]# curl -XGET 'http://10.2.11.225:9200/_clust

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法细节,很难去根据业务的场景进行算法配置和调优. 本文将深入算法API去解释Mahout推荐算法底层的一些事. 1. Mahout推荐算法介绍 Mahoutt推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法

hibernate学习(2)——api详解对象

1   Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户加载配置文件 public void fun1(){ //1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml Configuration conf = new Configuration().configure(); //1.2 如果配置文件不符合默认加

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内部使用四元数来表示所有的旋转. Quaternion是基于复数,并不容易直观地理解. 不过你几乎不需要访问或修改单个四元数参数(x,y,z,w); 大多数情况下,你只需要获取和使用现有的旋转(例如来自"Transform"),或者用四元数来构造新的旋转(例如,在两次旋转之间平滑插入). 大

Android基础入门教程——8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash

Android基础入门教程--8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash 标签(空格分隔): Android基础入门教程 本节引言: 在Canvas的API文档中,我们看到这样一个方法:drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) 这个Matrix可是有大文章的,前面我们在学Paint的API中的ColorFilter中曾讲过ColorMatrix 颜色矩阵,一个4 * 5 的矩阵

WinInet API详解

一.概述 WinInet(「Windows Internet」)API帮助程序员使用三个常见的Internet协议,这三个协议是:用于World Wide Web万维网的超文本传输协议(HTTP:Hypertext Transfer Protocol).文件传输协议(FTP:File Transfer Protocol)和另一个称为Gopher的文件传输协议.WinInet函数的语法与常用的Win32 API函数的语法类似,这使得使用这些协议就像使用本地硬盘上的文件一样容易. 1.WinInet

网络编程socket基本API详解(转)

网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类

socket API详解

send函数 int send( SOCKET s,   const char FAR *buf,   int len,   int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据. 客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答. 该函数的第一个参数指定发送端套接字描述符: 第二个参数指明一个存放应用程序要发送数据的缓冲区: 第三个参数指明实际要发送的数据的字节数: 第四个参数一般置0. 这里只描述同步