什么是动态sql
动态sql技术是一种根据特定条件动态拼接SQl语句的功能,我们可以选择查询条件的数量,进而返回不同的结果。
<where> — <if>标签
如果<if>标签内返回的内容是以AND 或OR 开头的,则它会被where剔除掉,简单理解就是where不会和and或是or相遇。
<select id="selectUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
select * from user
<where>
<if test="username != null">
username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
@Test
public void selectUsernameAndSex(){
User user = new User();
// user.setUsername("熊大");
// user.setSex("女");
List<User> users = mapper.selectUsernameAndSex(user);
for(User user1 : users) System.out.println(user1.toString());
}
<set> — <if>标签
普通的sql修改语句要求即使修改一个字段也需要传入整个记录的字段数据,我们在实际使用时会非常繁琐且容易出错,使用set if标签支持仅传入单个字段值,非常方便。
<update id="updateBySet" parameterType="com.qcby.entity.User">
update user
<set>
<if test="username != null">
username = #{username},
</if>
<if test="birthday != null">
birthday = #{birthday},
</if>
<if test="sex != null">
sex = #{sex},
</if>
<if test="address != null">
address = #{address}
</if>
</set>
where id = #{id}
</update>
@Test
public void updateBySet(){
User user = new User();
user.setUsername("修改后");
user.setId(18);
int count = mapper.updateBySet(user);
session.commit();
System.out.println(count);
}
choose when otherwise标签
choose是父标签,并没有实际意义,when和otherwise在其内部
when相当于if和else if
otherwise相当于else标签
这是我们要查询的表
<select id="selectByChoose" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
select * from user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="username != null">
username = #{username}
</when>
<otherwise>
sex = #{sex}
</otherwise>
</choose>
</where>
</select>
@Test
public void selectByChoose(){
User user = new User();
user.setId(18);
user.setUsername("更新");
user.setSex("女");
List<User> users = mapper.selectByChoose(user);
for (User user1 : users) {
System.out.println(user1.toString());
}
}
当id不为空时,查询id为18的记录
我们把给id赋值的语句注释掉再查询:
我们将id和username赋值语句注释
<trim>标签
trim是一个格式化标签,可以理解为万能标签,它可以替换where和set标签使用。
<trim prefix="where" prefixOverrides="and | or">
prefix=”where”:表示替换where标签,prefixOverrides =”and | or” :表示删除前缀and和or
<trim prefix="set" suffixOverrides=",">
替换set并删除后缀的逗号。
语法规则和之前展示的where标签与set标签的使用基本类似,这里不再赘述。
<foreach>标签
foreach标签用于批量删除和批量添加。对比java的foreach循环
我们先来用foreach操作数组进行批量删除,首先删除的sql语句是:
delete from 表名 where id in(1,2,3,4,5)
<delete id="deleteByArray">
delete from user where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
collection:当前要循环的数组或者集合
item:我们指定要循环的数组的每一个元素
separator:每一个元素应该用什么来做分割,例子里是逗号
open:当前循环是以什么开始
close:当前循环是以什么结束
对集合进行操作:批量添加
<insert id="insertByList">
insert into user (username,birthday,sex,address)values
<foreach collection="users" item="user" separator=",">
(#{user.username},#{user.birthday},#{user.sex},#{user.address})
</foreach>
</insert>
版权声明:本文为weixin_43183850原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。