Mybatis源码之Statement处理器CallableStatementHandler(六)
2016-09-24 22:34
351 查看
CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程。
源码如下:
源码如下:
/** * @author Clinton Begin */ /***/ public class CallableStatementHandler extends BaseStatementHandler { public CallableStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { super(executor, mappedStatement, parameter, rowBounds, resultHandler, boundSql); } public int update(Statement statement) throws SQLException { //用来调用存储过程,它提供了对输出和输入/输出参数的支持 CallableStatement cs = (CallableStatement) statement; cs.execute(); int rows = cs.getUpdateCount(); Object parameterObject = boundSql.getParameterObject(); KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); keyGenerator.processAfter(executor, mappedStatement, cs, parameterObject); resultSetHandler.handleOutputParameters(cs); return rows; } public void batch(Statement statement) throws SQLException { CallableStatement cs = (CallableStatement) statement; cs.addBatch(); } public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException { CallableStatement cs = (CallableStatement) statement; cs.execute(); List<E> resultList = resultSetHandler.<E>handleResultSets(cs); resultSetHandler.handleOutputParameters(cs); return resultList; } protected Statement instantiateStatement(Connection connection) throws SQLException { String sql = boundSql.getSql(); if (mappedStatement.getResultSetType() != null) { return connection.prepareCall(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY); } else { return connection.prepareCall(sql); } } public void parameterize(Statement statement) throws SQLException { //注册out参数 registerOutputParameters((CallableStatement) statement); parameterHandler.setParameters((CallableStatement) statement); } private void registerOutputParameters(CallableStatement cs) throws SQLException { List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); for (int i = 0, n = parameterMappings.size(); i < n; i++) { ParameterMapping parameterMapping = parameterMappings.get(i); //处理存储过程的INOUT和OUT if (parameterMapping.getMode() == ParameterMode.OUT || parameterMapping.getMode() == ParameterMode.INOUT) { if (null == parameterMapping.getJdbcType()) { throw new ExecutorException("The JDBC Type must be specified for output parameter. Parameter: " + parameterMapping.getProperty()); } else { if (parameterMapping.getNumericScale() != null && (parameterMapping.getJdbcType() == JdbcType.NUMERIC || parameterMapping.getJdbcType() == JdbcType.DECIMAL)) { cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE, parameterMapping.getNumericScale()); } else { if (parameterMapping.getJdbcTypeName() == null) { cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE); } else { cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE, parameterMapping.getJdbcTypeName()); } } } } } } }
相关文章推荐
- Mybatis源码之Statement处理器CallableStatementHandler(六)
- Mybatis源码之Statement处理器CallableStatementHandler(六)
- Mybatis源码之Statement处理器BaseStatementHandler(二)
- Mybatis源码之Statement处理器RoutingStatementHandler(三)
- Mybatis源码之Statement处理器SimpleStatementHandler(四)
- Mybatis源码之Statement处理器SimpleStatementHandler(四)
- Mybatis源码之Statement处理器SimpleStatementHandler(四)
- Mybatis源码之Statement处理器PreparedStatementHandler(五)
- Mybatis源码之Statement处理器PreparedStatementHandler(五)
- Mybatis源码之Statement处理器StatementHandler(一)
- Mybatis源码之Statement处理器PreparedStatementHandler(五)
- Mybatis源码之Statement处理器StatementHandler(一)
- Mybatis源码之Statement处理器StatementHandler(一)
- Mybatis源码之Statement处理器RoutingStatementHandler(三)
- Mybatis源码之Statement处理器BaseStatementHandler(二)
- Mybatis源码之Statement处理器RoutingStatementHandler(三)
- Mybatis源码之Statement处理器BaseStatementHandler(二)
- MyBatis官方教程及源码解析——类型别名、类型处理器的解析
- MyBatis源码分析(二)语句处理器
- MyBatis 源码分析——生成Statement接口实例