持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
前言
- 之前做大数据数据存放在elasticsearch中简直是太香了,数据存放到里面然后借助他的高性能搜索简直双胞了。什么高亮搜索,检索分词等等特性他完美了。
- 有时候我就在想mysql也是存储数据的,他能不能实现类似的功能呢?很遗憾的告诉你不行。但是他的模糊匹配也不容小觑,尤其是整合了mybatis之后模糊查询更加常见,今天我们看看有哪些方式实现模糊查询吧。
sql注入
- 这种方式存在的问题就是sql注入 , 所以我们必须在调用mapper之前对传递的参数进行检查,避免居心叵测的黑客传入非法参数。
AND tts.shift_name like '%${teaName}%'
- 这里顺便提一下 和 #的区别,就是一种占位方式,所以通过他来实现模糊搜索很是方便。而 # 就是一个变量,相当于无形中会有一个 "" 包裹着我们的变量,所以压根不会执行sql 也就不存在所谓的sql注入了。
java 实现
- 这种方式就是通过业务实现,上面我们是通过 '%${var}%' ,而# 本身就自带一层引号,所以我们可以在传入的变量中拼接好 %% , 这样在借助# 也可以实现模糊查询。
mybatis
- 上面两种都是mybatis借助于sql或者java实现的,下面我们在介绍一种也是借助sql实现的。通过sql中提供的
concat将变量拼接起来,也就是将%+vars+%拼接成模糊语句。
总结
1、个人建议还是不要使用占位方式实现,毕竟这种sql注入是安全隐患问题
我比较喜欢使用concat进行字符拼接,毕竟这样写的比较优雅,而且中拼接的东西放在xml中在核实不过了,在java中拼接字符串我觉得hen low
另外模糊搜索离开不了%% , 这种方式浪费性能,最好还是避免这种需求的产生