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日

相关文章

  • 这一次搞懂Spring的XML解析原理说明

    关于“这一次搞懂Spring的XML解析原理说明”的完整攻略,以下是我为您精心准备的: 什么是Spring的XML解析原理? Spring的ApplicationContext是通过解析XML文件来实例化Bean对象的。Spring在启动时会先加载XML文件,然后将XML文件解析成一个个的BeanDefinition(Bean定义),最后将这些BeanDef…

    html 2023年5月30日
    00
  • java读取xml配置参数代码实例

    以下是针对Java读取XML配置参数的完整攻略。该攻略将介绍如何使用Java代码实现读取XML配置参数并展示两个示例。 1. 导入相关的库 使用Java来读取XML配置参数需要导入相关的库,其中最主要的是 javax.xml.parsers,该库提供了用于解析XML文件的类。 import java.io.File; import javax.xml.par…

    html 2023年5月30日
    00
  • 腾讯地图怎么退出登录账号? 腾讯地图app退出账号的技巧

    以下是“腾讯地图怎么退出登录账号? 腾讯地图app退出账号的技巧”的完整攻略: 腾讯地图怎么退出登录账号? 在腾讯地图中,可以按照以下步骤退出登录账号: 打开腾讯地图:在手机上打开腾讯地图应用。 进入个人中心:在腾讯地图中,点击右下角“我的”按钮,进入个人中心页面。 进入设置页面:在个人中心页面中,点击“设置”按钮,进入设置页面。 退出登录账号:在设置页面中…

    html 2023年5月18日
    00
  • excel表格中数字全部变成#字符乱码怎么办?

    下面是详细的攻略: 问题现象 在使用excel表格时,如果出现数字全部变成#字符乱码的情况,通常是数据过大或数据格式问题导致的。 解决步骤 步骤一:检查单元格宽度是否太小 如果单元格的宽度过小,会导致数字显示不全,从而变成#字符乱码。解决方法是调整单元格的宽度,使其能够完整显示数字。 示例一: 打开excel表格,选中出现#字符乱码的单元格。 拖动单元格右侧…

    html 2023年5月31日
    00
  • labra是什么币?LADYS币一文读懂

    以下是“labra是什么币?LADYS币一文读懂”的完整攻略: labra是什么币? labra是一种加密货币,它是基于以太坊区块链的ERC-20代币。labra的官方网站是https://labra.finance/,它的目标是成为一个去中心化的金融平台,提供各种金融服务,如借贷、交易和投资。 labra的特点 labra有以下几个特点: 去中心化:lab…

    html 2023年5月18日
    00
  • CSS字符编码引起乱码的快速解决方法

    CSS字符编码引起乱码的快速解决方法主要有两种,分别是使用iconfont字体图标和手动设置CSS文件编码。下面将具体展开说明。 1. 使用iconfont字体图标 Iconfont字体图标是一种通过CSS技术将图标转换成字体的方式,常用于解决字符编码引起的乱码问题。具体步骤如下: 步骤一:下载Iconfont字体库 先在阿里巴巴矢量图标库中搜索想要使用的图…

    html 2023年5月31日
    00
  • Android中对xml文件解析的3种方式总结

    下面我将详细讲解”Android中对XML文件解析的3种方式总结”的完整攻略。 简介 XML(Extensible Markup Language),可扩展标记语言,是一种用于存储和传输数据的标记语言。在Android中,我们经常需要从网络或本地获取XML数据并进行解析,这就需要使用到XML解析技术。本文将介绍Android中对XML文件解析的3种方式。 1…

    html 2023年5月30日
    00
  • Word文档打开后出现乱码怎么解决?

    Word文档打开后出现乱码怎么解决? 在打开Word文档时出现乱码是一个常见的问题。下面我们可以按照以下步骤解决。 步骤一:修改编码方式 很多时候,由于编码方式不同,才导致Word文档打开后出现乱码。这时可以尝试修改编码方式。 首先打开出现乱码的Word文档,选择“文件”菜单-“选项”-“高级”。 找到“将文档中的字体替换为”选项,勾选“仅在打印时添加替换字…

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