MyBatis XML中SQL特殊符号(大于、小于等)的正确写法

4 次阅读

MyBatis 是目前 Java 企业级开发中非常常用的持久层框架,它通过 XML 文件编写 SQL,使开发者能够灵活控制数据库操作。不过,在 MyBatis XML 映射文件中直接书写 SQL 时,经常会遇到特殊符号解析问题,尤其是大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等比较运算符。

由于 MyBatis XML 本质上属于 XML 文件格式,而 XML 对部分字符具有特殊含义,如果直接使用这些符号,可能导致 XML 解析失败。因此,掌握 MyBatis XML 中 SQL 特殊符号的正确写法,是保证 SQL 正常执行的重要技能。

一、MyBatis XML中为什么不能直接使用特殊符号

MyBatis 的 Mapper 文件通常采用 XML 格式,例如:

XML
 id="queryUser" resultType="User">
    SELECT * FROM user
    WHERE age > 18

看起来 SQL 语句没有问题,但是 XML 解析器会将 < 识别为标签开始符号。如果 SQL 中包含小于号:

SQL
WHERE age < 18

XML 解析时会认为 < 18 是一个非法标签,从而出现类似错误:

The content of elements must consist of well-formed character data or markup.

因此,在 MyBatis XML 中,SQL 里的特殊符号需要进行转义处理。


二、MyBatis XML中常见特殊符号对应写法

在 XML 文件中,常见 SQL 比较符号需要转换为 XML 实体。

SQL符号XML写法含义
>>大于
<<小于
>=>=大于等于
<=<=小于等于
&&与符号
''单引号
""双引号

例如:

SQL:

SQL
SELECT * FROM user WHERE age >= 18

MyBatis XML:

XML
 id="selectUser" resultType="User">
    SELECT * FROM user
    WHERE age >= 18

执行时 MyBatis 会自动将 XML 实体解析为正常 SQL。


三、大于、小于符号的正确示例

1. 大于号(>)

错误写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE id > 100

正确写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE id > 100

2. 小于号(<)

错误写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE age < 20

正确写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE age < 20

3. 大于等于(>=)

正确写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE create_time >= #{startTime}

对应 SQL:

SQL
SELECT * FROM user
WHERE create_time >= ?

4. 小于等于(<=)

正确写法:

XML
 id="findUser">
    SELECT * FROM user
    WHERE create_time <= #{endTime}

对应 SQL:

SQL
SELECT * FROM user
WHERE create_time <= ?

四、使用CDATA避免特殊符号转义

除了使用 XML 实体转义,还可以使用 CDATA 区域包裹 SQL。

CDATA 是 XML 提供的一种特殊语法,用于表示普通文本内容,其中的特殊字符不会被 XML 解析。

示例:

XML
 id="findUser" resultType="User">
    
        SELECT *
        FROM user
        WHERE age < 18
    

这样 MyBatis 可以正常解析:

SQL
SELECT *
FROM user
WHERE age < 18

CDATA 的优势是 SQL 更接近原始写法,尤其适合复杂查询。

例如:

XML
 id="queryOrder" resultType="Order">
    
        SELECT *
        FROM orders
        WHERE amount >= 1000
        AND create_time <= NOW()
    

五、动态SQL中的特殊符号处理

MyBatis 动态 SQL 经常结合 、、 等标签使用。

例如:

XML
 id="queryUser" resultType="User">
    SELECT *
    FROM user
    
         test="minAge != null">
            AND age >= #{minAge}
        
         test="maxAge != null">
            AND age <= #{maxAge}
        
    

这里不能写:

XML
AND age >= #{minAge}

否则 XML 解析可能失败。


六、MyBatis中推荐使用哪种方式

对于简单 SQL 条件,推荐使用 XML 实体转义:

XML
WHERE score > 60

优点:

  • 符合 XML 标准规范;

  • 可读性较好;

  • 不影响动态 SQL 标签。

对于复杂 SQL,推荐使用 CDATA:

XML

    WHERE price < 500

优点:

  • SQL 结构更加清晰;

  • 减少大量符号转换;

  • 适合复杂查询语句。

实际项目中,两种方式可以结合使用。


七、MyBatis XML中特殊符号常见错误

1. 直接使用小于号导致启动失败

错误:

XML
WHERE status < 3

原因:

XML 将 < 当成标签开始符。

解决:

XML
WHERE status < 3

或者:

XML

WHERE status < 3

2. 动态SQL标签与CDATA混用错误

例如:

错误:

XML
 id="test">


AND id > 10


原因:

CDATA 内部不会解析 MyBatis 标签, 会失效。

正确:

XML
 id="test">
    SELECT *
    FROM user
     test="id != null">
        
        AND id > 10
        
    

MyBatis 标签必须位于 XML 可解析区域。


3. 忽略特殊字符导致 Mapper 加载失败

项目启动时报:

Failed to parse mapping resource

或者:

XML document structures must start and end within the same entity

通常需要检查 Mapper.xml 中是否存在:

  • 未转义的 <

  • 未闭合标签

  • 错误 CDATA 使用方式


八、MyBatis XML编写SQL的最佳实践

1. 条件判断优先使用参数绑定

推荐:

XML
WHERE age > #{age}

不要:

XML
WHERE age > ${age}

原因:

${} 属于字符串替换,容易产生 SQL 注入风险。


2. 复杂查询统一使用CDATA

例如多表关联:

XML
 id="queryReport" resultType="Map">

    SELECT
        a.name,
        b.total
    FROM user a
    LEFT JOIN order_info b
    ON a.id = b.user_id
    WHERE b.total >= 1000

维护起来更加方便。


3. 保持SQL格式清晰

不要为了避免转义而大量拼接字符串:

XML
WHERE age >= 18 AND age <= 60

比复杂字符串拼接更加安全和易维护。


九、总结

MyBatis XML 中使用 SQL 特殊符号时,需要考虑 XML 文件自身的语法规则。大于号、小于号等比较运算符不能随意直接书写,否则可能导致 Mapper 文件解析失败。

常用解决方式主要有两种:

  1. 使用 XML 实体转义:

XML
>
<
>=
<=
  1. 使用 CDATA 包裹 SQL:

XML

SQL语句

在实际开发中,简单条件推荐使用实体转义,复杂 SQL 推荐使用 CDATA。正确处理 MyBatis XML 中的特殊符号,不仅可以避免 XML 解析异常,也能提高 Mapper 文件的可维护性和稳定性。