dw做网站的流程,建网站新科网站建设,设计师证书,微信上的小程序是怎么做的MySQL中#xff0c;_和%在LIKE模糊匹配中有特殊的含义#xff1a;
下划线 _ 在LIKE模糊匹配中表示匹配任意单个字符。百分号 % 在LIKE模糊匹配中表示匹配任意多个字符#xff08;包括零个字符#xff09;
如果这种字符不经过处理#xff0c;并且你的模糊查询sql语句书写…MySQL中_和%在LIKE模糊匹配中有特殊的含义
下划线 _ 在LIKE模糊匹配中表示匹配任意单个字符。百分号 % 在LIKE模糊匹配中表示匹配任意多个字符包括零个字符
如果这种字符不经过处理并且你的模糊查询sql语句书写如下那么在你的前端页面搜索框中输入下划线或者百分号时候搜索到的数据就是全量数据未达到我们的预期。
select idfindByPattern resultTypecom.example.entity.YourEntitySELECT * FROM your_table WHERE your_column LIKE concat(%, #{pattern}, %)
/select
如何将这种特殊字符变成普通字符而不是 sql的单字符通配符?
在XML配置的MyBatis中处理LIKE查询时如果前端传递的值中包含了下划线_并且你想要这个下划线被视为普通字符而不是SQL的单字符通配符你需要在MyBatis的XML映射文件中对这个字符进行转义。
在MyBatis中你可以使用![CDATA[]]区块来避免XML解析错误并在SQL查询中使用\\来转义下划线。这里是一个如何在XML映射文件中处理这种情况的例子
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.mapper.YourMapper!-- 定义一个查询操作 --select idfindByPattern resultTypecom.example.entity.YourEntitySELECT * FROM your_table WHERE your_column LIKE CONCAT(%, REPLACE(#{pattern}, _, \\_), %)/select/mapper
在这个例子中REPLACE(#{pattern}, _, \\_)函数将传入的参数中的所有下划线_替换为转义后的下划线\\_。CONCAT函数用于在参数的前后添加百分号%作为通配符。
如上代码只处理了单一下划线的情况如果前端传递的值中包含的下划线_或百分号%都处理呢下面是一个XML映射文件中处理这种情况的例子 ?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.mapper.YourMapper!-- 定义一个查询操作 --select idfindByPattern resultTypecom.example.entity.YourEntitySELECT * 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 ListYourEntity 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方法。这种写法可以确保资源被正确关闭即使在发生异常的情况下也能够执行关闭操作从而避免资源泄漏。