zoukankan      html  css  js  c++  java
  • MyBatis核心对象之StatementHandler

    MyBatis核心对象之StatementHandler

    StatementHandler ResultHandler ParameterHandler Executor

    org.apache.ibatis.executor.statement.StatementHandler
    org.apache.ibatis.session.ResultHandler
    org.apache.ibatis.executor.parameter.ParameterHandler
    org.apache.ibatis.executor.Executor
    

    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
        BoundSql getBoundSql();
    	//获取参数处理器
        ParameterHandler getParameterHandler();
    }
    
    public class RoutingStatementHandler implements StatementHandler {
    
        private final StatementHandler delegate;
    
        //核心,根据ms的语句类型来创建相应的StatementHandler
        public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    
            switch (ms.getStatementType()) {
                case STATEMENT:
                    delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
                    break;
                case PREPARED:
                    delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
                    break;
                case CALLABLE:
                    delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
                    break;
                default:
                    throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
            }
    
        }
    
        @Override
        public Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException {
            return delegate.prepare(connection, transactionTimeout);
        }
    
        @Override
        public void parameterize(Statement statement) throws SQLException {
            delegate.parameterize(statement);
        }
    
        @Override
        public void batch(Statement statement) throws SQLException {
            delegate.batch(statement);
        }
    
        @Override
        public int update(Statement statement) throws SQLException {
            return delegate.update(statement);
        }
    
        @Override
        public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
            return delegate.query(statement, resultHandler);
        }
    
        @Override
        public <E> Cursor<E> queryCursor(Statement statement) throws SQLException {
            return delegate.queryCursor(statement);
        }
    
        @Override
        public BoundSql getBoundSql() {
            return delegate.getBoundSql();
        }
    
        @Override
        public ParameterHandler getParameterHandler() {
            return delegate.getParameterHandler();
        }
    }
    
    @startuml
    interface StatementHandler
    class RoutingStatementHandler
    
    StatementHandler <|.. RoutingStatementHandler
    
    abstract class BaseStatementHandler
    class PreparedStatementHandler
    class CallableStatementHandler
    class SimpleStatementHandler
    
    StatementHandler <|.. BaseStatementHandler
    BaseStatementHandler <|-- PreparedStatementHandler
    BaseStatementHandler <|-- CallableStatementHandler
    BaseStatementHandler <|-- SimpleStatementHandler
    @enduml
    
  • 相关阅读:
    css 两边是线,中间文字的多种实现方法
    vue provide/inject 父组件如何给孙子组件传值
    Mac版本的 Axure rp8 不显示菜单栏
    mac 如何卸载node和npm采坑之旅
    css3 鼠标悬停图片动画
    css3 一个六边形 和 放大旋转动画DEMO演示
    js drag drop 收藏夹拖拽移除的简单例子
    css 折角效果/切角效果
    css 给图片添加滤镜效果,透明层毛玻璃效果
    c# udp通讯实现
  • 原文地址:https://www.cnblogs.com/mozq/p/12079703.html
Copyright © 2011-2022 走看看