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

MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存

前言

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化开发、减少工作量。本文将介绍如何使用 Spring Boot 集成 MyBatis-Plus 来操作数据库,并结合 Redis 实现数据的缓存功能。

1项目搭建 

1.1 创建 Spring Boot 项目

可以通过 Spring Initializr 快速创建一个新的 Spring Boot 项目,选择必要的依赖如 Spring Web, MyBatis Plus, MySQL Driver 和 Spring Data Redis 等。

1.2 添加依赖 

pom.xml 文件中添加以下依赖:

<dependencies><!-- MyBatis-Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>1.2.18</version></dependency><!-- MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>

1.3配置文件

application.ymlapplication.properties 中配置数据库连接和 Redis 连接信息。

spring:datasource:url: jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: yourpasswordredis:host: localhostport: 6379

2开发过程

2.1 创建实体类

根据 book_tab 表结构创建对应的实体类 Book

package com.ffyc.springboot.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("book_tab")
public class Book {@TableId(value="book_id",type = IdType.AUTO)private Integer id;@TableField("book_title")private String title;@TableField("book_author")private String author;@TableField("book_price")private Double price;@TableField("book_desc")private String descx;
}

2. 2编写 Mapper 接口

使用 MyBatis-Plus 提供的 BaseMapper 快速编写 DAO 层接口。 

package com.ffyc.springboot.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ffyc.springboot.entity.Book;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface IBookMapper  extends BaseMapper<Book> {}

2.3测试方法

CURD(增删改查)的实现以及全查询,模糊查询,分页处理,缓存redis.

package com.ffyc.springboot.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ffyc.springboot.entity.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;import static org.junit.Assert.*;
//构建SpringBoot测试环境
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)public class IBookMapperTest {@Autowired//创建IBookTest的实现类private IBookMapper mapper;@Autowired//redis的操作类private StringRedisTemplate stringRedisTemplate;private ReactiveRedisOperations<Object, Object> redisTemplate;@Testpublic void testSave(){
//        Book book=new Book();将book对象放在循环之外,会加快运行速度,因为只用创造一个对象,
//        但是无法实现id的自增长,需要手动增ID,因此无法连续增长两次,会显示id重复for (int i=20;i>0;i--) {
//            book.setId(i);Book book=new Book();book.setTitle("三国"+i);book.setAuthor("测试数据吴承恩"+i);book.setPrice(99.99+i);book.setDescx("兴复汉室....");mapper.insert(book);}
//        book.setTitle("三国");
//        book.setAuthor("测试数据吴承恩");//        book.setDescx("兴复汉室");
//        book.setPrice(99.99);
//        mapper.insert(book);}@Testpublic void Update(){Book book=new Book();book.setId(1);book.setTitle("新三国");book.setAuthor("测试数据吴承恩");book.setDescx("兴复汉室");book.setPrice(99.99);mapper.updateById(book);}@Testpublic void Delete(){mapper.deleteById(1);}@Testpublic void testFindAll() {System.out.println( mapper.selectList(null));}@Testpublic  void testFindCondition() {LambdaQueryWrapper<Book> querwrapper = new LambdaQueryWrapper<>();
//        querwrapper.like(Book::getTitle, "三");querwrapper.like(Book::getAuthor,"恩").eq(Book::getTitle,"三国");System.out.println(mapper.selectList(querwrapper));}/*** 分页,从第1页开始,20条为一列*/@Testpublic void testPage() {IPage<Book> page = new Page<>();page.setCurrent(1);page.setSize(20); //limit 0,50LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();IPage<Book> bookIPage = mapper.selectPage(page, queryWrapper);System.out.println(bookIPage.getRecords());//        books.forEach(System.out::println);}@Testpublic void redisSave(){for(int i=1;i<30;i++) {Book book =mapper.selectById(i);System.out.println(book);stringRedisTemplate.opsForValue().set(String.valueOf(book.getId()), book.getTitle());//放入redis里}
//        Book book =mapper.selectById(1);
//        System.out.println(book);stringRedisTemplate.opsForValue().set(String.valueOf(book.getTitle()),book.getAuthor());
//        stringRedisTemplate.opsForValue().set(String.valueOf(book.getId()), book.getTitle());//放入redis里//        redisTemplate.opsForValue().set("name","吴承恩");
//        System.out.println(redisTemplate.opsForValue().get("name"));}}

分页的原因是解决数据量过大的问题,使用limit进行拦截

 在实现分页的时候,记得先安装分页的插件,MyBatis-Plus的分页插件PaginationInnerInterceptor提供了强大的分页功能,支持多种数据库,使得分页查询变得简洁高效。

package com.ffyc.springboot.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 分页拦截器* @ClassName MybatisplusInterceptor* @Description TODO* @Author 49354* @Date 2025/3/2 14:32* @Version 1.0*/
@Configuration  //配置,交给管家-spring
@MapperScan("com.ffyc.springboot.mapper")
public class MybatisplusInterceptor {//让管家spring帮我们造成拦截器对象@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}}

结语

通过上述步骤,我们已经完成了使用 Spring Boot 和 MyBatis-Plus 对 book_tab 表进行增删改查操作,并实现了简单的 Redis 缓存机制。MyBatis-Plus 极大地简化了我们的开发流程,让我们能够更专注于业务逻辑的实现。希望这篇博客能帮助你快速上手 MyBatis-Plus 的开发。

相关文章:

MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存

前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;旨在简化开发、减少工作量。本文将介绍如何使用 Spring Boot 集成 MyBatis-Plus 来操作数据库&#xff0c;并结合 Redis 实现数据的缓存功能。 1项目搭建 1.1 创建 Spring Boot 项目 可以通过 Spring Initializr 快…...

mpi 和nccl 之间是什么关系 (来自deepseek)

MPI&#xff08;Message Passing Interface&#xff09;和 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;都是用于并行计算和分布式计算的通信库&#xff0c;但它们的应用场景和设计目标有所不同。 MPI 设计目标&#xff1a;MPI 是一个通用的消息传递…...

从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线

近日&#xff0c;国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患&#xff0c;引发了广泛关注。Ollama作为一款开源的大模型管理工具&#xff0c;在为用户提供便捷的同时&#xff0c;却因缺乏有效的安全管控机制&#xff0c;存在数据泄露…...

通过Docker搭个游戏——疯狂大陆(Pkland)

最近在研究我的服务器&#xff0c;在服务器上搭了很多docker的项目&#xff0c;然后找着找着发现一个能用Docker配置环境的游戏叫Pkland。 项目地址&#xff1a;GitHub - popkarthb/pkland: 疯狂大陆是一款多人在线的战略游戏。 游戏操作简捷,您仅需要使用浏览器就可以在任何时…...

hive之LEAD 函数详解

1. 函数概述 LEAD 是 Hive 中的窗口函数&#xff0c;用于获取当前行之后指定偏移量处的行的值。常用于分析时间序列数据、计算相邻记录的差异或预测趋势。 2. 语法 LEAD(column, offset, default) OVER ([PARTITION BY partition_column] [ORDER BY order_column [ASC|DESC]…...

springboot429-基于springboot的教务管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

深入理解指针与回调函数:从基础到实践

引言 在C语言中&#xff0c;指针和回调函数是两个非常重要的概念。指针为我们提供了直接操作内存的能力&#xff0c;而回调函数则为我们提供了一种灵活的编程方式&#xff0c;使得我们可以将函数作为参数传递给其他函数&#xff0c;从而实现更加模块化和可复用的代码。本文将深…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Linux:文件描述符与重定向

目录 一、文件描述符 1.文件内核对象 2.文件描述符分配原则 二、文件重定向 1.重定向的现象 输出重定向 输入重定向 dup2 2.重定向的使用 三、标准输出和标准错误 继上篇文章中&#xff0c;我们了解了fd打印的值为文件描述符&#xff0c;那么它还有什么作用呢&…...

【原创】C# HttpClient 读取流数据的问题

默认情况下HttpClient中有缓存&#xff0c;在读取流数据的时候&#xff0c;往往要等一小会儿&#xff0c;然后读出一大堆。 我们在请求OpenAI类的大模型的时候&#xff0c;往往要一边读取一边显示&#xff08;输出&#xff09;&#xff0c;这时候需要禁止HttpClient 中内置的缓…...

C# 开发工具Visual Studio下载和安装

开发环境与工具 C#的主要开发环境是Visual Studio&#xff0c;这是一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑、调试、项目管理、版本控制等功能。此外&#xff0c;Visual Studio Code也是一个轻量级的跨平台代码编辑器&#xff0c;支…...

3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

Python在机器学习与数据分析领域的深度应用:从基础到实战

在当今数字化时代&#xff0c;数据如同宝贵的矿产资源&#xff0c;蕴含着无尽的价值等待挖掘。Python作为一门强大而灵活的编程语言&#xff0c;凭借其丰富的库和工具&#xff0c;在机器学习和数据分析领域扮演着举足轻重的角色。它不仅为数据科学家和开发者提供了高效处理和分…...

网络安全ctf试题 ctf网络安全大赛真题

MISC 1 签到 难度 签到 复制给出的flag输入即可 2 range_download 难度 中等 flag{6095B134-5437-4B21-BE52-EDC46A276297} 0x01 分析dns流量&#xff0c;发现dns && ip.addr1.1.1.1存在dns隧道数据&#xff0c;整理后得到base64: cGFzc3dvcmQ6IG5zc195eWRzIQ 解…...

分布式和微服务的理解

分布式系统和微服务是现代化软件架构中两个关键概念&#xff0c;它们共同支撑了高可用、高扩展的互联网应用&#xff0c;但侧重点和解决的问题有所不同。以下是它们的核心理解&#xff1a; ​一、分布式系统&#xff08;Distributed System&#xff09;​ 定义&#xff1a; 分…...

Embedding技术:DeepWalkNode2vec

引言 在推荐系统中&#xff0c;Graph Embedding技术已经成为一种强大的工具&#xff0c;用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding&#xff1f; Graph Embedding是一种将图中的节点映射…...

基于IMM算法的目标跟踪,四模型IMM|三维环境|4个模型分别是:CV、左转CT、右转CT、CA(基于EKF,订阅专栏后可获得完整源代码)

这段MATLAB代码实现了基于交互多模型(IMM)算法的目标跟踪,结合了四种运动模型(匀速直线、左转圆周、右转圆周和匀加速直线)。通过定义状态方程、生成带噪声的测量数据,以及执行IMM迭代,该代码有效地实现了多模型的状态估计和融合。最终,用户可以通过可视化结果观察目标…...

大模型工程师日记(十三):检索增强生成(RAG)

Document loaders和Text splitters Document loaders(文档加载器) Document loaders(文档加载器) 这些类加载文档对象。LangChain与各种数据源有数百个集成&#xff0c;可以从中加载数据&#xff1a;Slack、Notion、Google Drive等。 每个文档加载器都有自己特定的参数&#…...

HOW - React 如何在在浏览器绘制之前同步执行 - useLayoutEffect

目录 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要区别总结选择建议注意事项 useLayoutEffect 使用示例测量 DOM 元素的尺寸和位置示例&#xff1a;自适应弹出框定位 同步更新样式以避免闪烁示例&#xff1a;根据内容动态调整容器高度 图像或 Canvas 绘制前的准备…...

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...

图像形成与计算机视觉基础

1. 图像形成的基本原理 图像形成是物理世界与传感器&#xff08;如胶片、CCD/CMOS&#xff09;交互的过程&#xff0c;核心是光线的传播与记录。 1.1 直接放置胶片模型 物理原理&#xff1a;物体表面反射的光线直接照射到胶片上&#xff0c;但无任何遮挡或聚焦机制。 问题&a…...

【显示】3.1 Android 从Activity到Display链路概括

目录 一,Activity上屏Flow总结 二,链路拆解 2.1 Activity 的创建和 UI 初始化 2.2 Window 和 DecorView 的创建 2.3 Surface 的创建 2.4 View 的绘制流程 2.5 Surface 的提交和合成 2.6 上屏显示 三,多个Activity的处理方式 一,Activity上屏Flow总结 Activity → s…...

【leetcode hot 100 240】搜索二维矩阵Ⅱ

解法一&#xff1a;直接查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i0; i<matrix.length; i){for(int j0; j<matrix[0].length; j){if(matrix[i][j]>target){break;}if(matrix[i][j]target){return true;}}}return fal…...

Spring Boot 缓存最佳实践:从基础到生产的完整指南

Spring Boot 缓存最佳实践&#xff1a;从基础到生产的完整指南 引言 在现代分布式系统中&#xff0c;缓存是提升系统性能的银弹。Spring Boot 通过 spring-boot-starter-cache​ 模块提供了开箱即用的缓存抽象&#xff0c;但如何根据业务需求实现灵活、可靠的缓存方案&#xf…...

Ubuntu20.04双系统安装及软件安装(一):系统安装

Ubuntu20.04双系统安装及软件安装&#xff08;一&#xff09;&#xff1a;系统安装 Ubuntu系统卸载Ubuntu20.04安装BIOS进入系统安装 许久没写博客了&#xff0c;今天开始重新回归了。首先记录我在双系统上重装Ubuntu20.04的安装过程记录以及个人见解。 Ubuntu系统卸载 参考双…...

Linux14-io多路复用

UDP:单循环服务器,服务器同一时刻只能响应一个客户端的请求 TCP:并发服务器,服务器同一时刻只能响应多个客户端的请求 一、构建TCP并发服务器 让TCP服务端具备同时响应多个客户端的能力。 1.多进程 资源消耗大,同资源平台下,并发量小。 2.多线程 创建线程、进程,比…...

【人工智能学习之优化为什么会失败】

【人工智能学习之优化为什么会失败与方案建议】 一、优化为什么会失败&#xff1f;1. 局部极小值和鞍点2. 梯度消失/爆炸&#xff08;Vanishing/Exploding Gradients&#xff09;2. 病态条件&#xff08;Ill-Conditioning&#xff09;3. 参数初始化不当4. 学习率不当5. 过拟合&…...

flask学习2-应用(博客)

flask学习2-应用(博客) 项目目录应用程序工厂连接到数据库建表初始化数据库文件蓝图和视图第一个视图:注册注册登录根据用户id查询用户注销模板基本布局注册登录注册用户静态文件博客蓝图索引创建更新-根据id查询更新-根据id更新删除使项目可安装描述项目安装项目测试覆盖率…...

Next.js项目实战-ai助手帮我写文章发布视频第1节(共89节)

&#x1f602;Ai在国内外已经杀疯了&#xff0c;老板要求我们把速度再提升快一些&#xff0c;哪怕是几秒&#xff0c;几百毫秒也行&#xff5e;现在&#xff0c;马上就要&#xff0c;就地就要&#xff0c;只好搬出前端服务端(大保健)&#x1f613;。没错&#xff0c;今天我要分…...

探秘Transformer系列之(9)--- 位置编码分类

探秘Transformer系列之&#xff08;9&#xff09;— 位置编码分类 文章目录 探秘Transformer系列之&#xff08;9&#xff09;--- 位置编码分类0x00 概述0x01 区别1.1 从直观角度来看1.2 从模型处理角度来看1.3 优劣 0x02 绝对位置编码2.1 基础方案2.2 训练式2.3 三角函数式2.4…...