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

yizhihongxing

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日

相关文章

  • C#利用Openxml读取Excel数据实例

    C#利用OpenXML读取Excel数据实例 1. 什么是 OpenXML? OpenXML是一个开放式、XML-based格式,用于表述和传输数据、文档和电子表格。该格式由Microsoft于2007年推出,其主要作用是为了实现对微软Office系列软件的扩展。OpenXML可以通过Microsoft Office 2007或更高版本创建和编辑,如Word…

    html 2023年5月30日
    00
  • php操作xml入门之xml基本介绍及xml标签元素

    我来为你详细讲解 “php操作xml入门之xml基本介绍及xml标签元素”的完整攻略。 1. XML 的基本介绍 XML(eXtensible Markup Language)是可扩展标记语言,是一种用于独立于应用程序或厂商的平台中存储和传输数据的标准格式。XML 可以被用于表示简单到复杂的数据结构、网络中传递数据、生成文本与图形、存储数据等。 2. XML…

    html 2023年5月30日
    00
  • Python中的hypot()方法使用简介

    Python中的hypot()方法使用简介 简介 hypot() 方法返回欧几里得范数 sqrt(xx + yy)。 即,求解对应点(x,y)的极坐标 r。 语法 hypot()方法的语法如下: math.hypot(x, y) 参数 以下是 hypot()方法的参数: x — 数值表达式 y — 数值表达式 返回值 hypot()方法返回两个参数平方和…

    html 2023年5月30日
    00
  • php解析xml方法实例详解

    PHP解析XML方法实例详解 什么是XML? XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的语言。它可以用于表示结构化的数据,可以在网络上进行广泛的应用。XML被广泛应用于Web服务、RSS等领域。在PHP中,使用XML可以将数据以结构化的形式存储,并进行解析和操作。 PHP解析XML的方法 PHP提…

    html 2023年5月30日
    00
  • mybatis中xml之trim属性说明

    MyBatis 是一款优秀的 ORM 框架,支持将 SQL 语句映射到 XML 文件中,而 XML 文件中的 SQL 语句又包含了很多属性进行配置。其中之一就是 <trim> 标签。 <trim> 标签 <trim> 标签用于在 SQL 语句中动态添加或删除一些字符串。它可以设置以下属性: prefix:在 <tri…

    html 2023年5月30日
    00
  • 通过php添加xml文档内容的方法

    添加XML文档内容的方法有很多种,其一是使用PHP DOM扩展,其二是使用SimpleXML,我们将分别介绍这两种方式。 使用PHP DOM扩展动态添加元素 步骤一:加载XML文档数据 要使用PHP DOM扩展添加XML文档内容,首先需要加载XML文档数据,这可以通过调用DOMDocument类的load()方法完成。具体代码如下: $xmlDoc = ne…

    html 2023年5月30日
    00
  • python生成xml时规定dtd实例方法

    什么是DTD? DTD全称Document Type Definition,即文档类型定义,用于定义XML中允许使用哪些元素,哪些属性,支持哪些实体等。DTD通常被定义为外部实体或者内部实体,可以用来验证XML文档是否符合预期的规则。 如何在Python中使用DTD? 使用Python生成XML时,可以通过指定DTD来规定XML实例。 首先,需要导入lxml…

    html 2023年5月30日
    00
  • Win10怎么将中文登录用户文件夹名改为英文名?

    在Windows 10系统中,可以将中文登录用户文件夹名改为英文名。以下是将中文登录用户文件夹名改为英文名的详细攻略: 步骤1:创建新的管理员账户 单击Windows 10系统的“开始”按钮。 选择“设置”。 选择“帐户”。 选择“家庭和其他人”。 选择“添加其他人”。 选择“我没有此人的登录信息”。 选择“添加用户没有Microsoft帐户”。 输入新的管…

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