《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
and bed_num=#{bedNum}
标签中的属性test用来指定判断条件,那么问题来了,上面的例子中的test中判断条件都是一个条件,如果此时变成两个或者多个条件呢?和SQL的语法类似,and连接即可,如下:
and bed_num=#{bedNum}
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
还是上面的例子改变一下:此时只能满足一个筛选条件,如果前端传来住院号就只按照住院号查找,如果传来床位号就只按照床位号筛选,如果什么都没传,就筛选所有在院的。此时的查询如下:
<select id=“selectPats”
resultType=“com.xxx.domain.PatientInfo”>
select * from patient_info where 1=1
AND ipt_num=#{iptNum}
AND bed_num = #{bedNum}
AND status=1
MyBatis 提供了 choose 元素,按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为default。
举个栗子:对于choose标签的例子中的查询,如果去掉where后的1=1此时的SQL语句会变成什么样子,有三种可能的SQL,如下:
select * from patient_info where AND ipt_num=#{iptNum};
select * from patient_info where AND bed_num = #{bedNum};
select * from patient_info where AND status=1;
发生了什么,以上三条SQL语句对吗?很显然是不对的,显然where后面多了个AND。如何解决呢?此时就要用到where这个标签了。
where 元素只会在子元素返回任何内容的情况下才插入 WHERE 子句。而且,若子句的开头为 AND 或 OR,where 元素也会将它们去除。
此时的查询改造如下:
<select id=“selectPats”
resultType=“com.xxx.domain.PatientInfo”>
select * from patient_info
AND ipt_num=#{iptNum}
AND bed_num = #{bedNum}
AND status=1
foreach是用来对集合的遍历,这个和Java中的功能很类似。通常处理SQL中的in语句。
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
例子如下:
SELECT *
FROM patient_info
WHERE ID in
<foreach item=“item” index=“index” collection=“list”
open=“(” separator=“,” close=“)”>
#{item}
改标签中的各个属性的含义如下:
讲这个标签之前,先看下面这个例子:
UPDATE STUDENT
SET NAME = #{name},
MAJOR = #{major},
HOBBY = #{hobby}
WHERE ID = #{id};
UPDATE STUDENT SET
NAME = #{name},
MAJOR = #{major},
HOBBY = #{hobby}
WHERE ID = #{id};
上面的例子中没有使用 if 标签时,如果有一个参数为 null,都会导致错误。当在 update 语句中使用 if 标签时,如果最后的 if 没有执行,则或导致逗号多余错误。使用 set 标签可以将动态的配置 set 关键字,和剔除追加到条件末尾的任何不相关的逗号。
使用 set+if 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。此时的查询如下:
UPDATE STUDENT
NAME = #{name},
最后
金三银四马上就到了,希望大家能好好学习一下这些技术点
学习视频:
大厂面试真题:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
NAME = #{name},
最后
金三银四马上就到了,希望大家能好好学习一下这些技术点
学习视频:
[外链图片转存中…(img-vNegYcJf-1714517201273)]
大厂面试真题:
[外链图片转存中…(img-lkisjxRj-1714517201274)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!