zoukankan      html  css  js  c++  java
  • 5.API详解

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

  • 相关阅读:
    The EF 6.x DbContextGenerator templates are not available for VS2010
    selenium定位tr及td,并获取其文本及属性
    selenium基本操作
    Git入门
    独热编码OneHotEncoder简介
    openCV中直方图均衡化算法的理解
    pyinstaller生成exe文件失败
    图像形态学运算
    对双边滤波的理解
    PyQt中对RadioButton分组
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7419559.html
Copyright © 2011-2022 走看看