3. Mybatis动态SQL
3.1 什么是动态SQL
在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。
编辑
而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。
此时,执行的SQL语句为:
编辑
这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。
比如:如果姓名输入了"张", 对应的SQL为:
如果姓名输入了"张",,性别选择了"男",则对应的SQL为:
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为:动态SQL。
编辑
在Mybatis中提供了很多实现动态SQL的标签,我们学习Mybatis中的动态SQL就是掌握这些动态SQL标签。
3.2 动态SQL-if
<if>
:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
接下来,我们就通过<if>
标签来改造之前条件查询的案例。
3.2.1 条件查询
示例:把SQL语句改造为动态SQL方式
- 原有的SQL语句
- 动态SQL语句
测试方法:
执行的SQL语句:
编辑
下面呢,我们修改测试方法中的代码,再次进行测试,观察执行情况:
执行结果:
编辑
再次修改测试方法中的代码,再次进行测试:
执行的SQL语句:
编辑
以上问题的解决方案:使用<where>
标签代替SQL语句中的where关键字
<where>
只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR
测试方法:
执行的SQL语句:
编辑
3.2.2 更新员工
案例:完善更新员工功能,修改为动态更新员工数据信息
- 动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新
- 解决方案:动态SQL
修改Mapper接口:
修改Mapper映射文件:
测试方法:
执行的SQL语句:
编辑
再次修改测试方法,观察SQL语句执行情况:
执行的SQL语句:
编辑
以上问题的解决方案:使用<set>
标签代替SQL语句中的set关键字
<set>
:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)
再次执行测试方法,执行的SQL语句:
编辑
小结
<if>
- 用于判断条件是否成立,如果条件为true,则拼接SQL
- 形式:
<where>
- where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR
<set>
- 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)