Mybatis源码笔记一

mybatis访问数据库的步骤如下:

1、创建SqlSessionFactory
2、再使用SqlSessionFactory的openSession()获得SqlSession

3、通过SqlSession执行相关sql操作

4、关闭连接

SqlSessionFactory是通过SqlSessionFactoryBuilder的build方法创建的,build方法有很多重载的方法。

看源码知道最终都会调用如下方法,返回的是DefaultSqlSessionFactory

public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }
public <T> T selectOne(String statement) {
    return selectOne(statement, null);
  }

  public <T> T selectOne(String statement, Object parameter)
  {
    List list = selectList(statement, parameter);
    if (list.size() == 1)
      return list.get(0);
    if (list.size() > 1) {
      throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
    }
    return null;
  }


openSession()后最终执行如下方法,通过Configuration来创建Executor执行器,Executor执行器也是最终与数据库直接交互的接口。返回的是一个DefaultSqlSession
 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      Environment environment = this.configuration.getEnvironment();
      TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      Executor executor = this.configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(this.configuration, executor);
    } catch (Exception e) {
      closeTransaction(tx);
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }
接下来通过SqlSession的相关方法,执行sql返回结果,可以看到selectOne最终自行的还是selectList方法。

public <T> T selectOne(String statement) {
    return selectOne(statement, null);
  }

  public <T> T selectOne(String statement, Object parameter)
  {
    List list = selectList(statement, parameter);
    if (list.size() == 1)
      return list.get(0);
    if (list.size() > 1) {
      throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
    }
    return null;
  }
selectList方法通过Configuration的处理从xml配置文件中获取相关的sql语句,然后让Exector这个执行器来执行相关的sql语句返回结果。

同样insert和delete最终调用的还是update,同样通过Configuration的处理从xml配置文件中获取相关的sql语句,然后让Exector这个执行器来执行相关的sql语句返回结果。

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
    try {
      MappedStatement ms = this.configuration.getMappedStatement(statement);
      List result = this.executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
      return result;
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }
public int insert(String statement) {
    return insert(statement, null);
  }

  public int insert(String statement, Object parameter) {
    return update(statement, parameter);
  }

  public int update(String statement) {
    return update(statement, null);
  }

  public int update(String statement, Object parameter) {
    try {
      this.dirty = true;
      MappedStatement ms = this.configuration.getMappedStatement(statement);
      return this.executor.update(ms, wrapCollection(parameter));
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

执行器Executor中使用Configuration创建对应的StatementHandler来创建Statement来执行相关sql语句




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值