SqlSession对象之StatementHandler


上一篇讲了SqlSession对象中的Executor,接下来将对SqlSession的另一个对象StatementHandler进行讲解。

一、StatementHandler介绍

StatementHandler是Mybatis中最重要的一个对象,它负责操作Statement与数据库进行交流,在此过程中还会调用ParameterHandler进行参数配置,使用ResultHandler将查询结果与实体类对象进行绑定。因而ParameterHandler与ResultHandler的创建是与StatementHandler相关联的。

StatementHandler是一个顶级接口,它的类图如下所示:

StatementHandler接口下有两个直接实现类BaseStatementHandler和RoutingStatementHandler

1、RoutingStatementHandler类

RoutingStatementHandler:是一个具体实现类,在这个类中并没有对Statement对象进行具体使用,只是根据得到Executor类型决定创建何种类型StatementHandler对象。在MyBatis工作时,使用的StatementHandler接口对象实际上就是RoutingStatementHandler对象。

可以简单理解为:

StatementHandler statmentHandler = new RountingStatementHandler();

2、BaseStatementHandler抽象类

BaseStatementHandler:是StatementHandler接口的另一个实现类,本身是一个抽象类,用于简化StatementHandler接口实现的难度,属于适配器设计模式体现。它有三个实现类:SimpleStatementHandler,PreparedStatementHandler和CallableStatementHandler。

在RountingStatementHandler创建时,就根据接收的传递的SQL语句来创建这个三个类型的对象。

SimpleStatementHandler:管理Statement对象向数据库中推送不需要预编译的SQL语句。

PreparedStatementHandler:管理PreparedStatementHandler对象向数据库推送预编译的SQL语句。

CallableStatementHandler:管理CallableStatement对象调用数据库中构造函数,即有存储过程的SQL语句。

二、StatementHandler接口方法介绍

StatementHandler是一个接口,其代码如下:

public interface StatementHandler {
   

  Statement prepare(Connection connection, Integer transactionTimeout)throws SQLException;

  void parameterize(Statement statement)throws SQLException;

  void batch(Statement statement)throws SQLException;

  int update(Statement statement)throws SQLException;

  <E> List<E> query(Statement statement, ResultHandler resultHandler)throws SQLException;

  <E> Cursor<E> queryCursor(Statement statement)throws SQLException;

  BoundSql getBoundSql();

  ParameterHandler getParameterHandler();

}

我们主要关注StatementHandler中的四个重要方法:prepare()、parameterize()、update()、query()

1、prepare方法

prepare方法主要是在BaseStatementHandler类中实现的,其代码如下:

  public Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException {
   
    ErrorContext.instance().sql(boundSql.getSql());
    Statement statement = null;
    try {
   
      statement = instantiateStatement(connection);
      setStatementTimeout(statement, transactionTimeout);
      setFetchSize(statement);
      return statement;
    } catch (SQLException e) {
   
      closeStatement(statement);
      throw e;
    } catch (Exception e) {
   
      closeStatement(statement);
      throw new ExecutorException("Error preparing statement.  Cause: " + e, e);
    }
  }

prepare方法用于创建一个(Statement or PreparedStatement or CallableStatement)对象,并设置Statement对象的最大工作时间和一次性读取的最大数据量,然后将生成的Statement对象返回。

prepare方法只在BaseStatementHandler被实现,在其三个子类中没有被重写。它主要用于三个子类调用获得对应的Statement接口对象,依靠instantiateStatement(connection)方法来返回具体Statement接口对象。instantiateStatement方法是BaseStatementHandler中定义的抽象方法,由三个子类来具体实现,这里采用了模板方法模式。

SimpleStatementHandler的instantiateStatement方法

protected Statement instantiateStatement(Connection connection) throws SQLException {
   
    if (mappedStatement.getResultSetType() != null) {
   
      return connection.createStatement(mappedStatement
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值