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)>05、使用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);



