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框架的使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值