嘘~ 正在从服务器偷取页面 . . .

Mybatis-模糊查询的N种玩法


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_SETMysql里的函数。语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。

字符串列表strlist 就是一个由一些被","符号分开的自链组成的字符串。

如果第一个参数是一个常量字符串,而第二个是搜索列,则FIND_IN_SET() 函数被优化,使用比特计算。

如果str不在strliststrlist为空字符串,则返回值为 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);



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录