mybatis中Mapper接口执行SQL原理概述

mybatis执行sql语句的概述

在下面的测试代码中,setUp 方法用于创建 SqlSessionFactory 工厂,该SqlSessionFactory 工厂的用途是创建 SqlSession。

  private static SqlSessionFactory sqlSessionFactory;

  @BeforeAll
  static void setUp() throws Exception {
    
    
    // create an SqlSessionFactory
    try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/batch_test/mybatis-config.xml")) {
    
    
      sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }
  }

通过 SqlSession 可为我们的数据库访问接口 UserDao 接口 生成一个代理对象。MyBatis 会将接口方法 getUser 和 SQL 映射文件中配置的 SQL 关联起来,这样调用该方法等同于执行相关的 SQL。

  @Test
  void shouldGetAUserNoException() {
    
    
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false)) {
    
    
      try {
    
    
        UserDao userdao = sqlSession.getMapper(UserDao.class);
        User user = userdao.getUser(1);
      } finally {
    
    
        sqlSession.commit();
      }
    } catch (Exception e) {
    
    
      Assertions.fail(e.getMessage());
    }
  }
SqlSession为mybatis提供功能的原理

利用sqlSessionFactory建会话对象SqlSession,基于会话sqlSession对象调用相应的Mapper方法。但是凭什么我们只需要构建一个SqlSession对象就能够完全操作咱们的MyBatis呢?

这里MyBatis的开发者使用了 外观设计模式 ,将所有的操作Api都封装进了SqlSession内部,让使用者无需关心内部的底层实现就能够使用是不是很完美,那么内部他是如何操作的呢?我们进入到SqlSession内部。

public class DefaultSqlSession implements SqlSession {
    
    

  private final Configuration configuration;
  private final Executor executor;

  private final boolean autoCommit;
  private boolean dirty;
  private List<Cursor<?>> cursorList;

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

  public DefaultSqlSession(Configuration configuration, Executor executor) {
    
    
    this(configuration, executor, false);
  }
  
  ...... 省略代码
}

我们可以里看到SqlSession内部封装了一个Executor对象,也就是MyBatis的执行器,然后通过构造方法传递过来!后续所有的查询逻辑都是调用Executor内的方法来完成的实现,而SqlSession本身不做任何操作,所以就能仅仅通过一个对象,来构建起整个Mybatis框架的使用!

猜你喜欢

转载自blog.csdn.net/Hello_Ray/article/details/112320021