详细讲解MybatisPlus中的BaseMapper类中的CRUD功能(全)

目录

  • 前言
  • 1. 基本概念
  • 2. CRUD
    • 2.1 插入
    • 2.2 删除
    • 2.3 修改
    • 2.4 查询

前言

大部分CRUD都来源这个类,对此有意义剖析,方便之后的功能开发

完整的CRUD可看我之前的文章:

  1. 详细讲解MybatisPlus中的IService类中的CRUD功能(全)
  2. 详细讲解MybatisPlus中的BaseMapper类中的CRUD功能(全)

1. 基本概念

MyBatis-Plus(简称MP)是基于 MyBatis 的增强工具,在 MyBatis 的基础上提供了更多的功能和便捷的操作。

基本概念作用功能
一个泛型接口,可以通过泛型指定操作的实体类型1.提供了一组基础的数据库操作方法,包括增、删、改、查等。
2.简化了数据访问层的开发,通过继承 BaseMapper,开发者可以省去很多 CRUD 操作的重复代码。
3.通过 MyBatis-Plus 提供的通用方法,不需要手动编写 XML 映射文件,减少了配置的复杂性。
4.支持 Lambda 表达式查询,提供了更加灵活和强大的查询方式。
1.通用的 CRUD 操作: 提供了基本的增、删、改、查方法,包括插入数据、根据主键查询、根据条件查询、更新数据和删除数据等。
2.分页查询: 支持分页查询,方便处理大量数据时的分页显示。
3.条件构造器: 提供了 QueryWrapper、UpdateWrapper 等条件构造器,方便构建复杂的查询条件。
4.Lambda 表达式查询: 支持使用 Lambda 表达式进行查询,使得查询条件更加类型安全、直观。
5.逻辑删除: 支持逻辑删除,通过标记删除而不是物理删除,提高了数据安全性。
6.乐观锁: 支持乐观锁机制,用于处理并发更新时的数据一致性。
7.自动填充: 支持自动填充功能,自动填充创建时间、更新时间等字段。
8.序列主键生成: 支持序列主键的生成,方便处理主键自增的数据库。

基本的示例代码如下:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;public interface UserMapper extends BaseMapper<User> {// 无需手动编写 SQL,通过继承 BaseMapper 即可使用通用的 CRUD 方法// 可以直接使用 Lambda 表达式进行查询,例如:selectList(lambdaQueryWrapper);// 分页查询Page<User> selectPage(Page<User> page);
}

通过继承 BaseMapper 接口,开发者可以直接使用其中定义的通用方法,而无需手动编写大量的重复代码,从而提高开发效率。

对应的源码如下:

/*** Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能* <p>这个 Mapper 支持 id 泛型</p>** @author hubin* @since 2016-01-23*/
public interface BaseMapper<T> extends Mapper<T> {/*** 插入一条记录** @param entity 实体对象*/int insert(T entity);/*** 根据 ID 删除** @param id 主键ID*/int deleteById(Serializable id);/*** 根据 columnMap 条件,删除记录** @param columnMap 表字段 map 对象*/int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根据 entity 条件,删除记录** @param wrapper 实体对象封装操作类(可以为 null)*/int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);/*** 删除(根据ID 批量删除)** @param idList 主键ID列表(不能为 null 以及 empty)*/int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 根据 ID 修改** @param entity 实体对象*/int updateById(@Param(Constants.ENTITY) T entity);/*** 根据 whereEntity 条件,更新记录** @param entity        实体对象 (set 条件值,可以为 null)* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)*/int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);/*** 根据 ID 查询** @param id 主键ID*/T selectById(Serializable id);/*** 查询(根据ID 批量查询)** @param idList 主键ID列表(不能为 null 以及 empty)*/List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 查询(根据 columnMap 条件)** @param columnMap 表字段 map 对象*/List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根据 entity 条件,查询一条记录** @param queryWrapper 实体对象封装操作类(可以为 null)*/T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询总记录数** @param queryWrapper 实体对象封装操作类(可以为 null)*/Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 entity 条件,查询全部记录** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录* <p>注意: 只返回第一个字段的值</p>** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 entity 条件,查询全部记录(并翻页)** @param page         分页查询条件(可以为 RowBounds.DEFAULT)* @param queryWrapper 实体对象封装操作类(可以为 null)*/<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录(并翻页)** @param page         分页查询条件* @param queryWrapper 实体对象封装操作类*/<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

2. CRUD

初始的搭建项目可看这篇文章:Springboot整合MybatisPlus的基本CRUD

2.1 插入

新增功能函数整体如下:

函数大致描述
int insert(T entity)插入一条记录

补充一条根据ID主键查询:T selectById(Serializable id)

代码示例如下:

    @Testpublic void test1(){User user = new User();user.setUsername("ceshi");user.setPassword("test");int insert = userMapper.insert(user);// 此行输出的是 受影响的行数System.out.println(insert);int id = user.getId();user = userMapper.selectById(id);System.out.println(user);}

截图如下:

在这里插入图片描述

2.2 删除

删除功能函数如下:

函数大致描述
int deleteById(Serializable id)根据 ID 删除
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);根据 columnMap 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper)根据 entity 条件,删除记录。@param wrapper 实体对象封装操作类(可以为 null)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)删除(根据ID 批量删除),idList 主键ID列表(不能为 null 以及 empty)

为了更好的演示功能函数,对应的数据库表格如下:

在这里插入图片描述

常用的代码如下:

    @Testpublic void test2(){/** 删除单行,* */int delete1 = userMapper.deleteById(6);// 删除了多少行System.out.println(delete1);/** 批量删除,删除第4和第5行* */List <Integer> idlist = Arrays.asList(4,5);int delete2 = userMapper.deleteBatchIds(idlist);// 删除了多少行System.out.println(delete2);/** 删除map字段值,注意此处的Map类型是<String,Object>,而不是自身两个属性的值* */Map<String,Object> map =new HashMap<>();map.put("username","map_username");map.put("password","map_password");int delete3 = userMapper.deleteByMap(map);// 删除了多少行System.out.println(delete3);QueryWrapper<User> wrapper = new QueryWrapper<User>();wrapper.eq("username","ceshi");int delete4 = userMapper.delete(wrapper);// 删除了多少行System.out.println(delete4);}

对于以上代码,其中的QueryWrapper类,可看我之前的文章:Mybatis-plus动态条件查询QueryWrapper的函数用法

截图如下所示:

在这里插入图片描述

对应的数据库最后只剩下:

在这里插入图片描述

2.3 修改

修改功能函数如下:

函数大致描述
int updateById(@Param(Constants.ENTITY) T entity)根据 ID 修改
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper)根据 whereEntity 条件,更新记录。entity 实体对象 (set 条件值,可以为 null),updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)

原本的表如下:
在这里插入图片描述

示例代码如下:

    @Testpublic void test3(){// 原本第一行是manongUser user = userMapper.selectById(1);System.out.println(user);//对user进行修改user.setUsername("user1");user.setPassword("pass1");int update1 = userMapper.updateById(user);System.out.println(update1);user = userMapper.selectById(2);user.setPassword("pass2");QueryWrapper wrapper = new QueryWrapper();// 此处可以通过like,对搜出来的大部分进行批量修改!wrapper.eq("username","yanjiuseng");int update2 = userMapper.update(user,wrapper);System.out.println(update2);}

最后的表如下:

在这里插入图片描述

2.4 查询

查询功能函数如下:

函数大致描述
T selectById(Serializable id)根据 ID 查询。id 主键ID
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)查询(根据ID 批量查询)。idList 主键ID列表(不能为 null 以及 empty)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap)查询(根据 columnMap 条件)
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 entity 条件,查询一条记录。queryWrapper 实体对象封装操作类(可以为 null)
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 Wrapper 条件,查询总记录数。queryWrapper 实体对象封装操作类(可以为 null)
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 entity 条件,查询全部记录。queryWrapper 实体对象封装操作类(可以为 null)
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录。queryWrapper 实体对象封装操作类(可以为 null)
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录。只返回第一个字段的值
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 entity 条件,查询全部记录(并翻页)。queryWrapper 实体对象封装操作类(可以为 null)
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录(并翻页)

为了更好的凸显上述函数的使用,将表中的数据改为如下:

在这里插入图片描述

示例代码如下:

    @Testpublic void test4(){//根据id主键查询数据User user = userMapper.selectById(1);System.out.println("根据id主键查询数据:");System.out.println(user);//根据querywrapper查询user = userMapper.selectOne(new QueryWrapper<User>().eq("username","yanjiuseng"));System.out.println("根据querywrapper查询:");System.out.println(user);//另外一种方式,根据 LambdaQueryWrapper 的条件查询user = userMapper.selectOne(new LambdaQueryWrapper<User>().like(User::getUsername,"yanjiuseng"));System.out.println("根据 LambdaQueryWrapper 的条件查询:");System.out.println(user);//根据id主键批量查询List<Integer> list = Arrays.asList(3,4,5);List<User> users = userMapper.selectBatchIds(list);System.out.println("根据id主键批量查询:");users.forEach(System.out::println);//通过map条件查询Map<String,Object> map = new HashMap<>();map.put("username","user6");users = userMapper.selectByMap(map);System.out.println("通过map条件查询:");users.forEach(System.out::println);//查询所有值users = userMapper.selectList(null);System.out.println("查询所有值:");users.forEach(System.out::println);}

终端输出如下所示:

在这里插入图片描述

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

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

相关文章

redis黑马点评项目启动指南(含mac m1pro | windows11 wsl2 ubuntu环境配置 持续更新中~)

redis黑马点评项目学习笔记 mac m1pro windows 含项目配置教学 mac M1pro环境配置windows11 wsl2 ubuntu 环境配置一.短信登录1. 1发送验证码1.2短信登录注册1.3登录校验拦截器补缺Cookie Session Token1.4基于redistoken认证实现短信登陆1.5完善token认证的刷新机制 2.商户查询…

Python浪漫520表白代码

系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏飘字表白代码https://want595.blog.csdn.net/article/details/1349149703无限弹窗表白代码https://want595.blog.csdn.net/article/details/1297945184跳…

springboot基础

一 springboot 1 spring 的缺点 在spring boot出现以前&#xff0c;使用spring框架的程序员是这样配置web应用环境的&#xff0c;需要大量的xml配置。下图展示了在xml配置的时代和SpringBoot的配置量的差别。 随着web项目集成软件的不断增多&#xff0c;xml配置也不断的增多&…

编程笔记 html5cssjs 026 HTML输入类型(2/2)

编程笔记 html5&css&js 026 HTML输入类型&#xff08;2/2&#xff09; 输入类型&#xff1a;date输入类型&#xff1a;color输入类型&#xff1a;range输入类型&#xff1a;month输入类型&#xff1a;week输入类型&#xff1a;time输入类型&#xff1a;datetime输入类型…

java数据结构与算法刷题-----LeetCode63. 不同路径 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

第3章-指标体系与可视化-3.3-指标体系

目录 为什么要构建指标体系 什么是指标体系 如何构建指标体系 指标库

C#编程-实现继承

C#允许您通过扩展现有类的功能以创建新类来实现继承。 从基类创建派生类 使用以下语法在C#中创建派生类: class <derived_class>:<base_class>{...}确定继承的层次结构 要确定继承层次结构,必须检查派生类与基类之间的关系种类。确保派生类是一种基类。 请考虑以…

Linux——系统安全及应用

一、基本安全措施 1、系统账号清理 常见的非登录用户账号包括bin、daemon、 adm、lp、mail等。为了确保系统安全&#xff0c;这些用户账号的登录Shell通常是/ sbin/nologin&#xff0c;表示禁止终端登录&#xff0c;应确保不被人为改动。 //将非登陆用户的Shell设为/sbin/nolo…

【Spring Cloud】组件概念详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…

2023 hnust 湖南科技大学 大四上 商务智能 课程 期末考试 复习资料

前言 《听了课就能及格》由于老师发的复习PPT内容过多&#xff08;近两万字&#xff09;&#xff0c;因此在此大幅删减由于老师透露太少&#xff0c;删减全凭主观意志&#xff0c;请谨慎参考&#xff01;&#xff01;&#xff01;猜测逻辑 过于细碎概念的不考&#xff08;不算…

【Tomcat】在一台计算机上运行两个Tomcat服务

首先把Tomcat整个文件复制一份放在其他文件夹路径中 1.修改环境变量 添加环境变量在系统变量里面 “CATALINA_HOME” 指向一个Tomcat文件夹路径 “CATALINA_HOME1” 指另一个Tomcat文件夹路径 2.修改startup里面的环境变量&#xff0c;全部修改 分别修改两个apache-tomcat…

【STM32】RTC实时时钟

1 unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区…

Linux第14步_安装FTP服务器

安装“vim编辑器”后&#xff0c;我们紧接着“安装FTP服务器”。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失败。 2、在虚拟机界面右击鼠标&#xff0c;弹出下面的对话框 3、点击“打开终端(E)”&#xff0c;得到下面的界面 &#xff1a;…

基于SpringBoot的高校毕业生离校管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的高校毕业生离校管理系统…

SQL Server 权限管理

CSDN 成就一亿技术人&#xff01; 2024年 第一篇 难度指数&#xff1a;* * CSDN 成就一亿技术人&#xff01; 目录 1. 权限管理 什么是权限管理&#xff1f; SQL server的安全机制 服务器级角色 数据库级角色 对象级角色 2. 创建用户 赋予权限 最重要的一步骤 1. 权限…

oracle和mysql怎么传输数据

传输Oracle和MySQL之间的数据可以使用多种方法&#xff0c;以下是其中两种常用的方法&#xff1a; 使用ETL工具&#xff1a;ETL工具是一种用于数据抽取、转换和加载的工具&#xff0c;可以将数据从一个数据库传输到另一个数据库。常用的ETL工具有Apache NiFi、Talend、Pentaho…

使用arm-linux-gcc出现Syntax error: word unexpected (expecting “)“)

使用arm-linux-gcc出现Syntax error: word unexpected (expecting ")") 出现这样的报错该怎么解决&#xff1f; arm-linux-gcc 1.c -o 1 /usr/local/arm/usr/local/arm/5.4.0/usr/bin/../lib/gcc/arm-none-linux-gnueabi/5.4.0/../../../../arm-none-linux-gnueabi/b…

MySQL与Oracle数据库在网络安全等级方面用到的命令

MySQL数据库命令集 查看数据库版本 SELECT VERSION(); 空口令查询 SELECT user,host,account_locked FROM mysql.user WHERE user ; SELECT * FROM mysql.user; 查询 用户的密码加密情况 SELECT HOST,USER,PLUGIN FROM mysql.user; 查询是否有空用户 SELECT host,user,plug…

henauOJ 1102: 词组缩写

题目描述 定义&#xff1a;一个词组中每个单词的首字母的大写组合称为该词组的缩写。 比如&#xff0c;C语言里常用的EOF就是end of file的缩写。 输入 输入的第一行是一个整数T&#xff0c;表示一共有T组测试数据&#xff1b; 接下来有T行&#xff0c;每组测试数据占一行&a…

深入理解神经网络训练与反向传播

目录 前言1 损失函数1.1 交叉熵&#xff08;Cross Entropy&#xff09;&#xff1a;1.2 均方差&#xff08;Mean Squared Error&#xff09;&#xff1a; 2 梯度下降与学习率2.1 梯度下降2.2 学习率 3 正向传播与反向传播3.1 正向传播3.2 反向传播 4 链式法则和计算图4.1 链式法…