码迷,mamicode.com
首页 > Windows程序 > 详细

5.API详解

时间:2017-08-23 20:43:59      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:dao   let   工厂   线程   持久化   uil   改变   数据   builder   

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

需要其工厂对象 SqlSessionFactorySqlSessionFactory 对象,

需要通过其构建器对象 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详解

标签:dao   let   工厂   线程   持久化   uil   改变   数据   builder   

原文地址:http://www.cnblogs.com/xuzekun/p/7419559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!