引言

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. KubeEdge EdgeMesh设计原理

    EdgeMesh主要用来做边缘侧微服务的互访. ServiceMesh service mesh是一个服务网格的概念.在传统的架构里面都是通过像Dubbo来进行服务治理,服务治理的程序和我们应用程序强 ...

  2. Python面向对象的高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...

  3. Day16_93_IO_FileInputStream_读取文件字节流read()方法(一)

    读取文件字节流read()方法 * 文件字节输入流:按照字节方式读取文件 * java.io.* java.io.InputStream; java.io.FileInputStream; read( ...

  4. Day14_79_IO+Properties联合应用

    IO+Properties联合应用 - dbinfo文件中可以存放<key=value> - 像dbinfo这样的文件我们叫做配置文件,配置文件的作用是使程序更加灵活 - 一般在程序中可变 ...

  5. 整合Atomikos、Quartz、Postgresql的踩坑日记

    前言 由于业务需要,在单体Spring Boot项目中需要引入分布式事务,来保证单体应用连接的多个数据源的事务统一. 而说到分布式事务,小伙伴们肯定会想到阿里的Seata,阿里Seata强大的AT模式 ...

  6. 善用k8s describe

    使用 kubectl describe 来查看某个东西的详细例如 kubectl describe deployment my-nginx kubectl describe svc my-nginx

  7. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  8. Django中图形验证码(django-simple-captcha)

    django-simple-captcha 在网站开发的登录页面中,经常会需要使用到图形验证码来验证.在Django中,django-simple-captcha库包提供了图形验证码的使用. 下面我们 ...

  9. Windows核心编程 第27章 硬件输入模型和局部输入状态

    第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...

  10. Ext.MessageBox.alert()弹出对话框详解

    Ext.MessageBox是一个工具类,他继承自Obiect对象,用来生成各种风格的信息提示对话框,Ext.Msg是该类的别名,使用Ext.MessageBox和用Ext.Msg效果是一样的,而后者 ...