Mybatis模糊查询的N种玩法
很多时候模糊查询在各个厂商数据库上基本可以通用。
原来通配符不止
like
一、模糊查询通配符
模糊查询一般就是通过字面量和通配符对条件进行部分过滤。
常见通配符:
通配符 | 说明 |
---|---|
% | 百分号通配符,支持绝大部分数据库。 % 的给定位置可以匹配0个字符、1个字符或多个字符。不能匹配null |
* | Access使用的通配符。 |
_ | 下划线通配符,只能匹配单个字符。 DB2不支持此用法。Access中则使用?代替_ |
[ ] | 方括号通配符,指定一个字符集,必须匹配指定位置的一个字符。 只有Access和SQL Server支持。如: like '[zx]%' 表示以z或者x开头的匹配条件。^可以作为通配符前缀脱字号进行否定。 SQL Server 写法:like '[^zx]%' 表示不以z或者x开头的匹配条件。Access的写法则是 like '[!zx]%' |
二、Mybatis模糊查询N中玩法
虽然是
SQL
模糊查询,使用Mybatis
测试就暂归类到Mybatis
下,但其实有不少查询基本上可以通用。说明:下列写法是使用
DB2
数据库测试,其他数据库未一一验证,有条件可以自己尝试。
比如,要查询日志表里LOG_MSG
字段有录入
字样的数据:
1、手工拼接好“%”再传入参数
LogInfo log = new LogInfo();
log.setLogMsg("%录入%");
<select id="selectLogInfo" resultType="logInfo">
SELECT * FROM DBCM.LOGINFO WHERE LOG_MSG LIKE #{logMsg}
</select>
另外这里#{}和${}的是有区别的,我看有的博客里将模糊查询#{}和${}写法列为两种,此文并不分别列出:
(a)都支持基本类型和对象类型。
(b)#{}可以防止sql
注入,可以自动给String类型加上' '
(c)${} 原样输出,适合于 动态排序(动态字段)
2、使用CONCAT
连接函数
<select id="selectLogInfo" resultType="logInfo">
SELECT * FROM DBCM.LOGINFO WHERE LOG_MSG LIKE CONCAT('%', CONCAT(#{logMsg}),'%')
</select>
3、使用Mybatis的bind
标签
在系统学习Mybatis
的的动态SQL
中,有个bind标签,支持参数绑定。
<select id="selectLogInfo" resultType="logInfo">
<bind name="pattern" value="'%' + _parameter.getLogMsg() + '%'" />
SELECT * FROM DBCM.LOGINFO WHERE LOG_MSG LIKE #{pattern}
</select>
4、使用LOCATE
函数
LOCATE是字符串查询函数。这个其实和
Mybatis
没什么关系了,只要数据库支持该函数,则可以使用,下同。
SELECT * FROM DBCM.LOGINFO WHERE LOCATE('录入', LOG_MSG)>0
5、使用POSITION
函数
position功能跟locate功能相似。
SELECT * FROM DBCM.LOGINFO WHERE POSITION('录入' IN LOG_MSG)
6、使用INSTR
函数
SELECT * FROM DBCM.LOGINFO WHERE INSTR(LOG_MSG,'录入')
7、使用FIND_IN_SET
函数
FIND_IN_SET
是Mysql
里的函数。语法:
FIND_IN_SET(str,strlist)
假如字符串str
在由N个子链组成的字符串列表strlist
中,则返回值的范围在 1 到 N 之间。
字符串列表strlist
就是一个由一些被","
符号分开的自链组成的字符串。
如果第一个参数是一个常量字符串,而第二个是搜索列,则FIND_IN_SET() 函数被优化,使用比特计算。
如果str
不在strlist
或strlist
为空字符串,则返回值为 0 。
如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号","
时将无法正常运行。
SELECT FIND_IN_SET('b','a,b,c,d'); --结果:2
使用该种查询时,条件比较严苛:Mysql
数据库;匹配列内容以“,”
分割。
--使用Mysql测试
select * from DBCM.LOGINFO where FIND_IN_SET('录入',LOG_MSG);