2018.4.23
仅为个人理解 不足之处欢迎指正~
在之前的内容中 我们通过实例实现了使用Mybatis进行的CRUD和模糊查询操作
然后之前使用到的sql语句均仅包含一个查询条件
然而在现实生活中我们经常会遇到需要不止一个条件的时候
传统多条件查询的缺陷
我们随意打开一个购物网站 并在搜索栏输入“电脑”
在出现的页面中我们发现了如下标签:
试想一下这个情况:
我们想要购买一台品牌为“戴尔” 内存“至少为16G” 价格“不超过8000”的“笔记本电脑”
我们的SQL语句该这样编写:
select * from 笔记本电脑表 where 品牌=“戴尔” and 内存>16 and 价格<8000;
此时我们若是想加入一个条件 “屏幕尺寸为15.6寸”
此时我们很容易想到:
在刚才的SQL语句后面再加入一个 and 屏幕尺寸=“15.6”
但是很遗憾的是 已经完成的代码并不允许我们这样随意增加条件
假如我们现在一共有五个可供搜索的条件
每个条件都有“用到”和“没用到”两种情况
那么在XML配置文件中我们难道需要2^5=32条语句来涵盖这所有的情况吗?
Mybatis中实现传统多条件查询
使用的数据库为信息如下:
数据表student如下:
已有的数据如下:
我们现在进行如下查询:
查询表中grade>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 那么执行这句模糊查询
注意:这里的
测试一下这两种情况:
第二种情况:
应用场景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还具有各种其他标签适用于其他情况
将在以后详细介绍
谢谢~