MyBatis-Plus标准数据层开发

news2024/12/22 22:17:36

1. 标准CRUD使用

对于标准的CRUD功能都有哪些以及MP都提供了哪些方法可以使用呢?

我们先来看张表:

功能自定义接口MP接口
新增boolean save(T t)int insert(T t)
删除boolean delete(int id)int deleteById(Serializeble id)
修改boolean update(T t)int updateById(T t)
根据ID查询T getById(int id)T selectById(Serializeble id)
查询全部List<T> getAll()List<T> selectList(Wapper<T> queryWrapper)
分页查询PageInfo<T> getAll(int page, int size)IPage<T> selectPage(IPage<T> page,Wapper<T> queryWrapper)
按条件分页查询List<T> getAll(Condition condition)IPage<T> selectPage(IPage<T> page,Wapper<T> queryWrapper)

对于这张表的方法,我们挨个来演示下:

2. 新增

在进行新增之前,我们可以分析下新增的方法:

int insert (T t)
  • T:泛型,新增用来保存新增数据

  • int:返回值,新增成功后返回1,没有新增成功返回的是0

在测试类中进行新增操作:

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;

	@Test
	void testInsert() {
		User user = new User();
		user.setUserName("奋进吧");
		user.setEmail("fengjin@dcxuexi.com");
		user.setBranchName("上海奋进吧");
		int i = userDao.insert(user);
		System.out.println(i);
	}

}

执行测试后,数据库表中就会添加一条数据。

在这里插入图片描述

在这里插入图片描述

3. 删除

在进行删除之前,我们可以分析下删除的方法:

int deleteById (Serializable id)
  • Serializable:参数类型

    • 思考:参数类型为什么是一个序列化类?

      • String和Number是Serializable的子类,
    • Number又是Float,Double,Integer等类的父类,

      • 能作为主键的数据类型都已经是Serializable的子类,
    • MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。

  • int:返回值类型,数据删除成功返回1,未删除数据返回0。

在测试类中进行新增操作:

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;


	@Test
	void  testDelete(){
		int i = userDao.deleteById(132);
		System.out.println(i);
	}

}

4. 修改

在进行修改之前,我们可以分析下修改的方法:

int updateById(T t);
  • T:泛型,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值

  • int:返回值,修改成功后返回1,未修改数据返回0

在测试类中进行新增操作:

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;
	
	@Test
	void testUpdate(){
		User user = new User();
		user.setUserId(146);
		user.setUserName("奋进吧2");
		user.setEmail("fenjinba@dcxuexi.com");
		user.setBranchName("奋进吧");
		int i = userDao.updateById(user);
		System.out.println(i);
	}
}

说明: 修改的时候,只修改实体对象中有值的字段。

5. 根据ID查询

在进行根据ID查询之前,我们可以分析下根据ID查询的方法:

T selectById (Serializable id)
  • Serializable:参数类型,主键ID的值
  • T:根据ID查询只会返回一条数据

在测试类中进行新增操作:

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;

	@Test
	void testSelectById(){
		User user = userDao.selectById(146);
		System.out.println(user.toString());
	}
}

6. 查询所有

在进行查询所有之前,我们可以分析下查询所有的方法:

List<T> selectList(Wrapper<T> queryWrapper)
  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • List:因为查询的是所有,所以返回的数据是一个集合

在测试类中进行新增操作:

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;

	@Test
	void testSelectAll(){
		List<User> userList = userDao.selectList(null);
		userList.forEach(System.out::println);
	}
}

7. Lombok

代码写到这,我们会发现DAO接口类的编写现在变成最简单的了,里面什么都不用写。反过来看看模型类的编写都需要哪些内容:

  • 私有属性
  • setter…getter…方法
  • toString方法
  • 构造函数

虽然这些内容不难,同时也都是通过IDEA工具生成的,但是过程还是必须得走一遍,那么对于模型类的编写有没有什么优化方法?就是我们接下来要学习的Lombok。

概念

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

使用步骤

步骤1:添加lombok依赖

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

注意: 版本可以不用写,因为SpringBoot中已经管理了lombok的版本。

步骤2:安装Lombok的插件

新版本IDEA已经内置了该插件,如果删除setter和getter方法程序有报红,则需要安装插件

在这里插入图片描述

如果在IDEA中找不到lombok插件,可以访问如下网站

https://plugins.jetbrains.com/plugin/6317-lombok/versions

根据自己IDEA的版本下载对应的lombok插件,下载成功后,在IDEA中采用离线安装的方式进行安装。

在这里插入图片描述

步骤3:模型类上添加注解

Lombok常见的注解有:

  • @Setter:为模型类的属性提供setter方法
  • @Getter:为模型类的属性提供getter方法
  • @ToString:为模型类的属性提供toString方法
  • @EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
  • @Data:是个组合注解,包含上面的注解的功能
  • @NoArgsConstructor:提供一个无参构造函数
  • @AllArgsConstructor:提供一个包含所有参数的构造函数

Lombok的注解还有很多,上面标识的三个是比较常用的。

@TableName(value = "platform_user")
//当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private  Integer userId;
    private  String email;
    private  String userName;
    private  String branchName;
}

说明:

Lombok只是简化模型类的编写,我们之前的方法也能用,比如有人会问:我如果只想要有userName和email的构造函数,该如何编写?

@TableName(value = "platform_user")
//当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private  Integer userId;
    private  String email;
    private  String userName;
    private  String branchName;

    public User(String userName,String email){
        this.setUserName(userName);
        this.setEmail(email);
    }
}

这种方式是被允许的。

8. 分页功能

基础的增删改查就已经学习完了,刚才我们在分析基础开发的时候,有一个分页功能还没有实现,在MP中如何实现分页功能,就是咱们接下来要学习的内容。

分页查询使用的方法是:

IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
  • IPage:用来构建分页查询条件
  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage

IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page

步骤1:调用方法传入参数获取返回值

@SpringBootTest
class SpringbootMp02CrudApplicationTests {

	@Autowired
	private UserDao userDao;

	@Test
	void testPageSelect(){
		//1 创建IPage分页对象,设置分页参数,1为当前页码,5为每页显示的记录数
		IPage<User> userIPage = new Page<>(1,5);
		//2 执行分页查询
		userIPage = userDao.selectPage(userIPage,null);
		System.out.println("当前页码值 = " + userIPage.getCurrent());
		System.out.println("一共多少页 = " + userIPage.getPages());
		System.out.println("每页显示数 = " + userIPage.getSize());
		System.out.println("一共多少条数据 = " + userIPage.getTotal());
		System.out.println("数据 = ↓↓↓↓ ");
		userIPage.getRecords().forEach(System.out::println);
	}
}

步骤2:设置分页拦截器

这个拦截器MP已经为我们提供好了,我们只需要将其配置成Spring管理的bean对象即可。

@Configuration
public class MpConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1 创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2 添加分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
    
}

步骤3:运行测试程序

在这里插入图片描述

如果想查看MP执行的SQL语句,可以修改application.yml配置文件,

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #打印SQL日志到控制台

打开日志后,就可以在控制台打印出对应的SQL语句,开启日志功能性能就会受到影响,调试完后记得关闭。

在这里插入图片描述


项目代码

  • gitee 代码下载

  • github 代码下载

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

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

相关文章

系统分析与设计 复习

文章目录系统分析与设计 复习第 1 章 系统分析与设计概述系统特性DevOps第 2 章 系统规划**系统规划步骤**规划模型诺兰模型**CMM 模型**系统规划方法战略集合转换法 SST关键成功因素法 CSF企业资源规划法 BSPCSB 三者联系和区别第 3 章系统分析系统分析概述业务流程图系统流程…

【微电网优化】萤火虫算法求解微电网优化问题【含Matlab源码 2146期】

⛄一、萤火虫算法求解微电网经济优化问题简介 利用迭代搜索法、剔除劣势策略法、逆推归纳法和最大最小优化方法[7,8,9]等均可实现博弈均衡点的求解。但当维数较大时, 这些方法可能存在搜索速度、路径和精度上的问题。萤火虫优化算法[10]由于其原理简单、参数少、易于实现、具有…

Maven中依赖无法导入的终极解决方案

maven依赖无法引入的问题解决 修改maven配置 添加阿里云的设置 阿里云云效maven官方配置指南 创建自己的maven库 jdk的导入设置 阿里云仓库官网 仓库服务 (aliyun.com) jar包下载所在位置 在命令终端进行jar包的引入 mvn install:install-file -Dfilejar包所在路径…

【SQLite】二、SQLite 和 HeidiSQL 的安装

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;浙江某公司软件工程师&#xff0c;负责开发管理公司OA、CRM业务系统&#xff0c;全栈领域优质创作者&#xff0c;CSDN学院、蓝桥云课认证讲师&#xff0c;开发过20余个前后端分离实战项目&#xff0c;主要发展方向为Vue…

生物素标记试剂:(1458576-00-5,1802908-00-4)Biotin-PEG4-alkyne,Dde-生物素-四聚乙二醇-炔

一、Biotin-PEG4-alkyne 【中文名称】生物素-四聚乙二醇-炔&#xff0c;生物素-四聚乙二醇-丙炔基 【英文名称】 Biotin-PEG4-alkyne 【CAS】1458576-00-5 【分子式】C21H35N3O6S 【分子量】457.58 【纯度】95% 【外观】 淡黄色或白色固体 &#xff08;具体由其分子量大小决定…

web前端网页制作课作业:用DIV+CSS技术设计的静态网站【四大名著】中国传统文化主题题材设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

深入ftrace uprobe原理和功能介绍

上一章我们学习了&#xff0c;kprobe 可以实现动态内核的注入&#xff0c;基于中断的方法在任意指令中插入追踪代码&#xff0c;并且通过 pre_handler/post_handler去接收回调。另一个 kprobe 的同族是 kretprobe&#xff0c;只不过是针对函数级别的内核监控&#xff0c;根据用…

Arduino开发实例-RCWL0516微波雷达传感器驱动

RCWL0516微波雷达传感器驱动 接近感应是入侵警报、电灯开关以及其他家庭和工业自动化应用的常见应用。 电子工业中使用了多种接近检测方法。 最常见的方法是使用 PIR 传感器,它可以感应由温暖的身体引起的环境红外辐射的变化。 其他常见的方法包括使用反射的超声波或光束,其…

关于 SAP HANA 数据库的死锁问题(deadlock)

一个朋友在我的知识星球里提问&#xff1a; hana数据库发生死锁后&#xff0c;会自动解开吗&#xff1f;还是会等着自动超时后报错。 笔者在 15 年的 SAP 开发生涯中对 HANA 数据库接触得比较少&#xff0c;这里只能根据网络上搜索出的一些材料来回答。 首先&#xff0c;如果是…

YoC的使用

1 YoC的使用 参考地址 https://mp.csdn.net/mp_blog/analysis/article/all CB2201是基于CH2201的物联网应用开发板&#xff0c;开发板提供丰富的接口&#xff0c;满足应用的需求。基于该开发板&#xff0c;YoC 提供多种应用场景的开发示例&#xff0c;通过示例可以快速应用于…

卷出头了,终于学完阿里架构师推荐 413 页微服务分布式架构基础与实战笔记

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

可视化大屏--响应式适配解决方案flexible.js

响应式适配解决方案flexible.js 最近公司开了第二个项目&#xff0c;是一个可视化大屏。 那么&#xff0c;在可视化大屏的基础上&#xff0c;我们肯定是要适配所有的屏幕设备&#xff0c;不能出现一换电脑&#xff0c;样式就紊乱的情况。 so,我们也不需要自己写媒体查询了&…

第40讲:MySQL索引的语法以及基本使用

文章目录1.索引的使用语法2.索引的基本使用2.1.准备一张数据表2.2.按照如下需求为表中的字段创建索引2.3.查看创建的索引2.4.删除索引3.验证使用索引前后的执行效率1.索引的使用语法 1&#xff09;创建索引 创建索引时&#xff0c;如果不指定索引的类型&#xff0c;默认就是常…

极简示例揭示 SwiftUI 中 @ObservedObject 与 @StateObject 状态的关键区别

问题现象 话说在 SwiftUI 中视图是状态的函数,这话一点都不假。正是秉性各异的各种状态构成了 SwiftUI 视图千变万化的功能。 这里,我们将为大家揭开其中两个常用状态,即 @ObservedObject 与 @StateObject 状态之间的最关键不同,并带领大家绕过实际使用中可能出现的坑: …

秋染田野稻菽飘香 国稻种芯·中国水稻节:河北各地农业丰收

秋染田野稻菽飘香 国稻种芯中国水稻节&#xff1a;河北各地农业丰收 河北日报 &#xff08;记者郝东伟&#xff09; 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#x…

JavaIO流:模型

IO 的字面意思是读/写数据&#xff0c;IO 模型是读/写数据的方式。常用到的读/写数据方式有&#xff1a;同步阻塞 IO、同步非阻塞 IO、IO 多路复用、信号驱动、异步 IO &#xff5e; 本篇内容包括&#xff1a;Java IO 与 IO 模型、五种 IO 模型、三种 Java IO 模型。 文章目录一…

计算机组成原理期末复习第三章-2(唐朔飞)

计算机组成原理期末复习第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&am…

电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级

近年来&#xff0c;在移动互联网技术不断发展、消费电子产品制造水平提高和居民收入水平增加等因素的驱动下&#xff0c;电子元器件行业呈现蓬勃发展的态势。未来随着5G、物联网、人工智能、虚拟现实、新型显示等新兴技术与消费电子产品的融合&#xff0c;这会使得行业需求量持…

linux进程间通信-FIFO,让你全方位理解

有名管道(FIFO) 有名管道也被称为FIFO文件&#xff0c;是一种特殊的文件。由于linux所有的事物都可以被视为文件&#xff0c;所以对有名管道的使用也就变得与文件操作非常统一。 (1)创建有名管道 用如下两个函数中的其中一个&#xff0c;可以创建有名管道。 #include #include …

python项目上线

python项目上线一 购买服务器二 使用MobaXterm连接服务器三 上线图四 安装git五 安装mysql六 安装redis七 安装python八 安装uwsgi九 安装虚拟环境十 安装nginx十一 前端部署十二 后端部署12.1 git拉取代码&#xff0c;安装依赖12.2 配置数据库12.3 迁移数据库12.4 使用uwsgi启…