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

目录

  • 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Linux Docker中部署RStudio Server,实现高效远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装RStudio Server二. 本地访问三. Linux 安装cpolar四. 配置RStudio serv…

数字化时代的智能支持:亚马逊云科技轻量应用服务器技术领先

轻量应用服务器是一种简化运维、门槛低的弹性服务器&#xff0c;它的"轻"主要体现在几个方面&#xff1a;开箱即用、应用优质、上手简洁、投入划算、运维简便以及稳定可靠。相较于普通的云服务器&#xff0c;轻量应用服务器简化了云服务的操作难度、使用和管理流程&a…

深入理解 Rust 中的容器类型及其应用

Rust 作为一种系统编程语言&#xff0c;提供了丰富的容器类型来处理各种数据结构和算法。这些容器类型不仅支持基本的数据存储和访问&#xff0c;还提供了高效的内存管理和安全性保障。本文将详细介绍 Rust 中的几种主要容器类型&#xff0c;包括它们的用法、特点和适用场景&am…

C/C++ 使用 MySQL API 进行数据库操作

C/C 使用 MySQL API 进行数据库操作 一、前言 随着信息时代的到来&#xff0c;数据库的应用日益广泛&#xff0c;MySQL 作为开源的关系型数据库管理系统&#xff0c;被广大开发者所喜爱。在 C/C 程序中&#xff0c;我们可以通过 MySQL 提供的 API 接口来连接数据库&#xff0…

MSPM0L1306例程学习-ADC部分(3)

MSPM0L1306例程学习系列 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 前边讲了4个例程&#xff0c;…

透明加密 | 半透明加密 \ 智能加密的区别

透明加密、半透明加密和智能加密都是数据加密技术&#xff0c;但它们在应用方式、加密效果和使用场景上存在一些区别。 PC端访问地址&#xff1a; www.drhchina.com 透明加密&#xff1a; 透明加密是一种强制加密技术&#xff0c;它通过文件过滤驱动透明加解密技术进行文件加…

Ubuntu 常用命令之 unzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件&#xff0c;并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中&#xff0c;zipfile是要解压的.zi…

运动器材设备企业官网的效果如何

运动器材在生活中的应用非常广泛&#xff0c;比如健身馆、公司休闲、学校、小区公园等场景中看到&#xff0c;运动器材设施品牌与种类多而齐全&#xff0c;在市场中占据着一定份额&#xff0c;同时该行业设备一般属于低价多量批发及高价零售形式&#xff0c;覆盖的行业较广。 1…

基于WEB的开放性实验室管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本开放性实验室管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

独立搭建UI自动化测试框架分享

今天给大家分享一个seleniumtestngmavenant的UI自动化&#xff0c;可以用于功能测试&#xff0c;也可按复杂的业务流程编写测试用例&#xff0c;今天此篇文章不过多讲解如何实现CI/CD&#xff0c;只讲解自己能独立搭建UI框架&#xff0c;如果有其他好的框架也可以联系我&#x…

easyexcel复杂表头导出

easyexcel复杂表头导出 /*** ClassName ColumnWidthStyleStrategy* Description: excel导出列长度**/ public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private static final int MAX_COLUMN_WIDTH 200;private final Map<Integer, Map…

[每周一更]-(第34期):Go泛型的理解和使用

泛型的实现方式有很多种&#xff0c;Go 1.18版本引入的泛型实现方式是通过type参数实现的。 在之前的Go版本中&#xff0c;由于语言本身的限制&#xff0c;泛型一直是Go语言的一个痛点和缺陷。程序员通常会使用接口和类型断言来实现泛型&#xff0c;但这种方法有时会导致代码难…

哪些行业装配柔性线路板 (FPC)时用到UV胶水?

柔性线路板&#xff08;FPC&#xff09;因其可弯曲和轻薄的特性&#xff0c;在多种行业和应用中都有广泛的应用。以下是一些常见的行业和场景&#xff0c;它们在装配FPC时可能使用UV胶水&#xff1a; 1.电子产品制造&#xff1a; 移动设备&#xff1a;如智能手机、平板电脑和可…

在线短信变量批量编辑工具

1.打开网站 短信编辑工具 2.点击:下载模板 3.编辑后 导入表格 4.点击合成短信 5.选中后复制 ctrlc 初衷&#xff1a; 短信变量批量编辑工具是一种用于批量编辑短信变量的工具。短信变量指的是短信中的可变部分&#xff0c;比如姓名、日期、金额等内容。 使用这个工具&…

python学习笔记--异常捕获

异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数&#xff0c;出现报错{}".format(err)) except ValueError as err:print(&quo…

基于物联网云平台的大棚温湿度监控系统

我国是农业大国&#xff0c;农业生产的质量对我国具有非常重要的意义&#xff0c;受到数字化技术的重点支持&#xff0c;但仍未完全实现智能化&#xff0c;农业生产效率仍有提升空间。 將物联网云服务应用到农业环境的监控中来&#xff0c;可以更高效地管理环境状况。贝尔智能…

Jmeter压力测试简单教程(包括服务器状态监控)

前段时间公司需要对服务器进行压力测试&#xff0c;包括登录前的页面和登录后的页面&#xff0c;主要目的是测试负载均衡的实现效果。不知道是不是因为Jmeter不如loadRunner火爆还是什么&#xff0c;网上关于Jmeter的资料有很多但是大多千篇一律&#xff0c;要么简单弄个页面测…

数据结构学习 leetcode64最小路径和

动态规划 题目&#xff1a; 建议看这里&#xff0c;有这道题详细的解析。我觉得写的挺好。 这是我在学动态规划的时候&#xff0c;动手做的一道题。 虽然我在学动态规划&#xff0c;但是我之前学了dps&#xff0c;所以我就想先用dps试着做&#xff0c;结果发现不行&#xf…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…

全网最细,Jmeter性能测试-入门级接口压测思路,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、压力测试重点关…