Mybatis的sql语句中下划线_,百分号%的处理

问题

今天遇到一个线上BUG,Mybatis的映射XML文件中sql语句写法有问题,写法如下:

SELECT * FROM TBL_FIN_RETURN_DEBT WHERE ORDER_NO LIKE 'OT61981371212542_%' 

该功能的本意是下划线_不作为通配符使用,但是实现该功能的同事忽略了该问题,导致会查出订单号以OT61981371212542开头的退款单。

解决问题

修改Mybatis的映射xml文件如下:

SELECT * FROM TBL_FIN_RETURN_DEBT
        <trim prefix=" where ">
            <choose>
                <!-- 如果我就真的要查%或者_,怎么办呢?
                    使用escape,转义字符后面的%或_就不作为通配符了,
                    注意前面没有转义字符的%和_仍然起通配符作用,Sql代码
                   select username from gg_user where username like '%xiao/_%' escape '/'; -->
                <when test="flag != null and flag != ''">
                    <![CDATA[  AND ORDER_NO LIKE  '${orderNo}/_%' ESCAPE '/' ]]>
                </when>
                <otherwise>
                    AND ORDER_NO = #{orderNo}
                </otherwise>
            </choose>
        </trim>

扩展知识

MySql的like语句中的通配符:百分号%、下划线_的运用
百分号%代表任意多个字符
sql代码:

 select * from A where a like 'sully%';

下划线_代表一个字符
sql代码:

select * from A where a like 'sully_';

百分号%、下划线_不转义

如果我就真的要查%或者,怎么办呢?使用escape,转义字符后面的%或就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用
Sql代码:

select * from A where a like '%sully/_%' escape '/';   
select * from A where a like '%sully/%%' escape '/'; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值