引言

MyBatis 有 4 种方式可以实现模糊查询。

员工信息表 ( tb_employee ) 如下:

id name sex email birthday address
001 张一凡 zyf@qq.com 1989-10-11 成都市一环路海南之家188号
002 张军 zj@qq.com 1990-02-10 成都市二环路神仙树街200号
003 李国华 lgh@qq.com 1980-02-10 成都市三环路迎宾路58号
根据姓名模糊查询员工信息

方式一

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like #{name}
</select>

此种方式需要调用接口方法传参时,手动的去添加 “%” 通配符,即

SqlSession sqlSession = MyBatisUtil.getSession();
IEmpolyeeDao empolyeeDao = sqlSession.getMapper(IEmpolyeeDao.class);
EmployeeEntity = IEmpolyeeDao.selectByName("%"+"张"+"%");
MyBatisUtil.closeSesion(sqlSession);

这种方式可以实现模糊查询,但是有一点不方便的地方就是在调用接口 selectByName() 方法传参时需要手动的添加 "%" 号通配符,有些麻烦。

方式二

你可能会想到,能否在映射配置文件中直接将”%“号通配符写好呢?如下:

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like %#{name}%
</select>

但是,测试后你会发现,程序会报错,错误原因是:缺少单引号。

这时你可能会这样想了,那干脆加一个“单引号”不就得了,如下:

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like '%#{name}%'
</select>

测试后发现,程序依然会报错,原因是:如果加上单引号,那么就当成是一个字符串,而 #{ } 写在字符串中不能识别,正确的做法是将#{ }改写成 ${ } 这种形式,如下:

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like '%${name}%'
</select>

测试后发现,程序终于没报错了。

但是这种方式有一个美中不足的地方,就是它是以拼接字符串的方式生成 sql,这样做会引发 sql 注入的问题。

SQL 注入是黑客常用的一种攻击技术,想知道详情请搜索看我的另一篇专门介绍 SQL 注入问题以及防御办法的文章

方式三

前两种方式,虽然可以解决模糊查询的问题,但是都不怎么好,要么手动添加太麻烦,要么有 SQL 注入的安全问题。有没有什么办法,能够两全其美呢?有的,我们可以借助 mysql 的字符串拼接 concat 函数,如下:

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like concat( '%' , #{name}, '%')
</select>

这是 concat( '%' , #{name}, '%') 的作用就将三个字符串拼接起来。

方式四

当然对于方式三,也可以使用 ${} 的方式,不过需要特别留意单引号的问题。

<select id="selectByName" resultType="EmployeeEntity">
select * from tb_employee where name like concat( '%' , ‘${name}', '%')
</select>

总结

  • '#{}'是预编译处理,MyBatis 在处理 #{ }时,它会将sql中的#{ }替换为 ?号,然后调用JDBC 中 PreparedStatement 的 set 方法来赋值,传入字符串后会自动在值两边加上单引号,使用占位符的方式提高效率,可以防止 sql 注入问题(主要使用方式)

  • '${ }' 表示拼接 sql 串,将接收到参数的内容不加任何修饰拼接在 sql 中,可能引发 sql 注入问题(一般很少使用)

MyBatis 模糊查询的 4 种实现方式的更多相关文章

  1. MyBatis模糊查询的三种拼接方式

    1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} ...

  2. 表单模糊查询的三种简单方式(springboot-h2-mybatis)

    前几天运营提到说后台管理系统有几个地方想要模糊查询..   想了下是简单的,就是要注意以前方法的被调用情况,进行增量改动,以免牵一发而动全身.整理一波记录下(本次案例是按名字模糊查询学生信息). 三种 ...

  3. MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...

  4. Ibatis/Mybatis模糊查询

    Ibatis/Mybatis模糊查询 根据网络内容整理 Ibatis中 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入风险. Sql代码 select * from ...

  5. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  6. mysql进阶(六)模糊查询的四种用法介绍

    mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...

  7. Oracle数据库日期范围查询的两种实现方式

    参考文档:http://database.51cto.com/art/201108/288058.htm Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通 ...

  8. MyBatis模糊查询相关

    Mybatis模糊查询的实现不难,如下实例:在UserMapper.xml中根据用户名模糊查询用户: <!-- 模糊查询用户 --> <select id="findSom ...

  9. 下面介绍mysql中模糊查询的四种用法:

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

随机推荐

  1. 安卓安装kali linux之Termux

    解决安装kali无模组问题 https://blog.csdn.net/weixin_44690490/article/details/108599693?utm_source=app 步骤 1.获取 ...

  2. day-6 xctf-hello_pwn

    xctf-hello_pwn 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&i ...

  3. malloc 函数分析 glibc2.23

    malloc 函数详解 本篇主要是参考了glibc 2.23的源码 首先我们来看看malloc函数的执行流程. strong_alias (__libc_malloc, __malloc) stron ...

  4. Day14_75_反射(reflect)

    反射 反射的基本概念 反射是由Smith在1982年首次提出,主要是指程序可以访问,检测,修改它本身状态或行为的一种能力.并且能够根据自身行为的状态或结果,调整和修改所描述行为的状态和相关语义. ja ...

  5. Jenkins 系统管理与配置

    1. Jenkins 安装插件的两种方式 2. 添加凭据(Credentials) 3. 系统管理--全局工具配置 4. 系统管理--系统设置 5. 常用插件说明 Extended E-mail No ...

  6. Spring Security极简入门三部曲(上篇)

    目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...

  7. Redis 面试必备知识点

    1.Redis 简介 是一个用 C 语言开发的,高性能的键值对数据库. 数据存在于内存,读写速度快. 可用来做缓存.分布式锁.消息队列. 提供多种数据类型来支持不同的业务场景. 支持事务.持久化.Lu ...

  8. SpringCloud之配置中心(config)的使用Git+数据库实现

    SpringCloud微服务实战系列教程 -------------------------目录------------------------------ 一.配置中心应用(Git) 二.配置中心的 ...

  9. hdu4396 多状态spfa

    题意:       给你一个图,让你送起点走到终点,至少经过k条边,问你最短路径是多少.... 思路:       把每个点拆成50点,记为dis[i][j] (i 1---50 ,j 1---n); ...

  10. hdu2846 字典树(带id的)

    题意:      给你一些模式串,然后给你一些提问,每个提问是给你一个串,问你这个串在上 面的模式串中出现的次数. 思路:       一开始想到hash,但是因为用的是map,所以超时了,map的操 ...