mybatis接口层源码分析-SqlSession

1.策略模式

Strategy Pattern定义了一系列算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。


  • Context:算法调用者,使用setStrategy方法灵活的选择策略(strategy);
    Strategy:算法的统一接口;
    ConcreteStrategy:算法的具体实现。

策略模式的使用场景:

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
  • 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。

2.SqlSession相关类

SqlSession是MyBatis对外提供的最关键的核心接口,通过它可以执行数据库读写命令、获取映射器、管理事务等。


2.1 创建SqlSession的流程

    @Test
    // 测试自动映射以及下划线自动转化驼峰
    public void quickStart() throws IOException {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
        // 4.执行查询语句并返回结果
        TUser user = mapper.selectByPrimaryKey(1);
        System.out.println(user.toString());

    }

调用defaultSqlSessionFactory的方法:

  @Override
  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }
  //从数据源获取数据库连接
  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
        //获取mybatis配置文件中的environment对象
      final Environment environment = configuration.getEnvironment();
      //从environment获取transactionFactory对象
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      //创建事务对象
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      //根据配置创建executor
      final Executor executor = configuration.newExecutor(tx, execType);
      //创建DefaultSqlSession
      return 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();
    }
  }

最后创建DefaultSqlSession:

public class DefaultSqlSession implements SqlSession {

  private final Configuration configuration;//configuration对象,全局唯一
  private final Executor executor;//底层依赖的excutor对象

  private final boolean autoCommit;//是否自动提交事务
  private boolean dirty;//当前缓存是否有脏数据
  private List> cursorList;

  public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
    this.configuration = configuration;
    this.executor = executor;
    this.dirty = false;
    this.autoCommit = autoCommit;
  }

2.2 策略模式的体现

    
    
        
        
            
            
            
            
            
                
                
                
                
                
            
        
  • 1)数据源通过配置UNPOOLED/ POOLED/ JNDI来选择相应的策略,建立相应的数据源。

  • 2)defaultExecutorType配置执行器

        
        

然后代码中根据相应的方式创建相应的执行器:

      //根据配置创建executor
      final Executor executor = configuration.newExecutor(tx, execType);

3.万剑归宗——SqlSession查询接口的调用关系

所以归根结底,SqlSession的所有查询接口最后都归结位Exector的方法调用。

参考

  • 1)享学课堂Lison老师笔记

你可能感兴趣的:(mybatis接口层源码分析-SqlSession)