临文乍了了,彻卷兀若无。这篇文章主要讲述#yyds干货盘点# executor包(参数处理功能)相关的知识,希望能为你提供帮助。
executor包(参数处理功能)
sql语句中的参数赋值是有由executor包中的parameter子包完成的。parameter子包其实只有一个parameterHandler接口,它定义了2个方法:
public interface ParameterHandler
Object getParameterObject();
void setParameters(PreparedStatement ps)
throws SQLException;
ParameterHandler接口有一个默认的实现类DefaultParameterHandler,它在scripting包的子包中。mybatis中支持进行参数设置的语句类型是PreparedStatement接口及其子接口CallableStatement, 所以setParameters的输入参数是PreparedStatement类型。
setParameters方法的实现逻辑就是依次取出每个参数的值,然后根据参数类型调用PreparedStatement中的赋值方法进行赋值。
public class DefaultParameterHandler implements ParameterHandler
// 类型处理器注册表
private final TypeHandlerRegistry typeHandlerRegistry;
// MappedStatement对象(包含完整的增删改查节点信息)
private final MappedStatement mappedStatement;
// 参数对象
private final Object parameterObject;
// BoundSql对象(包含SQL语句、参数、实参信息)
private final BoundSql boundSql;
// 配置信息
private final Configuration configuration;
public DefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql)
this.mappedStatement = mappedStatement;
this.configuration = mappedStatement.getConfiguration();
this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
this.parameterObject = parameterObject;
this.boundSql = boundSql;
@Override
public Object getParameterObject()
return parameterObject;
/**
* 为语句设置参数
* @param ps 语句
*/
@Override
public void setParameters(PreparedStatement ps)
ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
// 取出参数列表
List< ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings != null)
for (int i = 0; i < parameterMappings.size(); i++)
ParameterMapping parameterMapping = parameterMappings.get(i);
// ParameterMode.OUT是CallableStatement的输出参数,已经单独注册。故忽略
if (parameterMapping.getMode() != ParameterMode.OUT)
Object value;
// 取出属性名称
String propertyName = parameterMapping.getProperty();
if (boundSql.hasAdditionalParameter(propertyName))
// 从附加参数中读取属性值
value = https://www.songbingjia.com/android/boundSql.getAdditionalParameter(propertyName);
else if (parameterObject == null)
value = https://www.songbingjia.com/android/null;
else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass()))
// 参数对象是基本类型,则参数对象即为参数值
value = https://www.songbingjia.com/android/parameterObject;
else
// 参数对象是复杂类型,取出参数对象的该属性值
MetaObject metaObject = configuration.newMetaObject(parameterObject);
value = https://www.songbingjia.com/android/metaObject.getValue(propertyName);
// 确定该参数的处理器
TypeHandler typeHandler = parameterMapping.getTypeHandler();
JdbcType jdbcType = parameterMapping.getJdbcType();
if (value =https://www.songbingjia.com/android/= null & & jdbcType == null)
jdbcType = configuration.getJdbcTypeForNull();
try
// 此方法最终根据参数类型,调用java.sql.PreparedStatement类中的参数赋值方法,对SQL语句中的参数赋值
typeHandler.setParameter(ps, i + 1, value, jdbcType);
catch (TypeException | SQLException e)
throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
【#yyds干货盘点# executor包(参数处理功能)】
推荐阅读
- VMware Workstation和vSphere简介
- 设计模式铺铺路(面向对象设计的原则一二)
- #指尖人生#第四篇 模块与包
- #yyds干货盘点# Java检查异常和非检查异常,运行时异常和非运行时异常的区别
- 小程序音乐项目开发实战
- 关于DNS
- #yyds干货盘点#抬头看天 | 谈谈移动端抓包方式和原理及如何防犯MITM
- 每天一个linux 命令----ls
- linux系统挂载windows2016共享目录