Mybatis学习记录(五)

您所在的位置:网站首页 多个条件查询的sql语句 Mybatis学习记录(五)

Mybatis学习记录(五)

2024-01-08 21:13| 来源: 网络整理| 查看: 265

2018.4.23

仅为个人理解 不足之处欢迎指正~

在之前的内容中 我们通过实例实现了使用Mybatis进行的CRUD和模糊查询操作

然后之前使用到的sql语句均仅包含一个查询条件

然而在现实生活中我们经常会遇到需要不止一个条件的时候

传统多条件查询的缺陷

我们随意打开一个购物网站  并在搜索栏输入“电脑”

在出现的页面中我们发现了如下标签:

试想一下这个情况:

我们想要购买一台品牌为“戴尔”  内存“至少为16G” 价格“不超过8000”的“笔记本电脑”

我们的SQL语句该这样编写:

select * from 笔记本电脑表 where 品牌=“戴尔” and 内存>16 and 价格70 age>20 的女生

SQL语句自然如下:

select * from student where sex="女" and grade>70 and age>20;

在数据库中直接执行这句SQL语句:

现在使用Mybatis完成这个操作:

在student.xml中添加如下配置语句:

测试语句:

因为传入的参数有多个 所以需要使用Map来传递

可以得到刚才的答案

这样的查询引出了下面三个问题:

1.无法灵活的添加条件

2.如果只想按照年龄与成绩查询 不能在sex处赋值为空 仍需要新的SQL语句

3.如果采用拼接的方式(其实这样也算改变了SQL语句)非常容易产生格式错误或者顺序错误

动态SQL:if

应用场景1:

假设我们现在需要对student表进行两种操作:

查询所有信息根据专业名进行模糊查询

按照现在的方式 我们必须提供2条SQL语句分别应对这两种操作

此时我们介绍一下动态SQL中的if标签在这里的使用:

我们来解释一下这条SQL语句:

这条语句意味着:如果没有传入参数major 那么执行select * from student 即查询所有

如果传入了参数majo 那么执行这句模糊查询

注意:这里的中的test仅为语法 实际等于if()

测试一下这两种情况:

第二种情况:

应用场景2:

现在需要进行这种查询:

根据姓名与专业来查询数据:如果姓名为空 将只根据专业来查询 如果姓名不为空 将只根据姓名来查询

传统SQL语句如下:

select * from student where name=#{name} and major=#{major};

在上面的SQL语句中我们发现 如果#{name}为空 那么查询结果直接为空 并不能进入“根据专业查询”这一个环节

我们试着使用if来解决这个问题:

我们在测试中发现 根据name来查询可以得到正确结果 而name为空 试图根据major来查询时报错

这是因为当major为空 name不为空时 SQL语句如下:

select * from student where name=#{name};

而当name为空呢?

select * from student where and major=#{major};

我们发现问题出在这个where上

如何解决这个问题呢?

动态SQL:where

为了解决上面的问题 我们需要使用标签

代码如下:

标签可以自动进行判断

如果任何条件都不成立 那么在SQL语句中不会出现where

如果有条件成立 且这个标签返回的内容是以“AND”或“OR”开头的 会自动去掉这个多出来的and或者or

在测试代码中:

无论是不加name只加major 还是不加major只加name  都会得到正确结果

总结:

通过对比传统多条件查询与动态SQL 明显的看出动态SQL所具有的灵活性

本文仅涉及到查询这一类操作 也仅介绍了if与where两个标签

动态SQL还具有各种其他标签适用于其他情况

将在以后详细介绍

谢谢~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3