MyBatis处理LIKE查询时,如何将传值中包含下划线_和百分号%等特殊字符处理成普通字符而不是SQL的单字符通配符

本文主要是介绍MyBatis处理LIKE查询时,如何将传值中包含下划线_和百分号%等特殊字符处理成普通字符而不是SQL的单字符通配符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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方法。这种写法可以确保资源被正确关闭,即使在发生异常的情况下也能够执行关闭操作,从而避免资源泄漏。

这篇关于MyBatis处理LIKE查询时,如何将传值中包含下划线_和百分号%等特殊字符处理成普通字符而不是SQL的单字符通配符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636879

相关文章

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

MYSQL中information_schema的使用

《MYSQL中information_schema的使用》information_schema是MySQL中的一个虚拟数据库,用于提供关于MySQL服务器及其数据库的元数,这些元数据包括数据库名称、表... 目录关键要点什么是information_schema?主要功能使用示例mysql 中informa

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复