【MyBatis学习】动态SQL的使用,MyBatis还能这样使用?惊掉了我的下巴 ,赶快带着好奇心一起畅游动

目录

  • 1. 初识动态SQL
  • 2. if标签
    • 2.1 原始的插入语句
    • 2.2 加入if的插入数据
  • 3. trim标签
  • 4. where标签
  • 5. set标签
  • 6. foreach标签

1. 初识动态SQL

官方给的动态SQL的概念

链接: 官方动态sql链接描述

2. if标签

我们想创建一个数据库,注意我们的name属性默认为空串,而不是null.

 create table stu3(id int primary key auto_increment,name varchar(20) default '',age int);

2.1 原始的插入语句

接口方法

    int add(Stu stu);

xml配置

    <insert id="add">insert into stu3 values(#{id},#{name},#{age})</insert>

单元测试

    @Testvoid add() {// 伪代码,构建对象并设置相应的值Stu stu = new Stu();stu.setAge(21);// 调用 mybatis 添加方法执行添加操作int result = stuMapper.add(stu);System.out.println("添加:" + result);Assertions.assertEquals(1, result);}
  • 运行之后的数据库信息,我们惊讶的发现我们在测试单元中没有给name设置值,但是却给我们生成了一个null.
  • 虽然我们没有传值,但是它默认给我们执行,传了一个null

2.2 加入if的插入数据

    <insert id="add">insert into stu3(id,<if test="name != null">name,</if><if test="age != null">age</if>)values(#{id},<if test="name != null">#{name},</if>#{age})</insert>
	 @Testvoid add() {// 伪代码,构建对象并设置相应的值Stu stu = new Stu();stu.setAge(50);// 调用 mybatis 添加方法执行添加操作int result = stuMapper.add(stu);System.out.println("添加:" + result);Assertions.assertEquals(1, result);}

  • test后面是一条布尔类型的判断语句.
  • test后面语句为true执行if标签里面的语句,为false时不执行if标签里面的语句.

3. trim标签

之前的插⼊⽤户功能,只是有⼀个 sex 字段可能是选填项,如果所有字段都是⾮必填项,就考虑使⽤
标签结合标签,对多个字段都采取动态⽣成的⽅式。
标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀
    <insert  id="add">insert into stu3<trim prefix="(" suffix=")" suffixOverrides=","><if test="name != null">name,</if><if test="age != null">age,</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="name != null">#{name},</if><if test="age != null">#{age},</if></trim></insert>
    @Testvoid add() {// 伪代码,构建对象并设置相应的值Stu stu = new Stu();//stu.setId(10);stu.setName("张三");stu.setAge(18);// 调用 mybatis 添加方法执行添加操作int result = stuMapper.add(stu);System.out.println("添加:" + result);Assertions.assertEquals(1, result);}

4. where标签

  • where标签里面可以没有数据,没有数据的时候生成的sql语句没有where关键字.
  • where是否存在,where标签会帮我们去判断.利用trim可以实现相同的功能.
  • where标签通常与if标签一起使用.
  • where标签会删除最前面的and关键字,不会删除最后面的and关键字.也就是两个标签里面放两个属性,在sql语句里面需要用and关键字进行连接,这里的and可以放在第一个标签的末尾,也可以放在第二个标签的首部.
    Stu getStuName(@Param("name") String name);
    <select id="getStuName" resultType="com.example.demo.entity.Stu">select * from stu3<where><if test="name != null">name = #{name}</if></where></select>
    @Testvoid getStuName() {Stu stu = stuMapper.getStuName("张三");System.out.println(stu);}

5. set标签

  • set标签经常与if标签一起使用.
  • set标签会自动去处最后一个英文逗号.
    int update(Stu stu);
   <update id="update">update stu<set><if test="name != null">name = #{name},</if><if test="age != null">age = #{age}</if></set>where id = #{id}</update>
    @Testvoid update() {Stu stu = new Stu();stu.setId(1);stu.setName("李四");stu.setAge(18);stuMapper.update(stu);}

6. foreach标签

标签的属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串
    int del(List<Integer> ids);
   <delete id="del">delete from stu where id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></delete>
    @Testvoid del() {List<Integer> list = new ArrayList<>();list.add(15);list.add(16);list.add(17);stuMapper.del(list);}

本文链接:https://my.lmcjl.com/post/6934.html

展开阅读全文

4 评论

留下您的评论.