mybaits int 类型的字段不能 <if test="sub_name != null and '' != field_name"> Java 移除 JSONObject 空值字段

本文探讨了MyBaits框架中INT类型字段的特殊处理方式,指出不能使用sub_name!=null and ''!=field_name的条件判断,而应简化为sub_name!=null。此外,提供了一个实用的代码片段,用于从JSON对象中移除所有空值字段,以优化数据处理流程。

新地址:https://blog.iaiot.com/mybaits-int.html

mybaits int 类型的字段不能 <if test="sub_name != null and '' != field_name">

只能 <if test="sub_name != null">

如果 <if '' != field_name"> ,值为 0 时 if 条件为 false

 

可以直接在代码中移除空值字段

    /**
     * 移除空值字段
     *
     * @param json json
     */
    public static void rmEmptyField(JSONObject json) {
        if (json != null) {
            // 遍历 json 副本,修改原 json,防止 ConcurrentModificationException
            JSONObject jsonCopy = (JSONObject) json.clone();
            Set<String> jsonKeys = jsonCopy.keySet();
            for (String jsonKey : jsonKeys) {
                // 移除空值字段
                if (json.getString(jsonKey) == null || "".equals(json.getString(jsonKey).trim())) {
                    json.remove(jsonKey);
                    continue;
                }
            }
        }
    }

 

<think> 我们被问及MyBatis中`<![CDATA[<>]]>`的含义。结合提供的引用内容,我们可以这样解释: ### 1. **XML中的特殊字符问题** - 在MyBatis的XML映射文件中,SQL语句是写在XML标签内的。XML本身对某些字符有特殊处理,例如: - `<` 会被解析为标签的开始(如`<where>`)。 - `>` 会被解析为标签的结束(如`</where>`)。 - `&` 会被解析为实体引用的开始(如`&`)。 - 如果在SQL语句中直接使用这些字符(如比较运算符`<`或`>`),XML解析器会将其误认为是标签,导致语法错误。 ### 2. **CDATA的作用** - **`<![CDATA[ ... ]]>`** 是XML的语法结构,用于声明一个**"字符数据区"(Character Data Section)**。 - 作用:**包裹在该标签内的所有内容会被XML解析器忽略,直接作为纯文本处理。** - 例如: ```xml <![CDATA[ SELECT * FROM table WHERE age > 18 ]]> ``` 其中的 `>` 不会被解析为标签结束符,而是保留为SQL中的大于符号。 ### 3. **`<![CDATA[<>]]>`的具体含义** - 在问题中提到的 `<>` 是SQL中的**不等于运算符**(部分数据库支持,如MySQL;其他数据库可能用`!=`)。 - 若直接写在XML中: ```xml WHERE age <> 18 -- XML解析器会将`<>`解析为标签语法,导致错误 ``` - 使用CDATA包裹后: ```xml <![CDATA[ WHERE age <> 18 ]]> ``` `<>` 会被原样保留,确保最终生成的SQL是 `WHERE age <> 18`。 ### 4. **使用注意事项(引用[3]和引用[4])** - **范围最小化**:CDATA应只包裹包含特殊字符的片段,而非整个SQL。因为MyBatis的动态SQL标签(如`<if>`、`<where>`)在CDATA内无法被解析。 - 正确示例(引用[4]): ```xml <select id="allUserInfo"> <![CDATA[ SELECT ... WHERE newsday > #{startTime} AND newsday <= #{endTime} ]]> <if test="etidName!=''"> AND newsEdit=#{etidName} </if> <!-- 动态标签在CDATA外 --> </select> ``` - 错误示例: ```xml <select id="allUserInfo"> <![CDATA[ SELECT ... WHERE newsday > #{startTime} <if test="etidName!=''"> AND newsEdit=#{etidName} </if> <!-- 此处的<if>标签不会被解析! --> ]]> </select> ``` ### 5. **替代方案:转义字符** - 如果不想使用CDATA,可以用XML转义字符代替特殊符号: - `<` → `<` - `>` → `>` - `&` → `&` - 例如: ```xml WHERE age <> 18 <!-- 等价于 WHERE age <> 18 --> ``` - 优缺点: - 优点:避免CDATA范围过大的问题。 - 缺点:降低SQL可读性(尤其是复杂条件)。 ### 总结 | **场景** | **写法** | **效果** | |----------------------------|-----------------------------------|------------------------------| | 直接写`<>` | `WHERE age <> 18` | XML解析错误 | | 使用CDATA | `<![CDATA[WHERE age <> 18]]>` | SQL保留`<>` | | 使用转义字符 | `WHERE age <> 18` | 生成`WHERE age <> 18` | > **关键点**:CDATA是MyBatis中处理SQL特殊字符的安全方式,但需确保动态SQL标签(如`<if>`)在CDATA外部[^3][^4]。 §§相关问题§§ 1. MyBatis中如何处理SQL语句中的大于号(>)和小于号(<)? 2. CDATA与XML转义字符在MyBatis中的使用区别? 3. MyBatis动态SQL标签有哪些? </think> 在 MyBatis 的 XML 映射文件中,`<![CDATA[<>]]>` 是一个**特殊语法结构**,主要用于解决 SQL 语句中的特殊字符被 XML 解析器错误处理的问题。以下是详细说明: --- ### 1. **核心作用:防止 XML 转义** - **问题背景**: XML 会将 `<`、`>`、`&` 等字符解析为标签或转义符。例如: ```sql WHERE age > 18 <!-- XML 会误将 ">" 解析为标签结束符 --> ``` - **解决方案**: 用 `<![CDATA[ ]]>` 包裹 SQL 片段,告知 XML 解析器**忽略内部所有字符的转义规则**,直接作为纯文本处理。 - **示例**: ```xml <select id="getUser"> <![CDATA[ SELECT * FROM user WHERE age <> 18 ]]> </select> ``` 最终生成的 SQL 为:`SELECT * FROM user WHERE age <> 18`(`<>` 被正确保留为 SQL 的不等于运算符)。 --- ### 2. **`<>` 的具体含义** - 在 SQL 中,`<>` 表示 **"不等于"**(等价于 `!=`),如 `age <> 18` 即筛选年龄不等于 18 的记录。 - 在 MyBatis 中直接写 `<>` 会导致 XML 解析错误,因为 `<` 会被识别为标签起始符。必须用 CDATA 保护。 --- ### 3. **使用注意事项** 1. **范围最小化原则**(引用[3]): 只包裹**含特殊字符的片段**,避免包裹 MyBatis 动态标签(如 `<if>`、`<where>`): ```xml <select id="getUser"> SELECT * FROM user WHERE 1=1 <![CDATA[ AND age <> 18 ]]> <!-- 仅包裹含 <> 的部分 --> <if test="name != null"> AND name = #{name} <!-- 动态标签在 CDATA 外 --> </if> </select> ``` 2. **替代方案(转义字符)**: 可用 XML 转义序列替代 CDATA: - `<>` → `<>` - `>` → `>` - `<` → `<` 示例: ```xml AND age <> 18 <!-- 等价于 AND age <> 18 --> ``` --- ### 4. **典型使用场景** | **场景** | **正确写法** | **错误写法** | |------------------------|---------------------------------------------|--------------------------| | 不等号(`<>`) | `<![CDATA[ age <> 18 ]]>` | `age <> 18` | | 比较符(`>`、`<`) | `<![CDATA[ salary > 5000 ]]>` | `salary > 5000` | | 逻辑运算符(`&&`) | `<![CDATA[ condition1 && condition2 ]]>` | `condition1 && condition2` | | 特殊符号(如 `&`) | `<![CDATA[ column LIKE '%a&b%' ]]>` | `column LIKE '%a&b%'` | > ✅ **最佳实践**:涉及 `<>`, `>`, `<`, `&` 等符号时优先使用 CDATA 包裹片段(引用[2][4])。 --- ### 5. **与其他动态标签的配合** - 动态 SQL 标签(如 `<if>`、`<where>`)**必须放在 CDATA 外部**,否则不会被 MyBatis 解析(引用[3]): ```xml <select id="getUser"> SELECT * FROM user <where> <if test="age != null"> <![CDATA[ AND age <> #{age} ]]> <!-- 正确:CDATA 在 <if> 内部 --> </if> </where> </select> ``` --- ### 总结 - **`<![CDATA[<>]]>` 的含义**: 保护 SQL 中的 `<>`(不等于运算符)不被 XML 解析器错误处理。 - **本质**: 一种 XML 语法,声明其内部内容为纯文本数据(Character Data),跳过转义规则解析。 - **使用场景**: 所有 SQL 中含 `<`, `>`, `&`, `"` 等特殊字符的片段均需 CDATA 保护。 > 通过合理使用 CDATA,既能避免 XML 解析错误,又能确保动态 SQL 标签正常工作(引用[1][3])。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值