Mybatis学习记录(五) |
您所在的位置:网站首页 › 多个条件查询的sql语句 › Mybatis学习记录(五) |
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 |