Mybatis源码解析-3通过SqlSession进行查询操作

本文深入解析Mybatis中SqlSession的查询操作,重点分析selectList方法及其内部调用的DefaultSqlSession、MappedStatement、Executor和缓存逻辑。在查询过程中,如果开启了二级缓存,CachingExecutor会先检查缓存,否则调用SimpleExecutor从数据库获取数据并存入一级缓存。通过对SimpleExecutor的doQuery方法的分析,揭示了Mybatis查询数据的完整流程。
摘要由CSDN通过智能技术生成

1.查询操作

SqlSession中定义的查询有以下这些:

  <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);

其中最关键的方法就是selectList,观察其方法实现,其实不管是selectOne还是selectMap,其方法都会调用selectList方法进行查询数据,如下:

  /**
   * 查询一个
   */
  @Override
  public <T> T selectOne(String statement, Object parameter) {
    //调用selectList方法查询数据
    List<T> list = this.selectList(statement, parameter);
    if (list.size() == 1) {	//若只有一个数据
      return list.get(0);	//则返回该数据
    } else if (list.size() > 1) {	//若大于一个数据则抛出异常
      throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
    } else {	//没有数据返回null
      return null;
    }
  }


  @Override
  public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
	//调用selectList进行查询
    final List<? extends V> list = selectList(statement, parameter, rowBounds);
    
    //后面是组装结果
    final DefaultMapResultHandler<K, V> mapResultHandler = new DefaultMapResultHandler<>(mapKey,
            configuration.getObjectFactory(), configuratio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值