在Mybatis中,BoundSql是用于存储SQL语句和参数的类,它在SQL语句执行之前,会将SQL语句中的参数绑定到实际的参数值上,以确保SQL语句的执行正确性。本文将深入探讨BoundSql的SQL绑定过程。
BoundSql的概述
BoundSql是一个简单的类,用于存储SQL语句和参数。其主要属性包括:
sql:保存要执行的SQL语句
parameterMappings:保存SQL语句中的参数映射关系
parameterObject:保存参数对象
additionalParameters:额外的参数
SQL绑定过程
SQL绑定主要包括将SQL语句中的参数替换成实际的参数值的过程。在Mybatis中,SQL绑定过程由org.apache.ibatis.scripting.defaults.DefaultParameterHandler类完成。其主要方法为setParameter,源码如下:
@Override
public void setParameters(PreparedStatement ps) {
ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
List
if (parameterMappings != null) {
Configuration configuration = mappedStatement.getConfiguration();
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
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)) {
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();
if (typeHandler == null) {
throw new ExecutorException("There was no TypeHandler found for parameter " + propertyName + " of statement " + mappedStatement.getId());
}
typeHandler.setParameter(ps, i + 1, value, parameterMapping.getJdbcType());
}
}
}
}
在setParameters方法中,首先获取参数映射关系parameterMappings,然后遍历参数映射关系,将参数值设置到PreparedStatement对象中。在设置参数值时,会根据参数的属性名和参数值类型来选择合适的TypeHandler对参数进行设置。
结语
通过本文的分析,我们了解了BoundSql的SQL绑定过程。在Mybatis中,BoundSql扮演着重要的角色,通过它可以将SQL语句和参数进行绑定,以确保SQL语句的执行正确性。希望本文对你理解Mybatis的源码有所帮助。
本文来自极简博客,作者:奇迹创造者,转载请注明原文链接:Mybatis源码解析之BoundSql的SQL绑定过程
