MyBatis 01 — SqlSession SqlSEssionFactory

1 DefaultSqlSessionFactory

SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession
SqlSessionFactoryBuilder

  • XMLConfigBuilder 解析XML
  • Configuration 存储配置信息,按需创建对象,贯穿MyBatis整个执行流程
    在这里插入图片描述

1.1 实例化 XMLConfigBuilder

new XMLConfigBuilder(inputStream, environment, properties); ===> XMLConfigBuilder

  • 在这个过程中实例化 XPathParser、Document 在这里插入图片描述

1.2 实例化 Configuration

parser.parse() ===> Configuration

XMLConfigBuilder parser ---- prase()
XPathParser parser ---- evalNode()
(在实例化XMLConfigBuilder的时候已经创建好)
在这里插入图片描述

1.3 实例化 DefaultSqlSessionFactory

build(parser.parse()); ===> DefaultSqlSessionFactory
在这里插入图片描述

SqlSessionFactory

public interface SqlSessionFactory {

  SqlSession openSession();
  // ...
  // openSession 的各种重载 略
  // ...
  Configuration getConfiguration();

}

DefaultSqlSessionFactory

实现了 SqlSessionFactory 接口的 openSession 方法
openSession—> openSessionFromConnection / openSessionFromDataSource


2 DefaultSqlSession

2.1 SqlSession

  • SqlSession 只是一个门面 真正执行操作的是Executor
  • 定义数据库的操作:可以直接执行增、删、改、查
  • 获取 Mapper 通过Mapper操作数据库
  • 事务管理
  • 缓存管理
public interface SqlSession extends Closeable {
  /**
   * Retrieve a single row mapped from the statement key.
   */
  <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);
  <T> Cursor<T> selectCursor(String statement);
  <T> Cursor<T> selectCursor(String statement, Object parameter);
  <T> Cursor<T> selectCursor(String statement, Object parameter, 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();
  @Override
  void close();
  // 缓存
  void clearCache();

  Configuration getConfiguration();
  // mapper
  <T> T getMapper(Class<T> type);
  Connection getConnection();
}

2.2 创建 DefaultSqlSession

openSession—> openSessionFromConnection / openSessionFromDataSource
在这里插入图片描述

2.2.1 配置事务管理器 Transaction
      Transaction tx = null;
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
2.2.2 Environment

数据库环境的配置信息,包含了事务管理器 transactionManager 和数据源 DataSource 信息。
final Environment environment = configuration.getEnvironment();
在这里插入图片描述

2.2.3 Transaction

在这里插入图片描述

2.2.4 实际执行SQL的是Executor

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3 Mapper代理

3.1 SqlSession使用方式

  • 读取xml
 	String resource = "resource/mybatis-config.xml";
   	Reader reader = Resources.getResourceAsReader(resource);
  • 创建SqlSessionFactory
  • 打开Session
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);         
	SqlSession sqlSession = sqlSessionFactory.openSession();
① 通过Mapper
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	User user = userMapper.getUser("xxx");
② 直接调用
   User user = sqlSession.selectOne("mapper里sql方法的绝对路径 xxx.xxx.mapper.getUser");

3.2 getMapper 返回的是Mapper的代理类

SqlSession —> Configuration—>MapperRegistry—>MapperProxyFactory—>MapperProxy
在这里插入图片描述

3.3 MapperProxy

在这里插入图片描述

3.3.1 MapperProxyFactory 创建代理对象的工厂类
  • (MapperRegistry)以SQlSession为参数,创建 MapperProxy
    mapperProxyFactory.newInstance(sqlSession);
    在这里插入图片描述
  • 用MapperProxy 代理 Mapper,这样在调用Mapper接口方法的时候,实际上是调用代理类的方法,最终通过SqlSession 和 数据库进行交互
    在这里插入图片描述
3.3.2 invoke方法 MapperProxy —> MapperMethod

在这里插入图片描述

3.3.3 MapperMethod —> SqlSession

在这里插入图片描述

所以执行过程为

Mapper接口 —> MapperRegistry —> MapperProxyFactory —> MapperProxy —> SqlSession —> Executor —> StatementHandler —> Statement

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值