MyBatis单元测试_动态SQL

举报
bug郭 发表于 2022/10/06 22:49:25 2022/10/06
【摘要】 大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN java领域新星创作者blog.csdn.net/bug…掘金LV3用户 juejin.cn/user/bug…阿里云社区专家博主,星级博主,developer.a...

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

单元测试

我们发现我们测个数据库的接口很少麻烦,需要通过写多层代码,然后还有通过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>标签

在if标签中一般都是一个选填项,如果有多个字段选填一般选择<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);
    }

在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。