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变量是一个很关键的变量,它决定了 事务是否进行提交和回滚

5.API详解的更多相关文章

  1. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  2. jqGrid APi 详解

    jqGrid APi 详解 jqGrid皮肤 从3.5版本开始,jqGrid完全支持jquery UI的theme.我们可以从http://jqueryui.com/themeroller/下载我们所 ...

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

    1   Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...

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

    网络编程socket基本API详解   socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...

  5. 转】Mahout推荐算法API详解

    原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...

  6. dom4j api 详解--XPath 节点详解

    dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...

  7. 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

    原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...

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

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...

  9. SDN 网络系统之 Mininet 与 API 详解

    SDN 网络系统之 Mininet 与 API 详解 Mininet 是轻量级的软件定义网络系统平台,同时提供了对 OpenFlow 协议的支持.本文主要介绍了 Mininet 的相关概念与特性,并列 ...

  10. Webdriver之API详解(1)

    说明 Webdriver API详解,基于python3,unittest框架,driver版本和浏览器自行选择. 本内容需要对python3的unittest框架有一个简单的了解,这里不再赘述,不了 ...

随机推荐

  1. 【ASP.NET Core学习】远程过程调用 - gRPC使用

    本文介绍在gRPC使用,将从下面几个方面介绍 什么是RPC 什么时候需要RPC 如何使用gRPC 什么是RPC RPC是Remote Procedure Call简称,翻译过来是远程过程调用.它是一个 ...

  2. iOS 11适配和iPhone X的适配

    这两天对自己负责的项目进行iOS 11和iPhone X的适配,网上的博客很多,也看了很多别人的记录博客,这里把自己遇到的问题记录下,当然有些不仅仅是iOS 11和iPhone X的适配,还包括自己遇 ...

  3. 使用linux flock文件锁实现任务锁定避免计划任务程序冲突

    格式:flock [-sxun][-w #] fd#flock [-sxon][-w #] file [-c] command选项-s, --shared: 获得一个共享锁 -x, --exclusi ...

  4. 依赖管理系统 go modules

    golang在1.11版本中引入了新的包管理工具 go mod 类似于maven包管理(多项目公用),而之前的vendor类似于node的node_modules管理(各个项目一份) 依赖信息添加到g ...

  5. SQL注入(字符型)

       靶场:sqli-labs @SQLi最重要的一点:别上来就对着输入框注入,完整语句写出来,始终在语句中写完整的,最后把完整的一部分截取出来作为输入 @URL编码:为避免歧义,URL中,如 %2b ...

  6. Linux 系统信息查询大全

    Linux常用系统命令 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /etc/redhat-release ...

  7. kafka producer partitions分区器(七)

    消息在经过拦截器.序列化后,就需要确定它发往哪个分区,如果在ProducerRecord中指定了partition字段,那么就不再需要partitioner分区器进行分区了,如果没有指定,那么会根据k ...

  8. [转帖]龙芯:Docker 配置与实践清单

    Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...

  9. 提取json字符串中指定格式中的参数值

    直接上代码: import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; p ...

  10. (十五)mybatis 逆向工程

    目录 为什么需要逆向工程 使用方法 如何读懂生成的代码 总结 为什么需要逆向工程 对于数据库中的那么多的表 ,基本的 CRUD 操作 ,以及 mybatis 需要使用的 接口.mapper ,这些工作 ...