BoundSql 在 Mybatis 中的作用是保存Sql。这里需要注意的是负责组装Sql不是 BoundSql,BoundSql 只负责保存。
源码
public class BoundSql {
// ${} 和 #{} 替换为占位符的sql,每个 #{} 替换完之后就是一个占位符 ?
private String sql;
// 保存 sql 中的 #{},包括其属性、名称等,和替换为占位符 ? 一一对应
private List<ParameterMapping> parameterMappings;
//保存用户传入的数据
private Object parameterObject;
private Map<String, Object> additionalParameters;
private MetaObject metaParameters;
...
}
以一个 Sql 语句为例,解释下 BoundSql 各自属性保存的内容。
SELECT * FROM fms_bank_card WHERE USER_ID = #{userId} AND CARD_TYPE = #{cardType} ORDER BY ID DESC;
Sql 查询结果对应的实体类为BankCard,传入的参数也是 BankCard {userId=1,cardType=1},那么BoundSql 各自属性保存内容如下:
- sql 属性保存的是
SELECT * FROM fms_bank_card WHERE USER_ID = ? AND CARD_TYPE = ? ORDER BY ID DESC;
- parameterMappings,保存的是 #{userId}、#{cardType}信息,以#{userId}为例,保存内容为:
ParameterMapping{property='userId', mode=IN, javaType=java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'
- parameterObject 保存的就是用户传入的 BankCard 实例