读mybatis源码之十一:参数处理器
来源:互联网 发布:opengl游戏编程 编辑:程序博客网 时间:2024/04/28 05:12
主要是给声明里面填充参数
一、创建参数处理器
在声明处理器基类中:
this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);对应configuration里面:
public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql); parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler); return parameterHandler; }
parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
表明在参数处理之前可以定义拦截处理二、调用参数处理器
跟踪进去发现createParameterHandler里面都是使用DefaultParameterHandler这个参数处理器。
在声明处理器中都有:
public void parameterize(Statement statement) throws SQLException { parameterHandler.setParameters((PreparedStatement) statement); }在执行器中有:
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Statement stmt; Connection connection = getConnection(statementLog); stmt = handler.prepare(connection); handler.parameterize(stmt); return stmt; }到这里也就知道了,执行器调用声明处理器parameterize方法,parameterize方法调用参数处理器parameterHandler填充参数
三、参数处理器如何填充参数
public void setParameters(PreparedStatement ps) throws SQLException { ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId()); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); if (parameterMappings != null) { MetaObject metaObject = parameterObject == null ? null : configuration.newMetaObject(parameterObject); for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) { Object value; String propertyName = parameterMapping.getProperty(); if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params value = boundSql.getAdditionalParameter(propertyName); } else if (parameterObject == null) { value = null; } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { value = parameterObject; } else { value = metaObject == null ? null : metaObject.getValue(propertyName); } TypeHandler typeHandler = parameterMapping.getTypeHandler(); JdbcType jdbcType = parameterMapping.getJdbcType(); if (value == null && jdbcType == null) jdbcType = configuration.getJdbcTypeForNull(); typeHandler.setParameter(ps, i + 1, value, jdbcType); } } } }
该部分是获取参数mapping,然后怎么获取字段的值,也就是说这里都是mybatis提供的解析,如何获取参数值,在拦截器中可以借鉴
TypeHandler 类型处理器含有org.apache.ibatis.type里面的基础类型处理器,还有自己注册的类型处理器
BaseTypeHandler类型处理器基类里面setParameter可以看到就是使用各个类型给声明填充参数。
0 0
- 读mybatis源码之十一:参数处理器
- 读mybatis源码之八:声明处理器StatementHandler
- 读mybatis源码之十二:结果集处理器
- 读mybatis源码之九:声明处理器之三大处理器
- Mybatis源码之Statement处理器StatementHandler(一)
- Mybatis源码之Statement处理器BaseStatementHandler(二)
- Mybatis源码之Statement处理器RoutingStatementHandler(三)
- Mybatis源码之Statement处理器SimpleStatementHandler(四)
- Mybatis源码之Statement处理器PreparedStatementHandler(五)
- Mybatis源码之Statement处理器CallableStatementHandler(六)
- MyBatis多参数传递之注解方式示例——MyBatis学习笔记之十一
- 读mybatis源码之十四:mybatis事务处理
- 深入剖析Spring Web源码(十一) - 处理器映射,处理器适配器以及处理器的实现 - 处理器映射的实现架构
- 深入剖析Spring Web源码(十一) - 处理器映射,处理器适配器以及处理器的实现 - 处理器映射的实现架构
- myBatis 传递参数源码分析
- MyBatis之传入参数
- MyBatis之传入参数
- mybatis 之参数传递
- TQ2440的学习——UBOOT移植(网络设备的支持)
- Swift语言教程(一)基础数据类型
- c++课程设计
- 课程设计
- 使用 FreeType
- 读mybatis源码之十一:参数处理器
- POJ 3273 Monthly Expense 二分搜索
- poj 3268 最短路
- 得到xml文档中的所有标签方法
- C++期末大作业
- Spring3.0官网文档学习笔记(八)--3.4.3~3.4.6
- Java学习总结15——Servlet详解
- 回归(regression)、梯度下降(gradient descent)
- shape文件导入Sql Server 2008R数据库出错