当前位置:   article > 正文

MyBatis查询数据库之四(动态SQL -- if、trim、where、set、foreach 标签)_insert into和if标签

insert into和if标签

目录

目录

动态SQL

一、 if 标签

二、trim标签

三、where标签

四、set标签

五、foreach标签


动态SQL

动态 SQL 是 MyBatis 的强大特性之一,使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

一、 if 标签

在注册用户时,有些信息是必填的,有些信息是非必填的,比如咱们CSDN的信息,用户昵称是必填的....其余的比如个人简介、出生日期、开始工作都是非必填的程序应该 如何实现呢?

这个时候就需要使用动态标签 <if> 来判断了,比如添加的时候性别 photo为非必填字段,具体实现如下:

<if>语法:

  1. <insert id="add2">
  2. insert into userinfo (username,
  3. <if test="photo!=null">
  4. photo,
  5. </if>
  6. password)
  7. values(#{username},
  8. <if test="photo!=null">
  9. #{photo},
  10. </if>
  11. #{password})
  12. </insert>

空的和null一样吗?

在MySQL中null和空是不一样的

二、trim标签

如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,

这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式

标签作用:去除 SQL 语句前后多余的某个字符,其属性有

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

语法:

调整 UserMapper.xml 的插入语句为:

  1. <insert id="add3">
  2. insert into userinfo
  3. <!-- prefix:添加前缀 suffix:添加后缀 suffixOverrides:去掉最后面的',',有则去,无则不去-->
  4. <trim prefix="(" suffix=")" suffixOverrides="," >
  5. <if test="username!=null">
  6. username,
  7. </if>
  8. <if test="password!=null">
  9. password,
  10. </if>
  11. <if test="photo!=null">
  12. photo,
  13. </if>
  14. </trim>
  15. values
  16. <trim prefix="(" suffix=")" suffixOverrides=",">
  17. <if test="username!=null">
  18. #{username},
  19. </if>
  20. <if test="password!=null">
  21. #{password},
  22. </if>
  23. <if test="photo!=null">
  24. #{photo},
  25. </if>
  26. </trim>
  27. </insert>

三、where标签

where 标签作用:实现查询中的 where 替换,它可以实现如果没有任何的查询条件,那么它可以隐藏查询中的 where sql,但如果存在查询条件,那么会生成 where 的sql 查询,并且使用 where 标签可以自动的去除最前面的一个 and 字符

  1. <select id="getListByParam" resultType="com.example.demo.eneity.Userinfo">
  2. select * from userinfo
  3. <where>
  4. <if test="username != null">
  5. username=#{username}
  6. </if>
  7. <if test="password != null">
  8. and password=#{password}
  9. </if>
  10. </where>
  11. </select>

当咱们只传一条参数时

 那我们来看看只给password值时会不会出问题呢?

这就是where标签的特征,

  1. where 标签会去除最前面的 and 关键字不会去除最后面的 and 关键字
  2. where 标签通常配合 if 标签一起使用
  3. where 标签中如果没有内容,那么不会生成 where sql 关键字

 where 标签也可以使⽤ trim prefix=“where” prefixOverrides=“and” 替换

四、set标签

根据传入的用户对象属性来更新用户数据,可以使用<set>标签来指定动态内容。

UserMapper 接口中修改用户方法:根据传入的用户 id 属性,修改其他不为 null 的属性:

用来判断进行update操作的

  1. <update id="update2">
  2. update userinfo
  3. <set>
  4. <if test="username!=null">
  5. username=#{username},
  6. </if>
  7. <if test="password!=null">
  8. password=#{password},
  9. </if>
  10. <if test="photo!=null">
  11. photo=#{photo},
  12. </if>
  13. </set>
  14. where id=#{id}
  15. </update>

注意:#{photo}后面有一个’,‘号,而我们这次更改的就是photo,且我们能够正常运行

特征:

  1. set 标签通常要配合 if 标签一起使用
  2. set 标签会自动去除最后一个 英文符号

 以上<set>标签也可以使用 <trim prefix="set" suffixOverrides=","> 替换。

五、foreach标签

对集合进⾏遍历时可以使用该标签。<foreach>标签有如下属性:

  •     collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
  •     item:遍历时的每⼀个对象
  •     open:语句块开头的字符串
  •     close:语句块结束的字符串
  •     separator:每次遍历之间间隔的字符串
     

语法:

UserMapper 中新增接口方法:

    int dels(List<Integer> ids);

UserMapper.xml 中新增删除 SQL: 

  1. <delete id="dels">
  2. delete from userinfo
  3. where id in
  4. <foreach collection="ids" open="(" close=")" item="id" separator=",">
  5. #{id}
  6. </foreach>
  7. </delete>

单元测试代码,删除id为1,2和3的用户:

  1. @Rollback(value = false)
  2. @Test
  3. void dels() {
  4. List<Integer> ids = new ArrayList<>();
  5. ids.add(1);
  6. ids.add(2);
  7. ids.add(3);
  8. int result = userMapper.dels(ids);
  9. System.out.println("删除了:" + result);
  10. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号