前言:
大家好,我是良辰丫,今天我们来学习一下MyBatis中动态sql的使用,带着疑惑走进我们今天的学习! ! !💌💌💌
🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
目录
- 1. 初识动态SQL
- 2. if标签
- 2.1 原始的插入语句
- 2.2 加入if的插入数据
- 3. trim标签
- 4. where标签
- 5. set标签
- 6. foreach标签
1. 初识动态SQL
官方给的动态SQL的概念
- 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
- 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
- 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
链接: 官方动态sql链接描述
通俗来讲,
动态sql
就是根据不同的条件生成不同的sql语句,本质还是sql语句,只是我们可以在sql层面,去执行一个逻辑代码。动态sql就是在拼接sql语句,我们只要保证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>
单元测试
@Test
void 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>
@Test
void 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>
@Test
void 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>
@Test
void 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>
@Test
void update() {
Stu stu = new Stu();
stu.setId(1);
stu.setName("李四");
stu.setAge(18);
stuMapper.update(stu);
}
注意:
我们上面语句中,age结束语可以加逗号,因为set标签会自动去处最后一个英文逗号.
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>
@Test
void del() {
List<Integer> list = new ArrayList<>();
list.add(15);
list.add(16);
list.add(17);
stuMapper.del(list);
}
后序:
看到这里,想必大家对动态sql有了一定的认识和了解,同时呢,我们的MyBatis到这里也就结束了,再次说明一下哈,MyBatis学习要多操作,其实并不难,多加练习即可.好了,我们下一篇文章再见! ! !🧃🧃🧃