目录
动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。
在 xml 里面写判断条件。
动态SQL 在数据库里的体现就是,phtot 这个字段在数据输入的时候,在没有默认值情况下,可以为空。
在 SQL 中,空和 NULL 是两个不同的概念。空什么也没有显示,而 NULL 显示了 NULL。
1 if 标签
/**
* 动态 sql
* if 标签
* @param userInfo
* @return
*/
int add2(UserInfo userInfo);
<insert id="add2">
insert into userinfo(username,password
<if test="photo != null">
,photo
</if>
)values(#{username},#{password}
<if test="photo != null">
,#{photo}
</if>
)
</insert>
@Test
void add2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("猪八戒");
userInfo.setPassword("569875");
userInfo.setPhoto("lion.png");
int result = userMapper.add2(userInfo);
System.out.println(result);
}
@Test
void add2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("如来佛祖");
userInfo.setPassword("99999");
int result = userMapper.add2(userInfo);
System.out.println(result);
}
2 trim 标签
多个字段可以为空的情况下,只要有一个字段不为空,就需要用到添加操作。动态拼接。
/**
* trim 标签
* @param userInfo
* @return
*/
int add3(UserInfo userInfo);
<insert id="add3">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username!=null">
username,
</if>
<if test="password!=null">
password,
</if>
<if test="photo!=null">
photo
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username!=null">
#{username},
</if>
<if test="password!=null">
#{password},
</if>
<if test="photo!=null">
#{photo}
</if>
</trim>
</insert>
@Test
void add3() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("观音菩萨");
userInfo.setPassword("3785");
int result = userMapper.add3(userInfo);
System.out.println(result);
}
@Test
void add3() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("卓耿");
userInfo.setPassword("sfgoz");
userInfo.setPhoto("dragon.jpn");
int result = userMapper.add3(userInfo);
System.out.println(result);
}
3 where 标签
根据传入参数,来决定 SQL 语句是否有 where 关键字。动态生成 where 语句。
对于 int 类型,不传的话,默认为 0 ,而不是 null。
where 标签除了动态生成 where 语句外,还可以自动的去掉语句前面的 and。所以 and 只能放在语句的前面,放在最后面会报错!
/**
* where 标签
* @param userInfo
* @return
*/
List<UserInfo> getListByWhere(UserInfo userInfo);
<select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
select * from userinfo
<where>
<if test="id>0">
id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
<if test="photo!=null">
and photo=#{photo}
</if>
</where>
</select>
@Test
void getListByWhere() {
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
List<UserInfo> list = userMapper.getListByWhere(userInfo);
System.out.println(list);
}
@Test
void getListByWhere() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("白骨精");
List<UserInfo> list = userMapper.getListByWhere(userInfo);
System.out.println(list);
}
也可以使用 trim 标签完成上述 where 标签的功能,代码如下:
<select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
select * from userinfo
<trim prefix="where" prefixOverrides="pre">
<if test="id>0">
id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
<if test="photo!=null">
and photo=#{photo}
</if>
</trim>
</select>
4 set 标签
用于修改。
/**
* set 标签
* @param userInfo
* @return
*/
int update2(UserInfo userInfo);
<update id="update2">
update userinfo
<set>
<if test="username!=null">
username=#{username},
</if>
<if test="password!=null">
password=#{password},
</if>
<if test="photo!=null">
photo=#{photo}
</if>
</set>
where id=#{id}
</update>
@Test
void update2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("小玫瑰");
userInfo.setId(6);
userInfo.setPassword("palsov");
userInfo.setPhoto("rose.jpg");
int result = userMapper.update2(userInfo);
System.out.println(result);
}
@Test
void update2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("卡莉熙");
userInfo.setId(4);
userInfo.setPassword("msjf");
int result = userMapper.update2(userInfo);
System.out.println(result);
}
可以看出,set 标签会自动去除末尾的逗号!
5 foreach 标签
多条 sql 数据删除的时候。批量删除。
/**
* foreach 标签
* @param ids
* @return
*/
int delByIds(List<Integer> ids);
<delete id="delByIds">
delete from userinfo
where id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
</delete>
@Test
void delByIds() {
List<Integer> list = new ArrayList<Integer>(){{
add(1);
add(2);
add(3);
}};
int ret = userMapper.delByIds(list);
System.out.println(ret);
}