MyBatis单元测试_动态SQL
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug…
- 掘金LV3用户 juejin.cn/user/bug…
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug…
- 华为云云享专家 bbs.huaweicloud.com/bug…
单元测试
我们发现我们测个数据库的接口很少麻烦,需要通过写多层代码,然后还有通过postman工具,进行操作验证结果!
此时我们介绍一个更简单的测试数据库接口的方法,单元测试
- 可以非常简单直观快速的测试某一功能是否正确
- 使用单元测试可以帮我们在打包的时候发现一些问题!因为在打包之前所有单元测试都必须通过,否则打包失败!
- 使用单元测试,在测试功能的时候可以不污染数据库,也就是可以不对数据库任何修改的情况下进行测试
添加单元测试的依赖
一般SpringBoot
项目都会内置这个依赖!
生成单元测试的类
对应的Test
位置就生成了一个测试类!
配置单元测试的类添加@SpringBootTest注解,添加单源测试的业务代码
这里的代码编写和我们正常的代码一样就是先配置属性,调用这个接口方法!
运行结果如下:
可以很直观的看到结果!
简单断言说明
刚刚不是说不污染数据库,还有啥没测试过,就会报错嘛,咱也没看到报错呀!
我们需要用到断言进行辅助
添加@Transactional注解实现回滚!
我们虽然进行成功了这条测试!但是我们的数据库中的信息没有改变,这就是@Transaction
注解的作用类似于事务回滚达到不污染数据库!
动态SQL使用
动态SQL是MyBatis的强大之处,能够完成不同条件的SQL拼接!
<if>
标签
这个
if
标签的使用场景,就是在一些注册界面中,有些字段是必填的,而有些字段信息是非必填的,而这样的情况我们要将注册信息保存的数据库中不可能写多个SQL接口吧,这样的排列组合这么多,这不得类似,所以就有了if
标签实现动态SQL
<!--添加文章!-->
<insert id="addArticle">
insert into articleinfo
(<if test="id != null">
id,
</if>
title,
<if test="content != null">
content,
</if>
uid
)values(
<if test="id != null">
#{id},
</if>
#{title},
<if test="content != null">
#{content},
</if>
#{uid}
)
</insert>
测试
@Test
void addArticle() {
ArticleInfo article = new ArticleInfo();
article.setTitle("C++学习");
article.setUid(1);
article.setContent("STL");
Integer result = userMapper.addArticle(article);
Assertions.assertEquals(1,result);
}
这样就实现了多态SQL!
<trim>
标签
在i
f
标签中一般都是一个选填项,如果有多个字段选填一般选择<trim>
标签!
结合<if>
标签,对多个字段都采取动态生成!
<trim>
下的一些属性
prefix
: 表示整个语句块,以prefix
值作为前缀suffix
:表示整个语句块,以suffix
作为后缀prefixOverrides
:表示整个语句块要去除的前缀suffixOverrides
:表示整个语句块要去除的后缀
<!--添加文章!-->
<insert id="addArticle">
insert into articleinfo
<!--我们可以将括号放在trim 的prefix suffix中,然后通过prefixOverrides 去掉前后无效空格-->
<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
<if test="id != null">
,id,
</if>
<if test="title !=null">
title,
</if>
<if test="content != null">
content,
</if>
<if test="uid != null">
uid,
</if>
</trim>
values
<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
<if test="id != null">
,#{id},
</if>
<if test="title != null">
#{title},
</if>
<if test="content != null">
#{content},
</if>
<if test="uid != null">
#{uid},
</if>
</trim>
</insert>
<where>
标签
当我们进行用户查询时,如果输入了条件限制,就需要添加where标签,如果没有限制那就查询整张表的内容,所以这里的
where
可以通过<where>
标签进行操作!
<select id="getAll" resultMap="com.example.demo.mapper.UserMapper.baseMap">
select * from userinfo
<where>
<if test="username!=null">
username = #{username}
</if>
</where>
</select>
这里可以通过<trim>
标签代替prefix="where"
, prefixOverrides="and"
代替!
<set>
标签
<set>
标签一般用于修改SQL语句中!
<update id="updateAritcle">
update articleinfo
<set>
<if test="title!= null">
title = #{title},
</if>
<if test="content!= null">
content= #{content}
</if>
<where>
<if test="id!=null">
id = #{id}
</if>
<if test="uid!=null">
and uid = #{uid}
</if>
</where>
</set>
</update>
这里的set标签也可以用<trim>
标签完成!<trim prefix = "set" suffixOverride=",">
<foreach>
标签
对集合进行遍历,使用该标签!
collection
:判定方法参数中的集合,如List,Set,Map或者数组item
:遍历时的每一个对象open
:语句块开始的字符串close
:语句块结束的字符串separator
:每次遍历时的间隔字符串
例如通过多个文章id删除文章!
delete id="deleteByIds">
delete from articleinfo where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
删除5到10
@Test
void deleteByIds() {
List<Integer> table = new LinkedList<>();
for (int i = 5; i <=10; i++) {
table.add(i);
}
userMapper.deleteByIds(table);
}
- 点赞
- 收藏
- 关注作者
评论(0)