MySQL中,_和%在LIKE模糊匹配中有特殊的含义:
- 下划线 _ 在LIKE模糊匹配中表示匹配任意单个字符。
- 百分号 % 在LIKE模糊匹配中表示匹配任意多个字符(包括零个字符)
如果这种字符不经过处理,并且你的模糊查询sql语句书写如下,那么在你的前端页面搜索框中输入下划线或者百分号时候,搜索到的数据就是全量数据,未达到我们的预期。
<select id="findByPattern" resultType="com.example.entity.YourEntity">
SELECT * FROM your_table WHERE your_column LIKE concat('%', #{pattern}, '%')
</select>
如何将这种特殊字符变成普通字符而不是 sql的单字符通配符?
在XML配置的MyBatis中处理LIKE查询时,如果前端传递的值中包含了下划线_,并且你想要这个下划线被视为普通字符而不是SQL的单字符通配符,你需要在MyBatis的XML映射文件中对这个字符进行转义。
在MyBatis中,你可以使用<![CDATA[]]>区块来避免XML解析错误,并在SQL查询中使用\来转义下划线。这里是一个如何在XML映射文件中处理这种情况的例子:
<?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.example.mapper.YourMapper">
<!-- 定义一个查询操作 -->
<select id="findByPattern" resultType="com.example.entity.YourEntity">
SELECT * FROM your_table WHERE your_column LIKE CONCAT('%', REPLACE(#{pattern}, '_', '\_'), '%')
</select>
</mapper>
在这个例子中,REPLACE(#{pattern}, ‘_’, ‘\_’)函数将传入的参数中的所有下划线_替换为转义后的下划线\_。CONCAT函数用于在参数的前后添加百分号%作为通配符。
如上代码只处理了单一下划线的情况,如果前端传递的值中包含的下划线_或百分号%都处理呢,下面是一个XML映射文件中处理这种情况的例子:
<?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.example.mapper.YourMapper">
<!-- 定义一个查询操作 -->
<select id="findByPattern" resultType="com.example.entity.YourEntity">
SELECT * FROM your_table WHERE your_column LIKE CONCAT('%', #{escapedPattern}, '%')
</select>
</mapper>
在这个例子中,escapedPattern是经过转义处理的搜索模式。在Java代码中,你需要在传递参数之前对搜索词进行转义处理:
public class YourService {
private final SqlSessionFactory sqlSessionFactory;
public YourService(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public List<YourEntity> search(String searchTerm) {
try (SqlSession session = sqlSessionFactory.openSession()) {
// 在这里处理参数,确保它包含了SQL LIKE通配符,并对特殊字符进行转义
String escapedPattern = searchTerm
.replace("_", "\_")
.replace("%", "\%");
return session.selectList("com.example.mapper.YourMapper.findByPattern", escapedPattern);
}
}
}
在这个例子中,searchTerm是前端传递的原始字符串,它可能包含下划线_和百分号%。在Java代码中,我们使用replace方法对这些特殊字符进行转义处理,然后将处理过的搜索词传递给MyBatis进行LIKE查询。
并且使用try-with-resources写法
try (SqlSession session = sqlSessionFactory.openSession())
在try-with-resources语句中,你可以声明一个或多个资源,这些资源在try块执行完毕后会自动关闭。在这种情况下,SqlSession会在try块执行完毕后自动关闭,无需手动调用close方法。这种写法可以确保资源被正确关闭,即使在发生异常的情况下也能够执行关闭操作,从而避免资源泄漏。
原文地址:https://blog.csdn.net/weixin_44065196/article/details/135670511
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_58268.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!