【基础篇】五、基于SpringBoot来整合SSM的案例(上)

news2024/9/27 17:24:30

文章目录

  • 0、创建模块
  • 1、实体类的快速开发Lombok
  • 2、数据层开发(CRUD)
  • 3、分页
  • 4、条件查询
  • 5、业务层的标准开发
  • 6、业务层的快速开发(基于MyBatisPlus)
  • 7、表现层开发

接下来在SpringBoot下,把Spring、SpringMVC、MyBatis整合在一起,来实现一个简单的增删改查。

请添加图片描述

0、创建模块

创建新模块,勾选spring-web(SpringMVC)以及MySQL的驱动,再手动导入MyBatisPlus以及Druid的依赖坐标:

在这里插入图片描述

1、实体类的快速开发Lombok

Lombok,一个Java类库,提供了一组注解,用来简化POJO实体类开发。

<!-- 不用指定版本,lombok在SpringBoot的管理范围之内 -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

表结构:

在这里插入图片描述

实体类:

@Data
public class Book {
	private Integer id;
	private String type;
	private String name;
	private String description;
}

@Data包括了get/set方法,toString方法,hashCode方法,equals方法等,但不包括有参和无参构造。

2、数据层开发(CRUD)

导入MyBatisPlus与Druid对应的starter:

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.3</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.2.6</version>
</dependency>

配置数据源与MyBatisPlus对应的基础配置

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?servierTimezone=UTC
      username: root
      password: root
mybatis-plus:
  global-config:
    db-config:
      table-prefix: t_ # 表名和实体类相比,表名的前缀,如此就不用再实体类中加注解指定表名了
      id-type: auto # id生成策略使用数据库自增策略(和我数据库中设置的保持一致)
			        # 否则插入数据时MP使用雪花算法生成一个id

继承BaseMapper并指定泛型:

//要么在mapper中加@Mapper,要么去启动类加@MapperScan
@Mapper  
public interface BookDao extends BaseMapper<Book> {
}

为方便调试可以开启MyBatisPlus的日志,StdOutImpl即标准输出,即打印到控制台上

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

单元测试看效果:

@SpringBootTest
public class BookDaoTest {

	@Autowired
	private BookDao bookDao;
	
	@Test
	void testSave() {
		Book book = new Book();
		book.setName("测试数据");
		book.setType("测试类型");
		book.setDescription("测试描述数据");
		bookDao.insert(book);
	}
	...
}

3、分页

分页操作需要设定分页对象IPage,其实现类为Page

@Test
void testGetPage(){
	IPage<Book> page = new Page<>(1,5);
	bookDao.selectPage(page,null);
}

IPage对象中封装了分页操作中的所有数据,包括:

  • 数据
  • 当前页码值
  • 每页数据总量
  • 最大页码值
  • 数据总量

分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现。

@Configuration
public class MpConfig {
	@Bean
	public MybatisPlusInterceptor mpInterceptor() {
		//1.定义Mp拦截器
		MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
		//2.添加具体的拦截器
		mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
		return mpInterceptor;
	}
}

4、条件查询

关于条件查询:

  • 使用QueryWrapper对象封装查询条件,此时传的table的列名
  • 推荐使用LambdaQueryWrapper对象来封装查询条件
  • 查询条件支持动态条件拼装(方法的重载)

在单元测试中分别演示下:

@Test
void testGetByCondition(){
	QueryWrapper<Book> qw = new QueryWrapper<>();
	qw.like("name","Spring");
	bookDao.selectList(qw);
}

@Test
void testGetByCondition(){
	IPage page = new Page(1,10);
	LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
	lqw.like(Book::getName,"Spring");
	bookDao.selectPage(page,lqw);
}

实际开发,从前端获取的搜索关键字,如果为null而不过滤,则 where name like %null%,因此:

@Test
void testGetByCondition(){
	String name = "Spring";
	IPage page = new Page(1,10);
	LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
	lqw.like(Strings.isNotEmpty(name),Book::getName,"Spring");  //判空,为空则不拼SQL
	bookDao.selectPage(page,lqw);
}

到此,数据层的开发结束。

5、业务层的标准开发

写业务层之前,说下Mapper层和Service层接口方法名的命名,Mapper要起的偏数据库,Service则偏业务,Mapper接口的方法名看完就知道大概的SQL咋写的,Service层看方法名就知道是做啥业务的,以登录为例,如:

//Mapper
selectByUserNameAndPassword(String username,String password);
//Service
login(String username,String password);

Service层接口定义:

public interface BookService {

	boolean save(Book book);
	
	boolean delete(Integer id);
	
	boolean update(Book book);
	
	Book getById(Integer id);
	
	List<Book> getAll();
	
	IPage<Book> getByPage(int currentPage,int pageSize);
	
}

写实现类:

@Service
public class BookServiceImpl implements BookService {

	@Autowired
	private BookDao bookDao;
	
	public Boolean save(Book book) {
		return bookDao.insert(book) > 0;
	}
	
	public Boolean delete(Integer id) {
		return bookDao.deleteById(id) > 0;
	}
	
	public Boolean update(Book book) {
		return bookDao.updateById(book) > 0;
	}
	
	public Book getById(Integer id) {
		return bookDao.selectById(id);
	}
	
	public List<Book> getAll() {
		return bookDao.selectList(null);
	}
	
	public IPage<Book> getByPage(int currentPage, int pageSize) {
		IPage page = new Page<Book>(currentPage,pageSize);
		return bookDao.selectPage(page,null);
	}
}

6、业务层的快速开发(基于MyBatisPlus)

继承IService接口,泛型传入实体类,即可有上面标准开发的那些方法。另外你业务需要的定制的方法,自己接着写就行。

在这里插入图片描述

此时的实现类:注意泛型中的M和T,M传Mapper类型,T是实体类

@Service
public class BookServiceImpl2 extends ServiceImpl<BookDao,Book> implements IBookService {
}

除了基础的MP提供的方法,其余你的定制业务方法,自己加就好:

@Service
public class BookServiceImpl2 extends ServiceImpl<BookDao,Book> implements IBookService {

	@Autowired
	private BookDao bookDao;
	
	public Boolean insertSome(Book book) {
		return bookDao.insert(book) > 0;
	}
}

总结就是:

  • 使用MyBatisPlus提供有业务层通用接口(ISerivce<T>)与业务层通用实现类(ServiceImpl<M,T>)
  • 在通用类基础上做功能重载或功能追加
  • 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

7、表现层开发

基于Restful进行表现层接口开发:

@RestController
@RequestMapping("/books")
public class BookController {

	@Autowired
	private IBookService bookService;
	
	@GetMapping
	public List<Book> getAll(){
		return bookService.list();
	}

	@PostMapping
	public Boolean save(@RequestBody Book book){
		return bookService.insert(book);
	}
	
	@PutMapping
	public Boolean update(@RequestBody Book book){
		return bookService.modify(book);
	}
	
	@DeleteMapping("/{id}")
	public Boolean delete(@PathVariable Integer id){
		return bookService.delete(id);
	}

	@GetMapping("/{currentPage}/{pageSize}")
	public List<Book> getAll(@PathVariable Integer currentPage,@PathVariable Integer pageSize){
		return bookService.getPage(currentPage,pageSize).getRecords();
	}
		
}

//接口功能实现,但返回结果不统一
//待续...

这里遇到个坑,注入Service层的Bean的时候,发现有两个可用的Bean而启动失败,参考【解决:缩小Mapper扫描范围,避免产生不必要的Bean】

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

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

相关文章

项目进度管理(3-3)PERT计划评审技术详解

1 计划评审技术起源 PERT&#xff08;Program Evaluation and Review Technique&#xff0c;项目评估和审查技术&#xff09;的起源可以追溯到20世纪50年代&#xff0c;与美国国防部和美国海军的项目管理有关。 PERT的发展始于20世纪50年代初&#xff0c;当时美国国防部正面临…

ConfigMaps-2

文章目录 主要内容一.Volume 挂载 ConfigMap1.创建一个Pod&#xff0c;起挂载的内容&#xff0c;将来自下面的configmap&#xff1a;代码如下&#xff08;示例&#xff09;: 2.解释 二.环境变量 ConfigMap1.创建一个名为 mysqlpass 且包含 passwordABCabc123 的 configmap&…

第一、二题见贴图第三题 实现求1-100之间的质数?

print("模式A") while True: for i in range (1,7): for j in range(1, 7): if j < i: print(j,end"\t") print() break print() print("模式B") while True: for i in range (6,…

【测开】Java快转Python 学习路径记录

写在前面 工作后需要用python&#xff0c;记录下学习的一些资料和总结&#xff0c;仅供参考&#xff0c;希望对你有帮助。 2023/9/8 (碎碎念&#xff1a;我太懂工作要用时自己却不会的感觉了…心好累&#xff0c;问大家怎么学就说这简单…md记录一下&#xff09; Part.1 对比 …

基于Java汽车服务商城系统 设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

知识图谱(3)关系抽取

信息抽取旨在从大规模非结构化或半结构化的自然语言文本中抽取结构化信息。关系抽取是其中的重要子任务&#xff0c;主要目的是从文本中识别实体并抽取实体之间的语义关系。 比如有下面的文本&#xff1a; International Business Machines Corporation (IBM or the company) …

2019-2021年上市公司润灵ESG评分评级数据

2019-2021年上市公司润灵ESG评分评级数据 1、时间&#xff1a;2019-2021年 2、指标&#xff1a;股票代码、股票简称、评级年份、所属指数名称、GICS行业一级分类、GICS行业一级分类代码、GICS行业二级分类、GICS行业二级分类代码、GICS行业三级分类、GICS行业三级分类代码、E…

【Qt 图形视图框架】QGraphics分析及使用

组成 Qt 图形视图框架分为三部分&#xff1a;场景、视图、图元。 场景对于程序来说&#xff0c;场景是不可见的&#xff0c;是一个抽象的管理图形项的容器。 可以向场景中添加图形项&#xff0c;比如&#xff1a;圆形、矩形、三角形等等 此外&#xff0c;还可以获取场景中的某…

games101 作业2

题目 光栅化一个三角形 1. 创建三角形的 2 维 bounding box。 2. 遍历此 bounding box 内的所有像素&#xff08;使用其整数索引&#xff09;。然后&#xff0c;使用像素中心的屏幕空间坐标来检查中心点是否在三角形内。 3. 如果在内部&#xff0c;则将其位置处的插值深度值 (…

GICv3学习

GICv3学习 参考文档&#xff1a; 《corelink_gic600_generic_interrupt_controller_technical_reference_manual_100336_0106_00_en》 《IHI0069H_gic_architecture_specification》 《ECM0495013B_GIC_Stream_Protocol》 一、GICv3寄存器接口 接口如下图所示&#xff1a…

手搭手入门Mybatis-Plus配置多数据源

https://baomidou.com/ Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无…

Python 多线程概述

视频版教程 Python3零基础7天入门实战视频教程 几乎所有的操作系统都支持同时运行多个任务&#xff0c;一个任务通常就是一个程序&#xff0c;每一个运行中的程序就是一个进程。当一个程序运行时&#xff0c;内部可能包含多个顺序执行流&#xff0c;每一个顺序执行流就是一个线…

指针笔试题

目录 指针笔试题 NO1. NO2. NO3. NO4. NO5.✔ NO6. NO7. NO8.✔ 今天接着继续指针练习。&#x1f642;&#x1f642;&#x1f642; 指针笔试题 NO1. //指针的类型 //转化后的类型 //解引用访问根据指针类型访问几个字节 //整型在内存中的存储------小端存储 //*解引…

项目上线部署--》服务器部署流程(二)安装Nginx、Node.js、MySQL

阅读本篇文章前请先阅读项目上线部署--》服务器部署流程&#xff08;一&#xff09; 目录 &#x1f31f;安装Nginx 先登录远程服务器&#xff0c;安装依赖包 下载并解压包 &#x1f31f;安装Node.js 安装nodejs进程管理工具 &#x1f31f;安装MySQL &#x1f31f;写在最…

透过《眼睛的故事》:需求为何成为纪录片的“价值锚点”?

我们正处在一个内容过载、追求流量的时代。 对于观众来说&#xff0c;这是幸运的&#xff0c;也是不幸的。一方面&#xff0c;相比以前能接受到的内容指数级增长&#xff0c;自己的视野无限扩大&#xff0c;但另一方面&#xff0c;“流量思维”下粗制滥制的内容不在少数&#…

一百七十八、ClickHouse——海豚调度执行ClickHouse的.sql文件

一、目的 由于数仓的ADS层是在ClickHouse中&#xff0c;即把Hive中DWS层的结果数据同步到ClickHouse中&#xff0c;因此需要在ClickHouse中建表&#xff0c;于是需要海豚调度执行ClickHouse的.sql文件 二、实施步骤 &#xff08;一&#xff09;第一步&#xff0c;海豚建立Cl…

JavaWeb的基本概念

一、Web基本概念 Web的基本结构&#xff1a; 1.客户端的概述 1.1. 客户端的作用 与用户进行交互&#xff0c;用于接收用户的输入(操作)、展示服务器端的数据以及向服务器传递数据 1.2. 常见的客户端 PC端网页&#xff1a; 移动端&#xff1a; Iot设备&#xff1a; 2…

基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将gamma2.2和gamma1/2.2的数据分别导入到matlab进行对比&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps //…

MyBatisPlus中使用Mybatis方式操作数据库。

说明 MyBatisPlus中&#xff0c;可以使用 Mybatis 方式操作数据库。在 Mapper.xml 中&#xff0c;编写 SQL 来实现比较复杂的操作。 一般比较复杂的逻辑&#xff0c;需要多表联合查询&#xff0c;比较适合直接写SQL。 MybatisPlus比较适合单表操作。 PS&#xff1a;本示例只…

使用stelnet进行安全的远程管理

1. telnet有哪些不足&#xff1f; 2.ssh如何保证数据传输安全&#xff1f; 需求&#xff1a;远程telnet管理设备 用户定义需要在AAA模式下&#xff1a; 开启远程登录的服务&#xff1a;定义vty接口 然后从R2登录&#xff1a;是可以登录的 同理R3登录&#xff1a; 在R1也可以查…