当前位置: 首页 > news >正文

SpringBoot整合SSMP小demo

创建项目

spring web,mybatis,mysql勾选

加入mp和druid,依赖见SpringBoot基础认识_阳光明媚UPUP的博客-CSDN博客

yml数据源 

server:port: 81
spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbcusername: rootpassword: root123

写个数据表,写个domain包实体类。 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {private Integer id;private String name;private String price ;//decimal
}

写个mappr包接口@Mapper生成实现类,继承mp 

@Mapper
public interface BookMapper extends BaseMapper<Book> {
}

新增报错

//mybatis-plus默认生成的id的方式为自己自订的雪花算法
//而数据库提供的id自增的方法  yml中配置id自增的方式:设置为auto自增:id-type:auto

mybatis-plus:global-config:db-config:id-type: auto

测试用例

@SpringBootTest
class SpringbootBeginQuickstartApplicationTests {@Autowiredprivate BookMapper bookMapper;@Testvoid contextLoads() {System.out.println(bookMapper.selectById(1));System.out.println(bookMapper.insert(new Book(null,"ddd","12")));System.out.println(bookMapper.updateById(new Book(1,"update","12")));//返回值 成功1,失败0System.out.println(bookMapper.deleteById(1)); //成功1,失败0System.out.println(bookMapper.selectList(null));//mybatis-plus默认生成的id的方式为自己自订的雪花算法//而数据库提供的id自增的方法  yml中配置id自增的方式:设置为auto自增:id-type:auto}
}

开启mp日志

运行测试程序后,控制台打印sql语句和预编译参数和结果。

不开就只有结果。

mybatis-plus:global-config:db-config:id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #输出控制台

mp的分页查询

配置分页拦截: 

Mp在进行查询的时候是通过拦截器进行拼接sql语句来实现的:

我们先创建一个拦截器的包:创建一个放拦截器的配置类:MPConfig:

配置类放入引导类所在的包及子包中才能被读取加载到spring容器中:

@Configuration
public class MPConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

配置类定义详见Spring_阳光明媚UPUP的博客-CSDN博客 

会把page(1,5)拼接sql的limit

mp的Page对象

@SpringBootTest(classes = SpringbootBeginQuickstartApplication.class)
class SpringbootBeginQuickstartApplicationTests {@Autowiredprivate BookMapper bookMapper;@Testvoid contextLoads() {Page page = new Page(1, 5);System.out.println(bookMapper.selectPage(page,null));//mybatis-plus默认生成的id的方式为自己自订的雪花算法//而数据库提供的id自增的方法  yml中配置id自增的方式:设置为auto自增:id-type:autoSystem.out.println(page);//com.baomidou.mybatisplus.extension.plugins.pagination.Page@6413d7e7System.out.println(page.getCurrent());//1System.out.println(page.getSize());//5System.out.println(page.getTotal());//13System.out.println(page.getPages());//3System.out.println(page.getRecords());//[Book(id=2, name=ghet, price=78), Book(id=3, name=ddd, price=12), Book(id=4, name=ddd, price=12), Book(id=5, name=ddd, price=12), Book(id=6, name=ddd, price=12)]}
}

条件查询

使用的like %预编译拼接的sql的

@SpringBootTest(classes = SpringbootBeginQuickstartApplication.class)
class SpringbootBeginQuickstartApplicationTests {@Autowiredprivate BookMapper bookMapper;@Testvoid contextLoads() {String name="ddd";QueryWrapper<Book> qw = new QueryWrapper<>();qw.like("name", name);//实际中,name可能为null//qw.eq , qw.ne , lt , gt , le , ge , between , groupList<Book> bookList = bookMapper.selectList(qw);System.out.println(bookList);//防止参数name误写错,我们可以借助lambda表达式的Qw查询:LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();//if(name!=null)lqw.like(Book::getName,name);//方法引用:只要保证lambda的入参可用放入Book类的成员方法getName中的入参中即可。lqw.like(name != null, Book::getName, name);List<Book> books = bookMapper.selectList(lqw);System.out.println(books);}
}

对于上面分页查询后面也能拿国家qw或lqw

        System.out.println(bookMapper.selectPage(page,qw或lqw));

MP简化业务层Service层

普通service

@Service
public class BookServiceImpl implements BookService{@Autowiredprivate BookMapper bookMapper;public Boolean save(Book book){return bookMapper.insert(book)>0;}public Boolean update(Book book){return bookMapper.updateById(book)>0;}public Boolean delete(Integer id){return bookMapper.deleteById(id)>0;}public Book getById(Integer id){return bookMapper.selectById(id);}public List<Book> getAll(Integer id){return bookMapper.selectList(null);}public IPage<Book> getPage(int currentPage,int pageSize){Page page = new Page(currentPage, pageSize);bookMapper.selectPage(page,null);return page;}
}

service接口层只需继承

public interface BookService extends IService<Book> {
}

impl除了实现接口层还需继承

@Service
public class BookServiceImpl extends ServiceImpl<BookMapper,Book> implements BookService{
}

ctrl+f12勾选第一个框,即可看到里面继承的方法

mp业务层有的方法直接用,没有的接着写。尽量不与Mp的业务层方法重名,可以使用@Override进行检查有无重名覆盖。

然后就可贼测试类注入service接口并测试了。

表现层开发

@RestController//restful风格的controller
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic List<Book> getAll(){return bookService.list();}@PostMappingpublic Boolean save(@RequestBody Book book){//RequestBody接收jsonreturn bookService.save(book);}@PutMappingpublic Boolean update(@RequestBody Book book){//RequestBody接收jsonreturn bookService.updateById(book);}@DeleteMapping("/{id}")public Boolean delete(@PathVariable Integer id){//RequestBody接收jsonreturn bookService.removeById(id);}@GetMapping("/{id}")public Book getById(@PathVariable Integer id){//RequestBody接收jsonreturn bookService.getById(id);}@GetMapping("{currentPage}/{pageSize}")public IPage<Book> getPage(@PathVariable int currentPage,@PathVariable int pageSize){Page<Book> page = new Page<>(1,5);return bookService.page(page);}
}

postman测试

选择REST动作GET/...

POST/PUT请求body里面加上json数据{ "":"",  "":""}

DELETE请求路径传参/1

表现层消息一致性处理

查询返回list<user>的数据、新增返回true,修改返回true,删除返回true,分页查询返回IPage<Book>

由于:

查询id不存在的数据,返回null,查询过程中抛出异常,catch中返回null。

这时:

我们就不知道这个null,是查询数据库返回的,还是报异常返回的。

我们可以设置一个flag,如果是正常查询就返回true:如果报异常没正常查询返回false:

设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议

我们需要加一个返回结果的数据的模型类:

util包下

@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {private Boolean flag;private Object data;public R(Boolean flag) {this.flag = flag;}
}
@RestController//restful风格的controller
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic R getAll(){return new R(true,bookService.list());}@PostMappingpublic R save(@RequestBody Book book){//RequestBody接收jsonR r = new R();boolean flag = bookService.save(book);r.setFlag(flag);return r;}@PutMappingpublic R update(@RequestBody Book book){//RequestBody接收jsonreturn new R(bookService.updateById(book));}@DeleteMapping("/{id}")public R delete(@PathVariable Integer id){return new R(bookService.removeById(id));}@GetMapping("/{id}")public R getById(@PathVariable Integer id){return new R(true,bookService.getById(id));}@GetMapping("{currentPage}/{pageSize}")public R getPage(@PathVariable int currentPage,@PathVariable int pageSize){Page<Book> page = new Page<>(1,5);return new R(true,bookService.page(page));}
}

现在查询成功或失败都会有状态了。

前后端联调

先不整这块了

前后端分离结构设计中页面归属前端服务器
单体工程中页面放置在resources目录下的static目录中(建议执行clean)

异常消息处理

当抛异常就不返回R了,接着springmvc异常处理

util包下的R先加个属性private String msg;

util包下创建一个异常处理器作为springmvc异常处理器

@RestControllerAdvice
public class ProjectRxceptionAdvice {@ExceptionHandlerpublic  R doException(Exception e){//记录日志//通知运维//通知开发e.printStackTrace();return new R("服务器故障,请稍后再试");}
}

controller的某个资源随便造一个异常,postman访问测试。

相关文章:

SpringBoot整合SSMP小demo

创建项目 spring web&#xff0c;mybatis&#xff0c;mysql勾选 加入mp和druid&#xff0c;依赖见SpringBoot基础认识_阳光明媚UPUP的博客-CSDN博客 yml数据源 server:port: 81 spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:m…...

51单片机--红外遥控

文章目录 红外遥控的介绍硬件电路NEC编码外部中断红外遥控实例代码 红外遥控的介绍 红外遥控是一种无线、非接触控制技术&#xff0c;通过使用红外线来传送控制信号。它具有抗干扰能力强、信息传输可靠、功耗低、成本低、易实现等显著优点&#xff0c;因此被广泛应用于各种电子…...

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文&#xff1a;CMT&#xff08;CVPR2022&#xff09;&#xff0c;MaxViT(ECCV2022)&#xff0c;MaxViT&#xff08;ECCV2022&#xff09;&#xff0c;MPViT&#xff08;CVPR2022&#xff09;。主要是说明Transformer的局限性&#x…...

用于毫米波天线的新型无卤素超低传输损耗多层电路板R-5410

3月3日消息&#xff0c;松下公司宣布&#xff0c;其工业解决方案公司已经实现了R-5410的商业化&#xff0c;这是一种无卤素、超低传输损耗的多层电路板&#xff08;MLCB&#xff09;材料&#xff0c;适用于毫米波天线。将于2021年3月开始量产。 毫米波雷达是汽车、通信等行业的…...

java数据算法-汉诺塔

1、有三根相邻的柱子&#xff0c;标号为A,B,C。 2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。 3、现在把所有盘子一个一个移动到柱子C上&#xff0c;并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。 题解步骤 1、当n1时&#xff1b; 将1号从A移动到C即…...

[QT编程系列-35]:数据存储 - JSON格式配置数据的存储与通知

目录 1. QJsonObject 2 QJsonDocument 3 JSON本文格式 4. JSON示例 5. JASON配置文件示例 1. QJsonObject QJsonObject 是Qt的类之一&#xff0c;用于表示 JSON 对象。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0…...

【Spring】Spring 中事务的实现

目录 1.编程式事务&#xff08;手动编写代码&#xff09;2.声明式事务&#xff08;利用注解&#xff09;2.1 Transactional作用范围2.2 Transactional参数说明2.3 Transactional工作原理 3.Spring 中设置事务隔离级别3.1 事务四大特性ACID3.2 事务的隔离级别3.2 Spring中设置事…...

Linux 学习记录60(ARM篇)

Linux 学习记录60(ARM篇) 本文目录 Linux 学习记录60(ARM篇)一、SPI总线1. 概念2. 硬件连接 二、SPI总线协议三、SPI总线通信模式四、对比IIC总线和SPI总线1. 相同点2. 不同点 思维导图 一、SPI总线 1. 概念 1、SPI总结是Motorola首先提出的全双工三线/四线同步串行总线 2、采…...

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…...

校园跑腿小程序功能分享

提起校园跑腿小程序大家都不陌生&#xff0c;尤其是对上大学的伙伴们来说,更是熟悉得不能再熟悉了&#xff0c;和我们的生活息息相关&#xff0c;密不可分。 对于现在的年轻人来说&#xff0c;网购是非常简单和方便的一种购物方式&#xff0c;随之快递也会越来越多。在我们国家…...

PHP8的变量-PHP8知识详解

昨天我们讲解了PHP8的常量&#xff0c;今天讲解PHP8的变量。常量有定义常量和预定义常量&#xff0c;变量呢&#xff1f;那就没有定义变量了&#xff0c;那叫给变量赋值&#xff0c;但是还是有预定义变量的。下面就给大家讲解什么是变量、变量赋值及使用及预定义变量。 一、什么…...

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好&#xff0c;最近重新整理了一版 TCP 三次握手和四次挥手的面试题&#xff08;2023最新版&#xff09;。 ----- 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; img TCP 基本认识 TCP 头格式有哪些…...

【mysql】Win10安装配置MySQL8.0简要

下载 MySQL官网下载安装包 安装...

SQL SERVER使用发布订阅同步数据库遇到的坑

可能遇到的各种坑 1.在执行 xp_cmdshell 的过程中出错。调用 ‘CreateProcess’ 失败&#xff0c;错误代码: ‘5’ 网上有各种解决办法&#xff0c;包括改本地安全策略&#xff0c;将sql server服务的网络权限改为本机系统&#xff0c;改cmd用户的读写权限&#xff0c;退出360…...

3个命令定位CPU飙高

top 指令找出消耗CPU最厉害的那个进程的pid top -H -p 进程pid 找出耗用CPU资源最多的线程pid printf ‘0x%x\n’ 线程pid 将线程pid转换为16进制 结合jstack 找出哪个代码有问题 jstack 进程pid | grep 16进制的线程pid -A 多少行日志 jstack 进程pid | grep 16进制的线程…...

Java版知识付费 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…...

使用多数据源dynamic-datasource-spring-boot-starter遇到的问题记录

记录使用多数据源dynamic-datasource-spring-boot-starter遇到的问题&#xff1a; 1、工程启动失败 缺少clickhouse连接驱动&#xff0c;引入对应的maven依赖 <!--ck连接驱动--><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>…...

构建语言模型:BERT 分步实施指南

学习目标 了解 BERT 的架构和组件。了解 BERT 输入所需的预处理步骤以及如何处理不同的输入序列长度。获得使用 TensorFlow 或 PyTorch 等流行机器学习框架实施 BERT 的实践知识。了解如何针对特定下游任务(例如文本分类或命名实体识别)微调 BERT。为什么我们需要 BERT? 正…...

⛳ Java多线程 一,线程基础

线程基础 ⛳ Java多线程 一&#xff0c;线程基础&#x1f43e; 一&#xff0c;线程基础&#x1f4ad; 1.1&#xff0c;什么是程序&#xff0c;进程&#xff0c;线程&#x1f3ed; 1.2&#xff0c;什么是并行和并发&#x1f463; 1.3&#xff0c;线程使用的场景&#x1f3a8; 1.…...

【iOS】多线程 锁问题总结

文章目录 前言1. 你理解的多线程优点缺点 2. atomic 和 nonatomic 的区别及其作用3. GCD的队列类型 - 三种队列类型4. GCD的死锁问题5. 多线程之间的区别和联系6. 进程和线程&#xff1f;进程间的通信方式线程间的通信方式 6. iOS的线程安全手段如何保证 前言 iOS 锁和多线程的…...

求职自动化工具箱:用爬虫与状态机构建高效求职管理系统

1. 项目概述&#xff1a;一个求职者的工具箱如果你正在找工作&#xff0c;或者未来某天需要找工作&#xff0c;你大概率会和我有一样的感受&#xff1a;整个过程繁琐、重复&#xff0c;且充满不确定性。从海投简历到追踪进度&#xff0c;从准备面试到复盘总结&#xff0c;每个环…...

Windows本地部署Claude代码助手:架构解析与实战指南

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Claude-code-ChatInWindows”&#xff0c;作者是LKbaba。光看名字&#xff0c;你大概能猜到它想干什么&#xff1a;在Windows系统里&#xff0c;让Claude这个AI来帮你写代码。这听起来是不是挺酷的…...

具身智能涉及的交互技术及实施难点

在具身智能&#xff08;Embodied Intelligence, EI&#xff09;迈入规模化交付与产线落地的关键阶段 [临近时间验证, &#xff0c;它与用户为中心交互系统工程&#xff08;UCI-SE&#xff09;的融合达到了前所未有的深度 。传统机器人的交互仅限于键盘或教导盒&#xff08;Pend…...

HttpOnly Cookie 深度解析

一、什么是 HttpOnly Cookie HttpOnly 是一个可以附加在 Set-Cookie 响应头上的标志位&#xff08;flag&#xff09;。当一个 Cookie 被标记为 HttpOnly 后&#xff0c;客户端脚本&#xff08;如 JavaScript&#xff09;将无法通过 document.cookie 等 API 访问该 Cookie&…...

终极免费离线OCR解决方案:Umi-OCR完整使用指南

终极免费离线OCR解决方案&#xff1a;Umi-OCR完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。 …...

Flutter GetX实战:从Provider迁移到GetX,我的开发效率提升了多少?

Flutter GetX实战&#xff1a;从Provider迁移到GetX的效率革命 当Flutter开发团队面临状态管理方案的选择时&#xff0c;往往会陷入一种甜蜜的烦恼——官方推荐的Provider虽然稳定可靠&#xff0c;但第三方库GetX却以"全家桶"式的解决方案不断吸引开发者的目光。作为…...

QMCFLAC2MP3终极指南:免费快速解锁QQ音乐格式限制

QMCFLAC2MP3终极指南&#xff1a;免费快速解锁QQ音乐格式限制 【免费下载链接】qmcflac2mp3 直接将qmcflac文件转换成mp3文件&#xff0c;突破QQ音乐的格式限制 项目地址: https://gitcode.com/gh_mirrors/qm/qmcflac2mp3 你是否曾经在QQ音乐下载了心爱的歌曲&#xff0…...

YimMenu终极配置指南:从零开始掌握GTA V高级菜单工具

YimMenu终极配置指南&#xff1a;从零开始掌握GTA V高级菜单工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…...

碧蓝航线自动化脚本:让游戏管理变得轻松高效

碧蓝航线自动化脚本&#xff1a;让游戏管理变得轻松高效 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你是否厌倦了每天重…...

Forge模组开发效率提升:Gradle插件自动化构建与热部署实践

1. 项目概述&#xff1a;一个为Forge模组开发者准备的“瑞士军刀”如果你是一名Minecraft Forge模组的开发者&#xff0c;或者你正打算踏入这个充满创造力的领域&#xff0c;那么你大概率经历过这样的场景&#xff1a;为了测试一个简单的功能改动&#xff0c;你需要反复地执行g…...