java executor包参数处理功能

网友投稿 352 2022-08-28


java 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 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 propertytcwKJZGZRIName = parameterMapping.getProperty();

if (boundSql.hasAdditionalParameter(propertyName)) {

// 从附加参数中读取属性值

value = boundSql.getAdditionalParameter(propertyName);

} else if (parameterObject == null) {

value = null;

} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {

// 参数对象是基本类型,则参数对象即为参数值

value = parameterObject;

} else {

// 参数对象是复杂类型,取出参数对象的该属性值

MetaObject metaObject = configuration.newMetaObject(parameterObject);

value = metaObject.getValue(propertyName);

}

// 确定该参数的处理器

TypeHandler typeHandler = parameterMapping.getTypeHandler();

JdbcType jdbcType = parameterMapping.getJdhttp://bcType();

if (value == 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);

}

}

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Flask中视图函数的路由(flask路由配置)
下一篇:Flask的配置参数设置(flask框架安装与配置)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~