【 SpringBoot单元测试 和 Mybatis 增,删,改 操作 】

news2025/4/26 19:24:11

文章目录

  • 一、Spring-Boot单元测试(了解)
    • 1.1 概念
    • 1.2 单元测试引用
    • 1.3 单元测试的实现
    • 1.4 简单的断言说明
    • 1.5 单元测试优点
  • 二、Mybatis 增,删,改 操作
    • 2.1 增加⽤户操作
    • 2.2 修改⽤户操作
    • 2.3 删除⽤户操作

一、Spring-Boot单元测试(了解)

1.1 概念

  1. 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类

  2. 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。执行单元测试,就是为了证明这段代码的行为和我们期望是否一致

1.2 单元测试引用

使用单元测试需要引入依赖,一般框架都已经自动注入了该依赖 !!

在这里插入图片描述

原理:

通过spring initialize创建的Spring Boot项目会在Maven中自动携带很多starter依赖,而其中就存在该测试依赖 !

在这里插入图片描述

1.3 单元测试的实现

  1. 生成单元测试的类
    在接口层中,右击鼠标点击Generate选择Test
    在这里插入图片描述

在这里插入图片描述

以下就生成了该接口的测试类,并有接口中声明方法对应的测试方法

在这里插入图片描述

  1. 配置单元测试的类
    添加 @SpringBootTest 注解,再添加业务代码
//1、必须添加以下注解:该注解表示,以下测试单元代码 是在 Spring 中运行的
@SpringBootTest
@Slf4j
class UserInfoMapperTest {
    //2、添加需要测试单个功能的代码
    @Resource
    private UserInfoMapper userInfoMapper;

    @Test
    void getUserById() {
        UserInfo userInfo = userInfoMapper.getUserById(1);
        // System.out.println(userInfo);  此时只是打印结果,无论代码是否错误,单元测试都会通过
        //以下 使用断言 来检测单元测试结果 ! 我们可以 设置 id 为确实存在于数据库的,如果测试单元不通过就说明上述功能代码存在问题
        //通过功能代码查询到的对象结果 和 Null 进行对比(还有很多其他方法,结果和True对比等),如果不为空的话,单元测试就会成功
        Assertions.assertNotNull(userInfo);
    }

注意:

  1. 必须添加 @SpringBootTest 注解:该注解表示,以下测试单元代码 是在 SpringBoot中运行的

  2. 如果使用的是科学版IDEA,在Test测试代码中使用 @Autowired 注入注解会报错因为:@Mapper来自mybatis框架,而@Autowired 来自 spring,没有兼容性。而使用JDK官方的@Resource可以

1.4 简单的断言说明

在这里插入图片描述

使用方法如上述代码 !

1.5 单元测试优点

在这里插入图片描述

上述内容只是大概认识了解下单元测试,详细内容参考这里 !


二、Mybatis 增,删,改 操作

在前面我们已经创建了第一个 mybatis 项目,并完成了简单的查询操作!后续执行的增删改操作大体步骤相似,需要更改 xml 文件中部分标签,下面我们就来学习 !

下面示例为了方便,我们就不依次完成各层书写,只需要把接口层补充完整,并完成 xml 文件的代码,再通过单元测试来验证结果 !!

注意:如果你不想破坏数据库的数据,可以使用 注解 @Transaction 进行事务回滚

2.1 增加⽤户操作

mapper 接口层实现:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserInfoMapper {
    public int addUser(UserInfo userInfo);
  }

相应的 xml 文件实现为:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 需要实现的接口的具体包名加接口名-->
<mapper namespace="com.example.demo.mapper.UserInfoMapper">

    <!-- 添加用户 此时#{}获取的参数,就是用户表中对应的属性-->
    <insert id="addUser">
        insert into userinfo(username, password, photo)
        values (#{username}, #{password}, #{photo})
    </insert>
    
</mapper>

生成对应的单元测试代码:

    @Test
    void addUser() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("guishao");
        userInfo.setPassword("526398");
        userInfo.setPhoto("default");
        int result = userInfoMapper.addUser(userInfo);
        Assertions.assertEquals(1,result);
    }

运行该测试方法,并观察结果:

在这里插入图片描述

查看数据库数据:

在这里插入图片描述

显而易见,我们成功的添加了一个用户 !!


特殊的添加:返回⾃增 id

xml 文件中的代码实现如下:

<!-- 添加用户 返回受影响的行数和自增id ! useGeneratedKeys:表示是否开起id自增
keyProperty:将自增的id值赋值给实体对象的哪个属性 keyColumn:将自增的id赋值给数据库中的哪一个字段-->
<insert id="addUser1" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
   insert into userinfo(username, password, photo)
   values (#{username}, #{password}, #{photo})
</insert>

标签说明:

  1. useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据
    库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递
    增字段),默认值:false
  2. keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列
    不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性
    名称
  3. keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值
    或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset),如果⽣成列不⽌
    ⼀个,可以⽤逗号分隔多个属性名称

2.2 修改⽤户操作

mapper 接口层实现:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserInfoMapper {
   public int updateUserById(@Param("id") Integer ID,@Param("username") String Name);
 }

相应的 xml 文件实现为:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 需要实现的接口的具体包名加接口名-->
<mapper namespace="com.example.demo.mapper.UserInfoMapper">

    <!--根据用户id 修改 姓名-->
    <update id="updateUserById">
        update userInfo
        set username = #{username}
        where id = #{id};
    </update>
    
</mapper>

生成对应的单元测试代码:

如:修改id=42的用户名为 goodman

在这里插入图片描述

@Test
void updateUserById() {
    int result = userInfoMapper.updateUserById(42,"goodman");
    Assertions.assertEquals(1,result);
}

查看数据库:

在这里插入图片描述

显而易见,我们成功修改了用户姓名 !!


2.3 删除⽤户操作

mapper 接口层实现:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserInfoMapper {
       public int delUserById(@Param("id") Integer ID);Name);
 }

相应的 xml 文件实现为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 需要实现的接口的具体包名加接口名-->
<mapper namespace="com.example.demo.mapper.UserInfoMapper">

    <!--根据用户id 删除 用户-->
    <delete id="delUserById">
        delete
        from userinfo
        where id = #{id}
    </delete>
    
</mapper>

生成对应的单元测试代码:

如删除数据库 id=42 的用户信息

在这里插入图片描述

@Test
void delUserById() {
     int result = userInfoMapper.delUserById(42);
     Assertions.assertEquals(1,result);
 }

查看数据库:

在这里插入图片描述

显而易见,我们成功的删除了 id=42 的用户信息 !!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式-day02

4&#xff0c;创建型模式 4.2 工厂模式 4.2.1 概述 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设…

找不到msvcp140d.dll vcruntime140d.dll ucrtbased.dll

找不到msvcp140d.dll vcruntime140d.dll ucrtbased.dll 找不到msvcp140d.dll vcruntime140d.dll ucrtbased.dll 找不到msvcp140d.dll vcruntime140d.dll ucrtbased.dll 链接&#xff1a;https://pan.baidu.com/s/15O9cRwexHp4nzZj8eYVfnw 提取码&#xff1a;4iyr --来自百度…

FPGA基于XDMA实现PCIE X8的HDMI视频采集 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证9、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PC…

No.044<软考>《(高项)备考大全》【第27章】运筹学计算(典型考题思路讲解)

【第27章】运筹学计算&#xff08;典型考题思路讲解&#xff09; 1 章节概述1.1 运筹学计算涉及到的题型2 最优的函数值3 线性规划题1题2题3 4 动态规划 投资收益最大的问题5 最小生成树题1题2题3 6 匈牙利法题1题2 7 最短最长路径问题题1题2题3题4题5题6题7 8 最大流量问题9 决…

Java-String类

文章目录 写在前面1 String类的常用方法1.1 字符串的构造1.2 String对象的比较1. 利用 比较是否引用同一对象2. 利用equals() 方法比较3. 利用compareTo 方法比较两个字符串的4.利用compareToIgnoreCase方法比较(忽略大小写) 1.3字符串查找1.4转化1. 数值和字符串的转化2. 大小…

关于java.io的学习记录(读取文本)

可以通过字节流&#xff08;FileInputStream&#xff09;、字符流&#xff08;InputStreamReader&#xff09;、字符缓冲流&#xff08;BufferedReader&#xff09;读取文本中的数据。 1、FileInputStream读取文本 public void read(){String path "fileTest.txt";F…

浅测SpringBoot环境中使用WebSocket(多端实时通信)

目录 概述 测试&#xff1a;前端代码 后端代码&#xff08;SpringBoot环境&#xff09; 1.创建处理器类&#xff08;用于处理连接和消息&#xff09; 2.创建配置类&#xff08;用于注册处理器类&#xff0c;开启WebSocket&#xff09; 连接测试 概述 这篇博客主要是记录测试…

怎么将图片变成圆角矩形,2种方法可供选择

怎么将图片变成圆角矩形&#xff1f;我们在一些职场工作中&#xff0c;可能会遇到需要把图片变成圆角矩形的这样的要求&#xff0c;我们能够理解公司或领导&#xff0c;这样要求的用意是为了让我们的图片展示更加美观整齐&#xff0c;让我们的用户让我们的客户看起来更加美丽整…

android:手搓一个即时消息聊天框(包含消息记录)

先看一下效果 1.后端 要实现这个&#xff0c;先说一下后端要实现的接口 1.创建会话id 传入“发送id”和“接收id”给服务端&#xff0c;服务端去创建“会话id” 比如 get请求&#xff1a;http://xxxx:8110/picasso/createSession?fromUserId1&toUserId2 返回seesionId…

RabbitMQ防止消息丢失

生产者没有成功把消息发送到MQ 丢失的原因 &#xff1a;因为网络传输的不稳定性&#xff0c;当生产者在向MQ发送消息的过程中&#xff0c;MQ没有成功接收到消息&#xff0c;但是生产者却以为MQ成功接收到了消息&#xff0c;不会再次重复发送该消息&#xff0c;从而导致消息的丢…

直播授课在线课堂学习平台的设计与实现nodejs+vue

在各学校的教学过程中&#xff0c;直播授课管理是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及&#xff0c;“基于网络的学习模式”正悄无声息的改变着传统的直播学习模式&#xff0c;“基于网络的直播教学平台”的研究和设计也成为教育技术领域的热点课题。1、…

金融数据获取:获取网站交互式图表背后的数据,Headers模拟浏览器请求,防盗链破解及Cookie验证

有时候写爬虫难免会遇上只提供一张图表却没有背后结构化数据的情况&#xff0c;尤其是金融市场数据&#xff0c;例如股票K线&#xff0c;基金净值等。笔者看了市面上主流的行情网站&#xff0c;基本都是图一这样的交互式图表&#xff0c;但这样的图表是没有办法直接拿到原始数据…

前端技术学习第八讲:VUE基础语法---初识VUE

VUE基础语法—初识VUE 一、初识VUE Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库…

如何快速白嫖一个SSL证书

首先呢&#xff0c;还是要非常感谢各大云厂商能够为白嫖党免费提供申请SSL证书的这个一个平台。 SSL证书作用不在描述&#xff0c;自行百度&#xff1f; 本篇主要从百度云、腾讯云、阿里云讨论下 阿里云 地址&#xff1a;阿里云-计算&#xff0c;为了无法计算的价值 首先需…

手写axios源码系列三:dispatchRequest发送请求

文章目录 一、dispatchRequest 发送请求代码设计思路1、创建 dispatchRequest.js 文件2、创建 adapters.js 文件3、创建 xhr.js 文件4、总结 上篇文章中介绍了创建 axios 函数对象的思路&#xff0c;在 Axios 的原型对象上声明了一个 request 方法&#xff0c;在 request 方法中…

基于Java+Springboot+vue在线版权登记管理系统设计实现

基于JavaSpringbootvue在线版权登记管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

亚马逊云科技在上云旅程中不断调整和优化成本管理计划

亚马逊云科技的云财务管理旨在帮助企业建立一个成功的CFM战略&#xff1a;通过4个云财务管理CFM原则或步骤作为路线图&#xff1a;SEE-查看、SAVE-保存、PLAN-计划和RUN-运行。 对现有工作负载的预测和规划 1、 优化计算资源与架构&#xff1a; 与技术业务相关部门合作&…

Notion打不开

如果Notion打不开&#xff0c;可以尝试以下方法&#xff1a;1. 尝试Ping一下Notion的服务器&#xff0c;如果是正常的&#xff0c;但访问502了&#xff0c;那么很可能是DNS污染了。建议将DNS修改为114.114.114.114&#xff0c;再加个8.8.8.8&#xff0c;修改完成后再度访问Noti…

doccano使用记录

参考文章&#xff1a;https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/doccano.md 参考文章&#xff1a;https://github.com/doccano/doccano 参考文章&#xff1a;https://doccano.github.io/doccano/ 参考文章&#xff1a;https://zhuanlan.zhihu.com…

06 | 立迈胜电机使用问题汇总

1 前提 使用STM2832B-485-MA-0FS等 2 常见问题 2.1 操作相关 问题1&#xff1a;怎么识别到电机设备 解决方法&#xff1a; 1、电机上电&#xff0c;在通讯处&#xff0c;点击【打开】 2、设备类型选择【串口】 3、选择串口选择【对应的COM】 4、选择对应的波特率 问题2…