【Mybatis】 Mybatis在xml文件中处理大于号小于号的方法【问题】

处理大于小于号的方法:

https://www.cnblogs.com/winner-0715/p/6132755.html

第一种方法:
用转义字符把">"和"<"替换掉,就没有问题了。

<if test="startTime != null ">
    AND order_date &gt;= #{startTime,jdbcType=DATE} 
</if>
<if test="endTime != null ">
    AND order_date &lt;= #{endTime,jdbcType=DATE} 
</if>

注意下,这里的startTime,endTime都是Date类型的~

附:XML转义字符

&lt;     <   小于号   
&gt;     >   大于号   
&amp;     &   和   
&apos;     ’   单引号   
&quot;     "   双引号   


第二种方法:
因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析 
mapper文件示例代码

<if test="startTime != null ">
    AND <![CDATA[ order_date >= #{startTime,jdbcType=DATE}  ]]>
</if>
<if test="endTime != null ">
    AND <![CDATA[ order_date <= #{endTime,jdbcType=DATE}  ]]>
</if>

 

 

====================================

附带问题:

使用情况:mybatis  xml中写的mapper  对接的是postgresql数据库

问题:在同一个项目中不同的mapper.xml文件中,分别出现了>= 和<=的比较运算符,但是在一个xml中需要额外处理才能使用,一个xml文件中不需要额外处理>或者<符号可以直接使用

下面附上两个xml文件代码和截图,

1.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.rollong.chinatower.server.persistence.mapper.FinanceReportMapper">
    <resultMap id="financeBriefDataResultMap"
               type="com.rollong.chinatower.server.api.payload.finance.FinanceBriefData">
        <id property="id" column="id"/>
    </resultMap>
    <select id="search" resultMap="financeBriefDataResultMap">
        SELECT
        *
        FROM
        (
        SELECT
        ( CAST ( partner.id AS VARCHAR ) || '@partner' ) AS ID,
        partner.id AS partnerId,
        project.id AS projectId,
        construction.id AS constructionId,
        NULL AS takerId,
        NULL AS maintenanceId,
        count(report.id) as reportsCount,
        sum(report.amount) as totalAmount,
        max(report.updated_at) as reportLatestUpdatedAt
        FROM
        "project"."project_construction_partners" AS partner
        LEFT JOIN "project"."project_construction" AS construction ON partner.construction_id = construction.id
        LEFT JOIN "project"."projects" AS project ON construction.project_id = project.id
        LEFT JOIN "finance"."finance_reports" as report on partner.id = report.partner_id
        WHERE
        #{isConstruction} = TRUE
        AND construction.deleted_at IS NULL
        <if test="null != partnerType">
            AND partner.name = '${partnerType}'
        </if>
        <if test="null != provinceId">
            AND project.province_id = #{provinceId}
        </if>
        <if test="null != cityId">
            AND project.city_id = #{cityId}
        </if>
        <if test="null != districtId">
            AND project.district_id = #{districtId}
        </if>
        <if test="null != subCompanyId">
            AND project.sub_company_id = #{subCompanyId}
        </if>
        <if test="null != thirdPartCompanyId">
            AND partner.third_part_id = #{thirdPartCompanyId}
        </if>
        <if test="null != leaderEmployeeId">
            AND partner.leader_employee_id = #{leaderEmployeeId}
        </if>
        <if test="null != workerEmployeeId">
            AND exists(
            select 1 from "third_part"."worker_involved_constructions" as involved
            where involved.worker_id = #{workerEmployeeId} AND involved.project_partner_id = partner.id
            )
        </if>
        <if test="null != reportStatus">
            AND exists(
            select 1 from "finance"."finance_reports" as r
            where r.partner_id = partner.id
            <choose>
                <when test="'Submit' == reportStatus">
                    and r.approved_at is null and r.rejected_at is null and r.paid_at is null
                </when>
                <when test="'Approved' == reportStatus">
                    and r.approved_at is not null and r.rejected_at is null and r.paid_at is null
                </when>
                <when test="'Rejected' == reportStatus">
                    and r.approved_at is null and r.rejected_at is not null and r.paid_at is null
                </when>
                <when test="'Paid' == reportStatus">
                    and r.paid_at is not null
                </when>
            </choose>
            )
        </if>
        <if test="null != keyword">
            AND project.name like #{keyword}
        </if>
        GROUP BY partner.id,project.id,construction.id
        UNION
        SELECT
        ( CAST ( taker.ID AS VARCHAR ) || '@maintenance' ) AS ID,
        NULL AS partnerId,
        project.ID AS projectId,
        NULL AS constructionId,
        taker.ID AS takerId,
        maintenance.ID AS maintenanceId,
        count(report.id) as reportsCount,
        sum(report.amount) as totalAmount,
        max(report.updated_at) as reportLatestUpdatedAt
        FROM
        "project"."project_maintenance_takers" AS taker
        LEFT JOIN "project"."project_maintenance" AS maintenance ON taker.maintenance_id = maintenance.id
        LEFT JOIN "project"."projects" AS project ON maintenance.project_id = project.id
        LEFT JOIN "finance"."finance_reports" as report on taker.id = report.taker_id
        WHERE
        #{isMaintenance} = TRUE
        AND maintenance.deleted_at IS NULL
        AND taker.deleted_at IS NULL
        <if test="null != provinceId">
            AND project.province_id = #{provinceId}
        </if>
        <if test="null != cityId">
            AND project.city_id = #{cityId}
        </if>
        <if test="null != districtId">
            AND project.district_id = #{districtId}
        </if>
        <if test="null != subCompanyId">
            AND project.sub_company_id = #{subCompanyId}
        </if>
        <if test="null != thirdPartCompanyId">
            AND taker.third_part_id = #{thirdPartCompanyId}
        </if>
        <if test="null != leaderEmployeeId">
            AND taker.leader_employee_id = #{leaderEmployeeId}
        </if>
        <if test="null != workerEmployeeId">
            AND exists(
            select 1 from "third_part"."worker_involved_maintenance" as involved
            where involved.worker_id = #{workerEmployeeId} AND involved.taker_id = taker.id
            )
        </if>
        <if test="null != reportStatus">
            AND exists(
            select 1 from "finance"."finance_reports" as r
            where r.taker_id = taker.id
            <choose>
                <when test="'Submit' == reportStatus">
                    and r.approved_at is null and r.rejected_at is null and r.paid_at is null
                </when>
                <when test="'Approved' == reportStatus">
                    and r.approved_at is not null and r.rejected_at is null and r.paid_at is null
                </when>
                <when test="'Rejected' == reportStatus">
                    and r.approved_at is null and r.rejected_at is not null and r.paid_at is null
                </when>
                <when test="'Paid' == reportStatus">
                    and r.paid_at is not null
                </when>
            </choose>
            )
        </if>
        <if test="null != keyword">
            AND project.name like #{keyword}
        </if>
        GROUP BY maintenance.id,project.id,taker.id
        ) AS table_all
        WHERE TRUE
        <if test="minReportsCount != null">
            AND table_all.reportsCount &gt;= #{minReportsCount}
        </if>
        <if test="maxReportsCount != null">
            AND table_all.reportsCount &lt;= #{maxReportsCount}
        </if>
        <choose>
            <when test="sort == 'Latest'">
                ORDER BY table_all.reportLatestUpdatedAt DESC
            </when>
            <when test="sort == 'AmountAsc'">
                ORDER BY table_all.totalAmount ASC
            </when>
            <when test="sort == 'AmountDesc'">
                ORDER BY table_all.totalAmount DESC
            </when>
        </choose>
    </select>
</mapper>
View Code

2.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.rollong.chinatower.server.persistence.mapper.OrderMealTimeMapper">
    <resultMap id="OrderMealResult"
               type="com.rollong.chinatower.server.api.payload.canteen.OrderMealTime" autoMapping="true">
        <result property="years" column="years"/>
        <result property="months" column="months"/>
        <result property="days" column="days"/>
        <result property="counts" column="counts"/>
        <result property="checkOut" column="checkOut"/>
    </resultMap>
    <select id="search" resultMap="OrderMealResult">
        SELECT
        ors.year_meal AS years,
        ors.month_meal AS months,
        ors.day_meal AS days,
        SUM (ors.counts) AS counts,
        SUM (ors.checkd_out) AS checkOut
        FROM canteen.order_meal  ors
        WHERE TRUE
        <if test="null != canteenId">
            AND ors.canteen_id = #{canteenId}
        </if>
        <if test=" null != startY and null != startM and null != startD" >
            AND <![CDATA[ (ors.year_meal *10000 + ors.month_meal *100 + ors.day_meal) >= (#{startY}*10000+#{startM}*100+#{startD}) ]]>
        </if>
        <if test=" null != endY and null != endM and null != endD" >
            AND <![CDATA[ (ors.year_meal *10000 + ors.month_meal *100 + ors.day_meal) <= (#{endY}*10000+#{endM}*100+#{endD}) ]]>
        </if>
          GROUP BY ors.year_meal,ors.month_meal,ors.day_meal
    </select>
</mapper>
View Code

 

 

【究竟是xml的问题/还是对接的数据库的问题/还是数据库中对于某些类型字段处理不一样】

如果有兴趣或者刚好知道,遇到过这种情况的 希望大家能给个反馈,多多交流!!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MyBatis的SQL XML,使用小于号大于号需要注意一些规则,避免出现错误。 对于小于号(<)和大于号(>)的处理,可以采用转义符号,即“<”代替小于号,“>”代替大于号。这样可以避免XML解析器将小于号大于号视为XML标签,造成解析错误。 另外,在编写SQL语句时,可以将小于号大于号放在CDATA段,CDATA段是XML的一种特殊段落,可以包含XML文档任意的文本内容,不会被XML解析器所解析。因此,使用CDATA段可以避免小于号大于号的解析错误。 例如,查询用户年龄小于30岁的SQL语句可以写成以下两种形式: 方式一: ```xml <select id="getUserByAgeLt30" resultType="User"> SELECT * FROM user WHERE age < 30 </select> ``` 方式二: ```xml <select id="getUserByAgeLt30" resultType="User"> <![CDATA[ SELECT * FROM user WHERE age < 30 ]]> </select> ``` 同样,处理大于号的方式也是一样的。例如,查询用户年龄大于20岁的SQL语句可以写成以下两种形式: 方式一: ```xml <select id="getUserByAgeGt20" resultType="User"> SELECT * FROM user WHERE age > 20 </select> ``` 方式二: ```xml <select id="getUserByAgeGt20" resultType="User"> <![CDATA[ SELECT * FROM user WHERE age > 20 ]]> </select> ``` 总之,在MyBatis的SQL XML处理小于号大于号需要留意XML解析器的特性,采用转义符号或CDATA段,避免解析错误。 ### 回答2: 在MyBatis的SQL映射文件小于号大于号通常用于查询条件的比较操作符,但是它们有可能会被解析成XML标签,导致SQL语句执行出错。因此,为了避免这种情况发生,我们可以采用以下两种方式进行处理: 方式一: 在XML标签使用转义字符进行替换,即将小于号大于号分别替换成`<`和`>`。例如: ```xml <select id="getUserList" resultType="User"> SELECT * FROM user WHERE age < 25 AND salary > 5000 </select> ``` 这种方式比较简单,但是在SQL语句出现大量的小于号大于号时,手动替换是比较麻烦的。 方式二: 采用CDATA标记,将SQL语句放在CDATA块,这样XML文本解析器就不会解析其小于号大于号。例如: ```xml <select id="getUserList" resultType="User"> <![CDATA[ SELECT * FROM user WHERE age < 25 AND salary > 5000 ]]> </select> ``` 这种方式比较方便,可以直接把SQL语句放在CDATA块,不需要手动替换小于号大于号。但是,如果在CDATA块还有其他XML标签,就需要注意对其进行转义。 总之,在MyBatis的SQL映射文件,正确处理小于号大于号是非常重要的,可以采用上述两种方式进行处理,确保SQL语句执行正确,避免出现各种问题。 ### 回答3: 在 MyBatis ,对于 SQL 语句的处理,可以通过 xml 文件来进行配置。在 xml 文件,要正确处理小于号大于号,需要注意以下几点: 1. 在 xml 文件小于号(<)与大于号(>)是有特殊含义的,表示开始或结束一个标签,因此如果直接在 SQL 语句使用小于号大于号,需要进行转义处理。可以使用 < 表示小于号,使用 > 表示大于号。 2. 如果 SQL 语句含有多个小于号大于号,也需要进行转义处理。否则,MyBatis 解析时可能会将其解析为标签,导致 SQL 语句错误。 3. 可以使用 CDATA 标签来包裹 SQL 语句,这样可以避免对特殊字符进行转义处理。CDATA 标签内的内容会原封不动地输出,不会被解析为标签。 示例代码: ```xml <select id="getUserListByAge" parameterType="int" resultType="User"> <![CDATA[ SELECT * FROM user WHERE age > #{age} AND age < #{age} + 10 ]]> </select> ``` 在上面的示例代码,CDATE 标签内的 SQL 语句包含了小于号大于号。但是,由于使用了 CDATA 标签,在 XML 解析时不会将其解析为标签,从而避免了 SQL 语句错误的问题。 总之,在使用 MyBatis 进行 SQL 语句的处理时,小于号大于号需要格外注意。为了避免语法错误,必须正确地转义或使用 CDATA 标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值