mybatis解析xml配置中${xxx}占位符的代码逻辑

MyBatis解析XML配置文件中${xxx}占位符主要是用于动态地将配置文件中的参数进行替换,从而达到动态配置Sql语句的目的。其解析流程的代码逻辑大致如下:

  1. 创建Configuration对象,该对象是对MyBatis的全局配置进行封装的一个JavaBean。在这个对象中会包含多个重要的属性,其中包括environment、dataSource、mapperRegistry等。
Configuration configuration = new Configuration();
  1. 首先,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;
}
  1. 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 {
      ...
    }
  }
}
  1. 当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}占位符的逻辑就是这样。下面是两个用例,它们具体使用了占位符的特性。

  1. 在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>
  1. 使用多个占位符拼接参数,从而生成更加动态的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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • XML简易教程之二

    下面是关于 “XML简易教程之二”的完整攻略: 1. 什么是XML Schema? XML Schema是一种用于文档结构描述和数据有效性验证的语言。它可以用来定义和约束一个文档的元素、属性、类型和关系等方面的特征,同时也可以描述所约束的文档必须满足的规则和限制条件,从而让这些文档具有更高的整体质量和可读性。 2. XML Schema的语法规则 我们知道,…

    html 2023年5月30日
    00
  • asp读取xml实例代码

    下面就是详细的“ASP读取XML实例代码”的攻略: 使用XML DOM(文档对象模型)读取XML文件 XML DOM是一种用于从XML文档中访问和处理节点的标准方式。在ASP中,通过使用XML DOM对象将XML文档加载到内存中,并读取或修改XML节点的值。 以下示例演示如何使用XML DOM在ASP中读取XML文件: Set xmlDoc = Server…

    html 2023年5月30日
    00
  • Ext JS 4官方文档之三 — 类体系概述与实践

    Ext JS 4 是一个功能强大的前端Web应用程序框架,官方文档提供了完整的API文档、类继承体系和组件开发指南。本文将重点讲解「Ext JS 4官方文档之三 — 类体系概述与实践」,该文档深入解析了 Ext JS 4 的类体系结构和类的创建方式,对于开发人员了解和掌握 Ext JS 4 开发流程非常有帮助。 一、类体系概述 1.类体系结构 在 Ext …

    html 2023年5月30日
    00
  • Javabean基于xstream包实现转XML文档的方法

    Javabean基于xstream包实现转XML文档的方法是常见的数据转换操作,以下是该操作的详细攻略。 准备工作 在开始操作前,我们需要进行一些准备工作。首先,准备一个Java类,该类的字段需要与XML文档的元素名及结构相对应。其次,我们需要引入xstream包,该包提供了Java对象到XML文档的转化功能。 在Maven项目中,可通过以下依赖方式引入xs…

    html 2023年5月30日
    00
  • python对XML文件的操作实现代码

    当我们需要处理XML(一种标记语言)时,Python提供了一组强大的库来操作它。以下是一些Python库,可以用于操作XML文件: xml.etree.ElementTree xml.dom.minidom xml.dom.pulldom xml.sax 其中,xml.etree.ElementTree和xml.dom.minidom是两个最常用的库来操作X…

    html 2023年5月30日
    00
  • JS提交并解析后台返回的XML的代码

    首先,我们需要了解 XML 的概念和基本结构。XML 是可扩展标记语言,是一种用于存储和传输数据的标准语言,具有自我描述性和跨平台性。 XML 的基本结构是由标签和元素组成的,它们可以嵌套形成层级结构。每个元素可以有任意多个属性和子元素。 接下来,我们介绍如何使用 JavaScript 提交并解析后台返回的 XML。要实现这个功能,我们需要使用 XMLHtt…

    html 2023年5月30日
    00
  • html中DTD使用小结

    我来为您详细讲解HTML中DTD使用小结。 什么是DTD DTD(Document Type Definition),文档类型定义,用于定义XML、HTML或SGML文档的结构。DTD通过规定文档的元素元素、属性、声明和约束条件的逻辑关系,使得在解析和呈现文档的时候,可以正确地显示文档的内容和结构。 HTML中DTD的作用 HTML的DTD规定了HTML的语…

    html 2023年5月30日
    00
  • PHP 使用header函数设置HTTP头的示例解析 表头

    PHP 中通过 header() 函数可以设置 HTTP 头,包括设置响应头和请求头。使用 header() 函数可以实现网页的跳转、缓存控制、设置 Cookie 等操作。 下面来看一下怎样使用 header() 函数设置 HTTP 头: 设置响应头 设置响应头主要是用于修改服务器的响应信息,比如设置网页的编码格式、防止页面被嵌入框架等。 示例一 以下示例展…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部