【Spring教程32】SSM框架整合实战:从零开始学习SSM整合之功能模块开发 单元测试示例代码 PostMan接口测试示例

news2024/9/25 23:22:02

目录

  • 1 功能模块开发
    • 1.1 步骤1:创建数据库及表
    • 1.2 步骤2:编写模型类
    • 1.3 步骤3:编写Dao接口
    • 1.4 步骤4:编写Service接口和实现类
    • 1.5 步骤5:编写Contorller类
  • 2.单元测试
    • 2.1 步骤1:新建测试类
    • 2.2 步骤2:注入Service类
      • 2.3 步骤3:编写测试方法
  • 3 PostMan测试
    • 3.1 新增
    • 3.2 修改
    • 3.3 删除
    • 3.4 查询单个
    • 3.5 查询所有

欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《SSM整合配置之如何编写Mybatis SpringMVC JDBC Spring配置类》
在这里插入图片描述

前面我们已经把如何编写Mybatis SpringMVC JDBC Spring配置类进行了学习,今天主要的内容就是把这三个框架整合在一起完成功能模块开发和单元测试。

1 功能模块开发

需求:对表tbl_book进行新增、修改、删除、根据ID查询和查询所有

1.1 步骤1:创建数据库及表

create database ssm_db character set utf8;
use ssm_db;
create table tbl_book(
	id int primary key auto_increment,
	type varchar(20),
	name varchar(50),
	description varchar(255)
)
insert into `tbl_book`(`id`,`type`,`name`,`description`) values (1,'计算机理
论','Spring实战 第五版','Spring入门经典教程,深入理解Spring原理技术内幕'),(2,'计算机理
论','Spring 5核心原理与30个类手写实践','十年沉淀之作,手写Spring精华思想'),(3,'计算机理
论','Spring 5设计模式','深入Spring源码刨析Spring源码中蕴含的10大设计模式'),(4,'计算机
理论','Spring MVC+Mybatis开发从入门到项目实战','全方位解析面向Web应用的轻量级框架,带你
成为Spring MVC开发高手'),(5,'计算机理论','轻量级Java Web企业应用实战','源码级刨析
Spring框架,适合已掌握Java基础的读者'),(6,'计算机理论','Java核心技术 卷Ⅰ 基础知识(原书
第11版)','Core Java第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新'),(7,'计算
机理论','深入理解Java虚拟机','5个纬度全面刨析JVM,大厂面试知识点全覆盖'),(8,'计算机理
论','Java编程思想(第4版)','Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉'),
(9,'计算机理论','零基础学Java(全彩版)','零基础自学编程的入门图书,由浅入深,详解Java语言
的编程思想和核心技术'),(10,'市场营销','直播就这么做:主播高效沟通实战指南','李子柒、李佳
奇、薇娅成长为网红的秘密都在书中'),(11,'市场营销','直播销讲实战一本通','和秋叶一起学系列网
络营销书籍'),(12,'市场营销','直播带货:淘宝、天猫直播从新手到高手','一本教你如何玩转直播的
书,10堂课轻松实现带货月入3W+');

1.2 步骤2:编写模型类

public class Book {
	private Integer id;
	private String type;
	private String name;
	private String description;
	//getter...setter...toString省略
}

1.3 步骤3:编写Dao接口

public interface BookDao {
	// @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
	@Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
	public void save(Book book);
	@Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
	public void update(Book book);
	@Delete("delete from tbl_book where id = #{id}")
	public void delete(Integer id);
	@Select("select * from tbl_book where id = #{id}")
	public Book getById(Integer id);
	@Select("select * from tbl_book")
	public List<Book> getAll();
}

1.4 步骤4:编写Service接口和实现类

@Transactional
public interface BookService {
	/**
	* 保存
	* @param book
	* @return
	*/
	public boolean save(Book book);
	/**
	* 修改
	* @param book
	* @return
	*/
	public boolean update(Book book);
	/**
	* 按id删除
	* @param id
	* @return
	*/
	public boolean delete(Integer id);
	/**
	* 按id查询
	* @param id
	* @return
	*/
	public Book getById(Integer id);
	/**
	* 查询全部
	* @return
	*/
	public List<Book> getAll();
}
@Service
public class BookServiceImpl implements BookService {
	@Autowired
	private BookDao bookDao;
	
	public boolean save(Book book) {
		bookDao.save(book);
		return true;
	}
	
	public boolean update(Book book) {
		bookDao.update(book);
		return true;
	}
	
	public boolean delete(Integer id) {
		bookDao.delete(id);
		return true;
	}
	
	public Book getById(Integer id) {
		return bookDao.getById(id);
	}
	
	public List<Book> getAll() {
		return bookDao.getAll();
	}
}

说明:

  • bookDao在Service中注入的会提示一个红线提示,为什么呢?
    • BookDao是一个接口,没有实现类,接口是不能创建对象的,所以最终注入的应该是代理对象
    • 代理对象是由Spring的IOC容器来创建管理的
    • IOC容器又是在Web服务器启动的时候才会创建
    • IDEA在检测依赖关系的时候,没有找到适合的类注入,所以会提示错误提示
    • 但是程序运行的时候,代理对象就会被创建,框架会使用DI进行注入,所以程序运行无影响。
  • 如何解决上述问题?
    • 可以不用理会,因为运行是正常的
    • 设置错误提示级别
      在这里插入图片描述

1.5 步骤5:编写Contorller类

@RestController
@RequestMapping("/books")
public class BookController {
	@Autowired
	private BookService bookService;
	@PostMapping
	public boolean save(@RequestBody Book book) {
		return bookService.save(book);
	}
	@PutMapping
	public boolean update(@RequestBody Book book) {
		return bookService.update(book);
	}
	@DeleteMapping("/{id}")
		public boolean delete(@PathVariable Integer id) {
	return bookService.delete(id);
	}
	@GetMapping("/{id}")
	public Book getById(@PathVariable Integer id) {
		return bookService.getById(id);
	}
	@GetMapping
	public List<Book> getAll() {
		return bookService.getAll();
	}
}

对于图书模块的增删改查就已经完成了编写,我们可以从后往前写也可以从前往后写,最终只需要能
把功能实现即可。
接下来我们就先把业务层的代码使用Spring整合Junit的知识点进行单元测试:

2.单元测试

2.1 步骤1:新建测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {
}

2.2 步骤2:注入Service类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {
@Autowired
private BookService bookService;
}

2.3 步骤3:编写测试方法

我们先来对查询进行单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {
@Autowired
private BookService bookService;
@Test
public void testGetById(){
Book book = bookService.getById(1);
System.out.println(book);
}
@Test
public void testGetAll(){
List<Book> all = bookService.getAll();
System.out.println(all);
}
}

根据ID查询,测试的结果为:
在这里插入图片描述
查询所有,测试的结果为:
在这里插入图片描述

3 PostMan测试

3.1 新增

http://localhost/books

{
"type":"类别测试数据",
"name":"书名测试数据",
"description":"描述测试数据"
}

在这里插入图片描述

3.2 修改

http://localhost/books

{
"id":13,
"type":"类别测试数据",
"name":"书名测试数据",
"description":"描述测试数据"
}

在这里插入图片描述

3.3 删除

http://localhost/books/14

在这里插入图片描述

3.4 查询单个

http://localhost/books/1
在这里插入图片描述

3.5 查询所有

http://localhost/books

在这里插入图片描述

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

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

相关文章

单播、多播、广播、组播、泛播、冲突域、广播域、VLAN概念汇总

1 引言 “多播”可以理解为一个人向多个人&#xff08;但不是在场的所有人&#xff09;说话&#xff0c;这样能够提高通话的效率。如果你要通知特定的某些人同一件事情&#xff0c;但是又不想让其他人知道&#xff0c;使用电话一个一个地通知就非常麻烦&#xff0c;而使用日常…

软件企业在什么情况下需要找第三方软件测试机构?如何收费?

近年来&#xff0c;随着软件行业的迅猛发展&#xff0c;软件企业对软件测试的需求也越来越大。为了保证软件的质量和稳定性&#xff0c;许多企业选择寻找第三方软件测试机构来进行软件测试。第三方软件测试机构是独立于软件开发企业的专业机构&#xff0c;主要从事软件测试和质…

5252D 5G基站测试仪

01 5252D 5G基站测试仪 产品综述&#xff1a; 5252D多通道综测仪打破了信号发生器进行信号发射、频谱分析仪进行观看频域波形的测试方案&#xff0c;将信号收发融为一体&#xff0c;推动无线通信测试进入全新时代。其独具的多通道收发一体、高性能、全方位测试能力及直观操作…

如何在小程序中添加字符

随着移动互联网的普及&#xff0c;微信小程序已经成为众多商家的首选。通过微信小程序&#xff0c;商家可以展示产品、服务和品牌形象。那么如何在微信小程序中添加视频内容呢&#xff1f;本文将详细介绍操作步骤。 首先&#xff0c;商家需要登录乔拓云平台&#xff0c;进入门店…

计算机操作系统学习笔记

一、什么是操作系统 1、概念 操作系统&#xff08;operating system&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。 …

机器学习之逻辑回归,一文掌握逻辑回归算法知识文集

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

路由跳转传递参数注意事项,查询字符串传参,params传参需要注意的地方,菜单内容的二级内容 vue3

路由跳转和传参(vue3)_vue3路由传参-CSDN博客 注意&#xff1a; import {useRouter} from "vue-router"const routeruseRouter()1.查询字符串传参&#xff0c;传一个对象&#xff0c;对象里面可以写path字段 router.push({path:/item,query:{id:1}} ) 通过当前路由…

嵌入式中GPIO的工作原理-面试工作必会技能

GPIO工作方式 1、4种输入模式 输入浮空输入上拉输入下拉模拟输入 如下图为GPIO的基本结构&#xff0c;它主要由4部分组成&#xff0c;其中我们所看到的的最右边的I/O引脚&#xff0c;也就是芯片外接可看到的引脚&#xff0c;其它的部分都是GPIO内部的结构。 ①保护二极管 保护…

德人合科技 | 公司电脑文件加密系统

公司电脑文件加密系统是一种可以对电脑文件进行加密的保护机制。它使用驱动层透明加密技术&#xff0c;能够在用户无感知的情况下对文件进行加密&#xff0c;从源头上保障数据安全和使用安全。 PC端访问地址&#xff1a; www.drhchina.com 此类系统主要有以下几个特点和功能&a…

轻度听力损失的儿童需要早期干预吗?

一些宝宝在做听力筛查时总是不通过&#xff0c;进一步听力诊断发现宝宝有轻度的听力损失&#xff0c;刚知道这个消息时&#xff0c;家长可担心了&#xff0c;总想着宝宝是不是听不到啊&#xff1f;但是一段时间后&#xff0c;有些家长又会忽略宝宝的听力问题&#xff0c;因为部…

【Matlab算法】随机梯度下降法 (Stochastic Gradient Descent,SGD) (附MATLAB完整代码)

随机梯度下降法 前言正文代码实现可运行代码结果 前言 随机梯度下降法 (Stochastic Gradient Descent&#xff0c;SGD) 是一种梯度下降法的变种&#xff0c;用于优化损失函数并更新模型参数。与传统的梯度下降法不同&#xff0c;SGD每次只使用一个样本来计算梯度和更新参数&am…

Nginx主配置文件详解【笔记】

1 Nginx配置文件目录结构 最近使用Nginx做负载均衡&#xff0c;顺便整理Nginx配置文件笔记如下所述&#xff0c;本文主要梳理主配置文件各属性的作用。使用yum安装好Nginx后&#xff0c;可以在默认路径&#xff08;/etc/nginx&#xff09;看到如下配置文件。 /etc/nginx/ ├─…

layui 树组件tree 通过API获取数据

一、简单 var treedata[];tree.render({elem: #addLeftType,id: demoId,data: treedata,showCheckbox: true,oncheck: function(obj){console.log(obj.data); // 得到当前点击的节点数据console.log(obj.checked); // 节点是否被选中console.log(obj.elem); // 得到当前节点元素…

diffusers-Inpainting

原文链接&#xff1a;添加链接描述 白色mask区域仅使用生成出来的&#xff0c;非白色mask区域使用原始影像&#xff0c;但是图像有点不平滑 import PIL import numpy as np import torchfrom diffusers import AutoPipelineForInpainting from diffusers.utils i…

一文为您解决:Ozon服装尺码表怎么上?Ozon富文本图片怎么处理等产品优化问题

近日&#xff0c;不少Ozon卖家反馈在编辑产品时遇到&#xff1a;中俄服装/鞋类尺码不匹配、富文本文案及图片编辑较繁琐、详描图片质量不佳、富文本图片上传效率慢等问题。 针对以上问题&#xff0c;妙手ERP在Ozon采集箱及在线产品的产品编辑模块优化了以下功能&#xff0c;全…

了解C++工作机制

基于hello.cpp对C的运行进行一个初步认识&#xff0c;并介绍国外C大佬Cherno常用的项目结构和调试Tips C是如何工作的 C工作流程1.实用工程&#xff08;project&#xff09;结构&#xff08;1&#xff09;Microsoft Visual Studio2022新建项目后&#xff0c;自动生成的原始文件…

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

脉冲水表计量方法有哪些?

随着社会的发展和人们对资源的需求不断增长&#xff0c;水资源的有效利用显得尤为重要。而水表作为测量家庭和工业用水的关键设备&#xff0c;其准确性和稳定性对于水资源管理至关重要。本文将重点介绍水表脉冲数计量方法&#xff0c;以帮助读者更好地理解和应用水资源。 一、机…

Magnific AI:彻底改变 AI 生成图像的升级

在我最近与 Magnific AI 的讨论中&#xff0c;我不仅感到惊讶&#xff0c;而且对该工具提供的质量和可能性着迷。我发现 Magnific AI 能够转换人工智能生成的图像&#xff08;这些图像通常只能以低分辨率提供&#xff09;&#xff0c;尤其令人印象深刻&#xff0c;不仅在可打印…

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用 前言 跟往期sobol区别&#xff1a; 1.sobol计算依赖于验证集样本&#xff0c;无需定义变量上下限。 2.SW-ELM自带激活函数&#xff0c;计算具有phi&#xff08;x&#xff09;e^x激…