目录
- 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 评论