MyBatis解析XML配置文件中${xxx}
占位符主要是用于动态地将配置文件中的参数进行替换,从而达到动态配置Sql语句的目的。其解析流程的代码逻辑大致如下:
- 创建Configuration对象,该对象是对MyBatis的全局配置进行封装的一个JavaBean。在这个对象中会包含多个重要的属性,其中包括environment、dataSource、mapperRegistry等。
Configuration configuration = new Configuration();
- 首先,MyBatis会读取XML配置文件,然后根据节点名称,将不同的信息封装进Configuration对象中。在处理节点值的过程中,如果遇到
${xxx}
的占位符,会调用解析占位符的方法。
public void parse(Configuration configuration, Document document) {
...
// 解析MyBatis配置文件中的所有命名空间
configurationElement(parser.evalNode("/configuration"));
return configuration;
}
private void configurationElement(XNode context) {
...
// 解析properties节点,从而实现配置信息的动态替换
propertiesElement(context.evalNode("properties"));
// 解析mapper节点,从而加载Mapper接口
mapperElement(context.evalNode("mappers"));
return configuration;
}
- MyBatis会调用properties子节点解析方法,将properties节点中的所有子元素逐一解析,并将解析后的信息存入到一个HashMap中。
private void propertiesElement(XNode context) {
if (context != null) {
// 获取所有的property元素
Properties defaults = context.getChildrenAsProperties();
String resource = context.getStringAttribute("resource");
String url = context.getStringAttribute("url");
// 加载properties文件中的所有属性,并存到全局变量中
if (resource != null && url == null) {
...
} else if (resource == null && url != null) {
...
} else {
...
}
}
}
- 当Mybatis在解析XML时遇到有${xxx}的占位符,会调用下面的方法进行解析,并整合成一个完整的字符串。
private PropertyParser() {
}
public static String parse(String string, Properties variables) {
VariableTokenHandler handler = new VariableTokenHandler(variables);
GenericTokenParser parser = new GenericTokenParser("${", "}", handler);
return parser.parse(string);
}
private static class VariableTokenHandler implements TokenHandler {
private final Properties variables;
public VariableTokenHandler(Properties variables) {
this.variables = variables;
}
@Override
public String handleToken(String content) {
// 将占位符中指定的变量替换为对应的值
if (variables != null && variables.containsKey(content)) {
return variables.getProperty(content);
}
return "${" + content + "}";
}
}
整个解析XML配置文件中${xxx}占位符的逻辑就是这样。下面是两个用例,它们具体使用了占位符的特性。
- 在XML文件中定义变量,然后在sql语句中使用。
<properties resource="db.properties">
<property name="db.type" value="mysql"/>
</properties>
<select id="selectUser" resultType="com.wkt.entity.User">
select * from ${db.type}_user where id = #{id}
</select>
- 使用多个占位符拼接参数,从而生成更加动态的Sql语句。
<insert id="insertBatch">
INSERT INTO t_user (
<trim suffixOverrides=",">
<foreach collection="fields" item="field">
${field.name},
</foreach>
</trim>
) VALUES
<foreach collection="users" item="user" separator=",">
(
<trim suffixOverrides=",">
<foreach collection="fields" item="field">
#{user.${field.name}},
</foreach>
</trim>
)
</foreach>
</insert>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis解析xml配置中${xxx}占位符的代码逻辑 - Python技术站