文章目录
1 动态sql中的元素
序 号 | 元素 | 说明 |
---|---|---|
1 | <if> | 判断语句,用于单条件判断 |
2 | <choose>(<when>、<otherwise>) | 相当于Java中的switch…case…default语句,用于多条件判断 |
3 | \ | 简化SQL语句中where的条件判断 |
4 | <trim> | 可以灵活地去除多余的关键字 |
5 | <set> | 用于SQL语句的动态更新 |
6 | <foreach> | 循环语句,常用于in语句等列举条件中 |
2 if元素
完成案例,要求:
根据名字与年龄查询,两项均可以为空。
若用户仅仅输入了名字,则只根据名字查询
若用户仅仅输入了年龄,则只根据年龄查询
若用户同时输入了名字和年龄,则根据两者查询。
例如将名字为“含张”且年龄小于20的查出来,两项输入条件可以为空
注意:
在xml中写sql语句时,(<)小于号往往不会被解析转义,此时就需要用特定给方法解决
一:使用特殊字符转义 > > 大于号 (可以被解析) < < 小于号 (重点) 二:使用<![CDATA[ ]]>符号 <![CDATA[ <= ]]>
<select id="findByNameAndAge" resultType="com.yiwu.pojo.User">
select *
from users_info where 1=1
<if test="uname != null and uname != ''">
and uname like concat('%',#{uname},"%")
</if>
<if test="uage != null and uage != ''">
and uage < #{uage}
</if>
</select>
//List<User> findByNameAndAge(User user);
@Test
public void test06(){
User user = new User();
user.setUname("张");
user.setUage(20);
List<User> byId2 = mapper.findByNameAndAge(user);
System.out.println(byId2);
}
3 <choose><when><otherwise>元素
类似于java中的switch,case,default,多个条件选择其中一个执行。
完成案例,要求:
根据名字与年龄查询,两项均可以为空。
若用户输入了名字,则只根据名字查询
若用户名字为空,仅输入了年龄,则只根据年龄查询
若用户名字和年龄均为空,则查询所有电话不为空的信息。
<select id="findByNameOrAge" resultType="com.yiwu.pojo.User">
select *
from users_info where
<choose>
<when test="uname != null and uname != ''">
uname like concat('%',#{uname},"%")
</when>
<when test="uage != null and uage != ''">
uage < #{uage}
</when>
<otherwise>
uphone is not null
</otherwise>
</choose>
</select>
测试方法
//List<User> findByNameOrAge(User user);
@Test
public void test07(){
User user = new User();
//user.setUname("张");
//user.setUage(20);
List<User> byId2 = mapper.findByNameOrAge(user);
System.out.println(byId2);
}
4 <where> 元素
在映射文件中,编写的SQL后面加入了“where 1=1”的条件的话,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键字。针对这种情况,可以使用MyBatis提供的<where>元素处理。
映射文件
<select id="findByNameAndAge2" resultType="com.yiwu.pojo.User">
select *
from users_info
<where>
<if test="uname != null and uname != ''">
and uname like concat('%',#{uname},'%')
</if>
<if test="uage != null and uage != ''">
and uage < #{uage}
</if>
</where>
</select>
5<trim> 元素
属性 | 说明 |
---|---|
prefix | 指定给SQL语句增加的前缀 |
prefixOverrides | 指定SQL语句中要去掉的前缀字符串 |
suffix | 指定给SQL语句增加的后缀 |
suffixOverrides | 指定SQL语句中要去掉的后缀字符串 |
<select id="findByNameAndAge3" resultType="com.yiwu.pojo.User">
select *
from users_info
<trim prefix="where" prefixOverrides="and">
<if test="uname != null and uname != ''">
and uname like concat('%',#{uname},'%')
</if>
<if test="uage != null and uage != ''">
and uage < #{uage}
</if>
</trim>
</select>
6 set更新
<update id="updateUserById2">
update users_info
<set>
<if test="uname != null and uname != ''">
uname = #{uname},
</if>
<if test="uage != null and uage != ''">
uage = #{uage},
</if>
</set>
where uid = #{uid}
</update>
使用trim
<update id="updateUserById2">
update users_info
<trim prefix="set" suffixOverrides=",">
<if test="uname != null and uname != ''">
uname = #{uname},
</if>
<if test="uage != null and uage != ''">
uage = #{uage},
</if>
</trim>
where uid = #{uid}
</update>
7 复杂的查询操作 foreach
属性 | 说明 |
---|---|
item | 表示集合中每一个元素进行迭代的别名,必选属性 |
index | 在List和数组中,index是序号,在Map中表示K值,可选属性 |
open | 开始的符号 |
separator | 各个元素的分隔符 |
close | 结束符号 |
collection | 参数类型,必选属性。参数为List属性为list;参数为数组,属性为array;参数为Map,属性为Map。 |
数组
<select id="findUserByIds" resultType="com.yiwu.pojo.User">
select * from users_info where uid in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
//List<User> findUserByIds(int[] ids);
@Test
public void test10(){
int[] a = {2,3,4,5,6};
List<User> byId2 = mapper.findUserByIds(a);
System.out.println(byId2);
}
mybatis基础教程【5小时36讲全套】
重录版-推荐(36讲,无法分享组,点击前往bilibili查看全集
12 动态Sql简介