MyBatis 模糊查询的 4 种实现方式
引言
MyBatis 有 4 种方式可以实现模糊查询。
员工信息表 ( tb_employee ) 如下:
| id | name | sex | 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 种实现方式的更多相关文章
- MyBatis模糊查询的三种拼接方式
1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} ...
- 表单模糊查询的三种简单方式(springboot-h2-mybatis)
前几天运营提到说后台管理系统有几个地方想要模糊查询.. 想了下是简单的,就是要注意以前方法的被调用情况,进行增量改动,以免牵一发而动全身.整理一波记录下(本次案例是按名字模糊查询学生信息). 三种 ...
- MyBatis实现模糊查询的几种方式
在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...
- Ibatis/Mybatis模糊查询
Ibatis/Mybatis模糊查询 根据网络内容整理 Ibatis中 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入风险. Sql代码 select * from ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- mysql进阶(六)模糊查询的四种用法介绍
mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...
- Oracle数据库日期范围查询的两种实现方式
参考文档:http://database.51cto.com/art/201108/288058.htm Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通 ...
- MyBatis模糊查询相关
Mybatis模糊查询的实现不难,如下实例:在UserMapper.xml中根据用户名模糊查询用户: <!-- 模糊查询用户 --> <select id="findSom ...
- 下面介绍mysql中模糊查询的四种用法:
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
随机推荐
- 消息中间件-RabbitMQ集群和高可用
多机多节点集群部署 一. 环境准备 准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤 10.10.1.41 10.10.1.42 10.10.1.43 提示:如果使用虚拟机,可以在一台VM ...
- Java(195-214)【final、权限、内部类】
1.final关键字的概念与四种方法 今天是基础学习的最后一天!~ 2.final关键字用来修饰一个类 3.final关键字来修饰成员方法 4.final用于修饰局部变量 package cn.itc ...
- [源码分析] 分布式任务队列 Celery 之 发送Task & AMQP
[源码分析] 分布式任务队列 Celery 之 发送Task & AMQP 目录 [源码分析] 分布式任务队列 Celery 之 发送Task & AMQP 0x00 摘要 0x01 ...
- Jenkins 分布式和并发构建
1. 分布式构建 1.1 添加 linux 节点 1.2 添加 windows 节点 2. 并发构建 2.1 原理 2.2 示例:分别用 chrome/IE/Firefox 并行测试 1. 分布式构建 ...
- POJ 2752 同一个串的前后串
题解东北赛回来再补 #include<stdio.h> #include<string.h> int next[500000]; int ans[500000]; char s ...
- CVE-2011-0104:Microsoft Office Excel 栈溢出漏洞修复分析
0x01 前言 上一篇讲到了 CVE-2011-0104 漏洞的成因和分析的方法,并没有对修复后的程序做分析.之后在一次偶然的情况下,想看一看是怎么修复的,结果却发现了一些问题 环境:修复后的 EXC ...
- <JVM中篇:字节码与类的加载篇>02-字节码指令集
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- LeetCode---42. 接雨水 (hard)
题目:42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入:height = [0,1,0,2,1,0,1,3,2,1,2, ...
- ppt技巧一四步法调整段落排版
声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明!
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...