不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

R2R 映射 XML 语法速查表

  R2R(Row-to-Row)映射 XML 是数据同步场景中常用的配置文件,核心作用是定义 “源表字段→目标表字段” 的转换规则,无需修改代码即可灵活调整数据流向。本文以门诊订单表(pt_outhosp_order)到门诊医嘱明细记录表(yh_mz_yzmxjl)的映射配置为例,拆解其基础语法和核心用法。
  R2R 映射文件遵循标准 XML 格式,核心层级为 “根节点→表映射→字段映射集合→字段映射”。

一、核心节点层级(必记)

节点名称层级关系核心作用
<table-mappings> 根节点 统一管理所有表映射配置
<table-mapping> 根节点子级 关联单个源表,定义表级映射
<mappings> 表映射子级 存放具体字段映射规则集合
<mapping> 映射集合子级 绑定目标表和映射策略(如全量 / 增量)
<column> 映射规则子级 单个字段的转换逻辑(核心配置)

二、关键属性说明(常用必背)

1. 根节点 <table-mappings> 属性

属性名称作用示例值
xmlns:xsi 指定 XML Schema 实例命名空间 http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation 关联 XSD 约束文件(验证 XML 合法性) ../r2RMapping.xsd(相对路径)

2. 表映射 <table-mapping> 属性

属性名称作用示例值
src 指定数据来源表名称 pt_outhosp_order(门诊订单表)

3. 映射规则 <mapping> 属性

属性名称作用可选值 / 示例值
targ 指定数据目标表名称 yh_mz_yzmxjl(门诊医嘱明细记录表)
type 映射类型(同步策略) all(全量)、delta(增量)

4. 字段映射 <column> 属性(核心)

属性名称作用可选值 / 示例值
src 源字段来源:源表字段名或无依赖标识 status(源表字段)、N/A(无依赖)
targ 目标表字段名(数据写入字段) status_targxtsjgxsj
value 字段转换规则(固定值 / 表达式 / 函数) '住院'REPLACE(...)$(sysdate)
pk 标记是否为目标表主键(匹配记录用) true(是)、默认不写(否)

三、高频表达式模板(直接复用)

1. 空值替换(特定字符转 NULL)

<column src="字段名" targ="目标字段名" value="REPLACE($(src.字段名), '-', NULL)"/>
  • 用途:将源表中 '-' 等无效字符转为 NULL,避免脏数据。

2. 固定值填充

<!-- 字符串常量(需单引号包裹) -->
<column src="N/A" targ="目标字段名" value="'固定值'"/>
<!-- 系统时间(适配 Oracle 等数据库) -->
<column src="N/A" targ="目标字段名" value="'$(sysdate)'"/>

3. 字符串拼接

<column src="N/A" targ="目标字段名" value="body['参数1']+'_'+body['参数2']"/>
  • 用途:拼接接口参数或源表字段,生成唯一标识(如报告流水号)。

4. 条件判断(三元运算符)

<column src="N/A" targ="目标字段名" value="条件1? 结果1: 条件2? 结果2: 默认值"/>
  • 示例:'1'.equals(body['age_unit'])? body['age']:'岁'.equals(body['age_unit'])? body['age']:null

5. 主键映射(匹配更新 / 删除记录)

<column src="源表主键字段" targ="目标表主键字段" pk="true"/>
  • 用途:同步时通过主键定位目标表记录,确保更新 / 删除精准。

6. 多字符替换(清洗脏数据)

<column src="字段名" targ="目标字段名" value="REPLACE(REPLACE($(src.字段名), ' ', ''), ' ', '')"/>
  • 用途:批量去除字段中的空格(包括普通空格和全角空格),或替换多个无效字符(如 '#' '*' 等)。

7. 字符串截取(提取部分内容)

<column src="字段名" targ="目标字段名" value="SUBSTR($(src.字段名), 1, 10)"/>
  • 用途:截取字符串前 N 位(示例中截取前 10 位),适用于字段长度限制场景(如身份证号、手机号脱敏显示)。

8. 日期格式转换

<!-- 字符串转日期(源格式:yyyy-MM-dd) -->
<column src="日期字符串字段" targ="日期字段" value="TO_DATE($(src.日期字符串字段), 'yyyy-MM-dd')"/>

<!-- 日期转字符串(目标格式:yyyy年MM月dd日) -->
<column src="日期字段" targ="日期字符串字段" value="TO_CHAR($(src.日期字段), 'yyyy"年"MM"月"dd"日"')"/>
  • 用途:统一日期格式,适配不同系统间的日期字段类型要求。

9. 数值计算(求和 / 平均值等)

<column src="字段1" targ="结果字段" value="$(src.字段1) + $(src.字段2)"/>
  • 用途:基于源表多个字段进行数值计算(如求和、求差、乘法等),适用于统计场景。

10. 条件范围判断

<column src="字段名" targ="目标字段名" value="CASE WHEN $(src.字段名) BETWEEN 0 AND 100 THEN '有效' ELSE '无效' END"/>
  • 用途:根据字段值范围返回对应结果(如分数、金额等的合法性判断)。

11. 布尔值转换(Y/N ↔ TRUE/FALSE)

<column src="字段名" targ="目标字段名" value="CASE WHEN $(src.字段名) = 'Y' THEN TRUE ELSE FALSE END"/>
  • 用途:将业务中常用的 Y/N 标识转换为布尔类型,适配目标表字段类型。

12. 去重取值(取唯一值)

<column src="字段名" targ="目标字段名" value="DISTINCT $(src.字段名)"/>
用途:获取源字段的唯一值,避免重复数据写入目标表(需配合工具支持)。

13. 空值兜底(默认值填充)

<column src="字段名" targ="目标字段名" value="NVL($(src.字段名), '默认值')"/>
  • 用途:当源字段为 NULL 时,自动填充预设默认值(如 '未知' 0 等),保证数据完整性。

14. 正则表达式匹配(复杂校验)

<column src="字段名" targ="目标字段名" value="CASE WHEN REGEXP_LIKE($(src.字段名), '^[0-9]+$') THEN '数字' EL

四、使用注意事项及实例

  1. 节点嵌套:<column> 必须是 <mapping> 的直接子节点,不可嵌套在其他 <column> 内。
  2. 字符串格式:常量字符串需用单引号包裹(如 '住院'),避免语法错误。
  3. 占位符:$(src.字段名) 用于取源表字段值,body['key'] 用于取外部参数(如接口请求体),需结合工具支持调整。
  4. 兼容性:函数(如 REPLACE)和系统变量(如 sysdate)需适配目标数据库,不同数据库语法可能略有差异。

使用实例:

<?xml version="1.0" encoding="UTF-8"?>
<table-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../r2RMapping.xsd">
    <table-mapping src="pt_outhosp_order">
        <mappings>
            <mapping targ="yh_mz_yzmxjl" type="all">
                <!-- 1. 状态字段映射:将源表 status 字段值中的 '-' 替换为 NULL 后,存入目标表 status_targ 字段 -->
                <column src="status" targ="status_targ" value="REPLACE($(src.status), '-', NULL)">
                <!-- 2. 系统更新时间:将目标表 xtsjgxsj 字段设置为当前系统日期时间 -->
                <column src="N/A" targ="xtsjgxsj" value="'$(sysdate)'"/>
                <!-- 3. 操作类型标识:将 dsql_optype 字段设置为 'update',标识操作类型为更新 -->
                <column src="N/A" targ="dsql_optype" value="'update'"/>
                <!-- 4. 主键字段映射:将源表 system_source 字段作为主键,映射到目标表 hisbb 字段 -->
                <column src="system_source" targ="hisbb" pk="true"/>
                <!-- 5. 操作类型标识:将 dsql_optype 字段设置为 'delete',标识操作类型为删除 -->
                <column src="N/A" targ="dsql_optype" value="'delete'"/>
                <!-- 6. 操作类型标识:将 dsql_optype 字段设置为 'batch_delete',标识操作类型为批量删除 -->
                <column src="N/A" targ="dsql_optype" value="'batch_delete'"/>
                <!-- 7. 报告流水号构造:通过拼接 request_no 和 report_serial_no 构造目标表 bglsh 字段的值 -->
                <column src="N/A" targ="bglsh" value="body['request_no']+'_'+body['report_serial_no']"/>
                <!-- 8. 年龄字段处理:根据 age_unit 的值判断,若为 '1' 或 '岁',则取 age 的值,否则为 null,存入 nls 字段 -->
                <column src="N/A" targ="nls" value="'1'.equals(body['age_unit'])? body['age']:'岁'.equals(body['age_unit'])? body['age']:null"/>
                <!-- 9. 就诊性质字段:将目标表 jzxzmc 字段固定设置为 '住院' -->
                <column src="N/A" targ="jzxzmc" value="'住院'"/>
            </mapping>
        </mappings>
    </table-mapping>
</table-mappings>