文章目录

  • SqlSessionFactory
  • SqlSession
  • SqlSessionFactory调用过程
  • SqlSessionFactory和SqlSession具体实现过程

SqlSessionFactory

1.SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。

2.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

3.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。

4.SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。

5.SqlSessionFactory是创建SqlSession的工厂。

SqlSessionFactory接口源码如下所示:

package org.apache.ibatis.session; import java.sql.Connection; public interface SqlSessionFactory { SqlSession openSession();//这个方法最经常用,用来创建SqlSession对象。SqlSession openSession(boolean autoCommit); SqlSession openSession(Connection connection); SqlSession openSession(TransactionIsolationLevel level); SqlSession openSession(ExecutorType execType); SqlSession openSession(ExecutorType execType, boolean autoCommit); SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level); SqlSession openSession(ExecutorType execType, Connection connection); Configuration getConfiguration();
}

SqlSession

1.SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection。

2.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。

3.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。

4.每个线程都应该有它自己的SqlSession实例。

5.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。

6.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

SqlSession接口源码如下所示:

package org.apache.ibatis.session;
import java.io.Closeable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.executor.BatchResult;
public interface SqlSession extends Closeable { <T> T selectOne(String statement); <T> T selectOne(String statement, Object parameter); <E> List<E> selectList(String statement); <E> List<E> selectList(String statement, Object parameter); <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds); <K, V> Map<K, V> selectMap(String statement, String mapKey); <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey); <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds); void select(String statement, Object parameter, ResultHandler handler); void select(String statement, ResultHandler handler); void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler); int insert(String statement); int insert(String statement, Object parameter); int update(String statement); int update(String statement, Object parameter); int delete(String statement); int delete(String statement, Object parameter); void commit(); void commit(boolean force); void rollback(); void rollback(boolean force); List<BatchResult> flushStatements(); void close(); void clearCache(); Configuration getConfiguration(); <T> T getMapper(Class<T> type); Connection getConnection();
}

SqlSessionFactory调用过程

mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:

  1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
 String resource = "mybatis-config.xml";//全局配置文件路径InputStream inputStream = Resources.getResourceAsStream(resource);//读取xml文件
  1. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
 new SqlSessionFactoryBuilder().build(inputStream);//构建会话工厂类
  1. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作
SqlSession session = sqlSessionFactory.openSession();

SqlSessionFactory和SqlSession具体实现过程

  1. SqlSessionFactoryBuilder去读取mybatis的配置文件,然后build一个 DefaultSqlSessionFactory,即得到SqlSessionFactory
//源码中涉及的包和具体方法为:
//涉及的包为:package org.apache.ibatis.session;//第一个类为:SqlSessionFactoryBuilder,设计到此类的方法为下面部分:
public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {//通过XMLConfigBuilder解析配置文件,解析的配置相关信息都会封装为一个Configuration对象XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);//然后返回一个DefaultSqlSessionFactoryreturn build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}}//得到DefaultSqlSessionFactorypublic SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}//第二个类为:DefaultSqlSessionFactory,涉及的方法为:public DefaultSqlSessionFactory(Configuration configuration) {this.configuration = configuration;}
  1. 获取到SqlSessionFactory之后,就可以利用SqlSessionFactory方法的openSession来获取SqlSession对象了。
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {//通过Confuguration对象去获取Mybatis相关配置信息, Environment对象包含了数据源和事务的配置// execType为执行器类型,配置文件中定义// SimpleExecutor -- SIMPLE 就是普通的执行器。//ReuseExecutor -执行器会重用预处理语句(prepared statements)//BatchExecutor --它是批量执行器final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//定义执行器,是对statement的封装final Executor executor = configuration.newExecutor(tx, execType);//最后返回一个SqlSessionreturn new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}
}
  1. 得到SqlSession对象之后就可以利用SqlSession内部的方法进行CRUD操作了。

注意一点,Connection对象是在SqlSession对象创建之后进行CURD操作中创建的。深入查找之后找到在ManagedTransaction类中找到获取Connection对象的关键代码如下:

  protected void openConnection() throws SQLException {if (log.isDebugEnabled()) {log.debug("Opening JDBC Connection");}//dataSource 来源有三种,JndiDatasource,PooledDataSource,UnpooledDataSource,配置文件中定义this.connection = this.dataSource.getConnection();if (this.level != null) {this.connection.setTransactionIsolation(this.level.getLevel());}}

参考1

SqlSessionFactory和SqlSession详解相关推荐

  1. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  2. MyBatis中SqlSessionFactory和SqlSession简解

    mybatis官网中文文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html mybatis-spring官方中文文档:https://mybatis. ...

  3. SqlSession 详解

    SqlSession是Mybatis最重要的构建之一,可以简单的任务Mybatis一系列的配置目的是生成类似JDBC生成的Connection对象的SqlSession,这样才能和数据库开启" ...

  4. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

    文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...

  5. 【笔记】mybatis的sqlSession和Mapper详解

    文章目录 SqlSession介绍和使用 Mapper映射器 总结 SqlSession介绍和使用 SqlSession是一个接口类,它类似于你们公司前台的美女客服,它扮演着门面的作用,而真正干活的是 ...

  6. 02JavaWeb之MyBatis详解、SqlSession执行、mapper代理执行、动态SQL语句、注解开发、resultMap、resultType、多参数传递

    MyBatis MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发,它封装了JDBC大部分的操作. MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由 ...

  7. java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

    1.两种取值方式的差异 mapper.xml映射文件 select * from t_emp WHERE emp_id=${id} and emp_name=#{name} java查询代码 para ...

  8. mysql映射mapper_Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看 ...

  9. mybatis 详解(三)------入门实例(基于注解)

    1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...

最新文章

  1. 不要把OKR用成 KPI,OKR和KPI有什么区别?
  2. 第四周项目三-随机数函数应用于游戏(猜数字游戏)
  3. 华为今年不会发布鸿蒙系统的手机,谷歌终于放下心了,华为:今年不会有鸿蒙系统的手机开售...
  4. C++Primer学习笔记:第8章 IO库
  5. python find函数 和index的区别_python list的index()和find()的实现
  6. python—如何删除(保留)字符串中除字母、数字外的其他元素
  7. java开发项目心得体会
  8. C++ 遍历json文件
  9. 【达内课程】Android自动化测试框架Robotium
  10. Excel 科学计数法数值转换
  11. 什么叫结构化程序设计?它的主要内容是什么
  12. C++实现端口扫描器
  13. 一款在线Markdown编辑器,Markdown小白神器
  14. 计算机毕业设计-springboot企业考勤管理系统(前后端分离)员工考勤管理系统-公司日常管理系统java代码
  15. (一)Linux中的网络配置
  16. 电影点评系统论文java_java电影在线定制影评管理系统
  17. cad能整体比例缩小吗_如何用cad将图整体比例放大
  18. MxNet系列——how_to——new_op
  19. Adapter的作用及用法
  20. Arduino最便宜的模拟量采集

热门文章

  1. Java中间件-Hystrix
  2. Ubuntu18.04+Anaconda+tensorflow-gpu(极其简单,纯干货,网上教程太坑!!!)
  3. 软件设计师中级- 系统安全分析与设计
  4. 2. 软件工程概论——结构化分析
  5. linux最多创建几个扩展分区,Linux分区:最多支持四个主分区、扩展分区
  6. mackbook14自带linux系统,华为MateBook D 14笔记本预装linux改win10系统
  7. 发明型专利(算法类)书写注意事项
  8. 红队攻击手特训营“第九期” 1.6号开始开班~
  9. C# 中的SqlCommand 的用法和它的几个方法
  10. c语言 结构体 ppt,C语言结构体ppt课件