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

Mybatis plus:IService接口

一、介绍

        在MybatisPlus框架中,IService接口扮演着重要的角色。作为一个通用的服务接口,IService定义了一系列方法,包括查询、插入、更新、删除等。这些方法的定义使得在服务层进行数据库操作变得更为便捷和高效。

  • IService 接口是一个泛型接口,定义了一组通用的基础方法,包括常见的增删改查操作。例如,它提供了插入数据、根据主键更新数据、根据主键删除数据、根据主键查询数据等方法的签名。用户可以根据自己的需求和业务逻辑在自定义的服务接口中继承 IService 接口,并实现其中的方法。用法:
 public interface UserService extends IService<User> {}
  • ServiceImpl 类是 IService 接口的默认实现类,提供了基本的增删改查操作的实现细节。它使用了泛型参数来规范实体类和主键类型,并实现了 IService 接口中定义的方法。用户可以继承 ServiceImpl 类,并在自己的实现类中添加或重写更具体的业务逻辑。用法:        

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

二、IService用法

1、添加数据

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);// 插入(批量)
boolean saveBatch(Collection<T> entityList);// 插入(批量,限制数量)
boolean saveBatch(Collection<T> entityList, int batchSize);// TableId 注解存在更新记录,否则插入一条记录
boolean saveOrUpdate(T entity);// 根据 updateWrapper 尝试更新,否则继续执行 saveOrUpdate(T) 方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

        可以开启 rewriteBatchedStatements=true 参数,提高批处理的执行效率。

2、删除数据

// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);// 根据 ID 删除
boolean removeById(Serializable id);// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

3、修改数据

// 根据 UpdateWrapper 条件更新记录,需要设置sqlset
boolean update(Wrapper<T> updateWrapper);// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);// 根据 ID 选择修改
boolean updateById(T entity);// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

4、查询数据

查询一条数据

// 根据 ID 查询
T getById(Serializable id);// 根据 Wrapper,查询一条记录。结果集如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);// 根据 Wrapper,查询一条记录,这个是方法返回结果不止一条则会抛出异常,如果想默认取第一条结果,可以给这方法传第二个参数为false。
T getOne(Wrapper<T> queryWrapper, boolean throwEx);// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);// 根据 Wrapper,查询一条记录
// mapper:转换函数,用于将查询结果中的每个对象转换为指定的对象类型。
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查询多条数据

// 查询所有
List<T> list();// 查询列表
List<T> list(Wrapper<T> queryWrapper);// 查询(根据 ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);// 查询所有列表
List<Map<String, Object>> listMaps();// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);// 查询全部记录
List<Object> listObjs();// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);// 根据 Wrapper 条件,查询全部记录
// mapper:转换函数,用于将查询结果中的每个对象转换为指定的对象类型。
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查询记录数 count()

// 查询总记录数
int count();// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);

分页:Page

// 无条件分页查询
IPage<T> page(IPage<T> page);// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

        IPage 是MyBatis-Plus 提供的一个分页相关的接口,它有一个实现类为 Page,类中定义了分页相关的多个参数。

  • size (每页显示条数):此参数通常由前端传给我们,然后再封装到Page对象中进行分页查询;
  • current (要展示哪一页数据):此参数通常由前端传给我们,然后再封装到Page对象中进行分页查询;
  • orders(排序规则集合):按照哪些字段进行排序?可以为多个,例如希望通过时间进行排序,如果时间相同就根据用户ID降序排序,可以添加多个字段;
  • total (总记录数):指查询完毕后返回的数据库中总记录数,注意不包含已被逻辑删除的数据;
  • records(查询到的分页结果集数据):分页查询得到的多条数据会存储在 records 中,可以看出该对象是一个集合,可以传递一个泛型,泛型就是查询到的数据对应的实体泛型;
public class Page<T> implements IPage<T> {private static final long serialVersionUID = 8545996863226528798L;protected List<T> records;protected long total;protected long size;protected long current;protected List<OrderItem> orders;protected boolean optimizeCountSql;protected boolean searchCount;protected boolean optimizeJoinOfCountSql;protected String countId;protected Long maxLimit;
/* 以下省略 */
}

        Page对象使用演示:

@SpringBootTest
public class ProductMapperTest {// 自动注入 productMapper 接口对应的实现类对象@Autowiredprivate ProductMapper productMapper;@Testpublic void testPageQuery(){// 创建分页查询相关参数 page,泛型为 Product,表示查询到的结果对应的实体类为ProductPage<Product> page = new Page<>();// 设置分页查询显示第二页的数据,实际开发过程中该参数有前端传递page.setCurrent(2);// 设置分页查询每页显示四条数据,实际开发过程中该参数有前端传递page.setSize(4);// 创建排序字段集合,不想排序不加即可,实际开发过程中一般都会要求按照时间降序排序List<OrderItem> orders = new ArrayList<>();// 按照价格排序,排序方式为降序,ASC为True表示升序,false表示降序,第一个参数表示数据库中的列名orders.add(new OrderItem("price",false));// 按照生产时间排序,排序方式为降序orders.add(new OrderItem("production_date",false));// 将排序对象集合加入分页查询对象Page中page.setOrders(orders);// 执行分页查询,可以创建一个Page对象接受查询结果,// 也可以用查询条件参数page,但其实最后结果都是同一个page = productMapper.selectPage(page, null);// 可以新创建一个Page对象,就像下面这样Page<Product> productPage = productMapper.selectPage(page,null);// 输出分页查询结果显示当前的哪一页System.out.println(page.getCurrent());// 输出分页查询结果的总数据条数System.out.println(page.getTotal());// 输出分页查询结果的数据集合System.out.println(page.getRecords());// 输出分页查询结果的每页显示条数System.out.println(page.getSize());// 判断刚才分页查询的两个结果对象是否为同一个System.out.println(page == productPage);// 输出第一个分页查询对象内存地址System.out.println(page);// 输出第二个分页查询对象内存地址System.out.println(productPage);}
}

链式

        链式查询演示:

// 链式查询 普通
QueryChainWrapper<T> query();// 链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();// 示例:
// eq 指定条件
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

        链式更新演示:

// 链式更改 普通
UpdateChainWrapper<T> update();// 链式更改 lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();// 示例:
// eq 指定条件
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

相关文章:

Mybatis plus:IService接口

一、介绍 在MybatisPlus框架中&#xff0c;IService接口扮演着重要的角色。作为一个通用的服务接口&#xff0c;IService定义了一系列方法&#xff0c;包括查询、插入、更新、删除等。这些方法的定义使得在服务层进行数据库操作变得更为便捷和高效。 IService 接口是一个泛型接…...

时序分析基本概念介绍——min pulse width 最小脉冲宽度

文章目录 前言一、什么是 min pulse width&#xff1f;二、为什么检查 min pulse width&#xff1f;三、如何设置 min pulse width约束&#xff1f;1. 在sdc里面定义2. library里面定义 四、如何检查 min pulse width&#xff1f;五、如何修复 min pulse width&#xff1f;总结…...

PHP原生代码生成pdf---解决中文乱码问题

github地址 尝试了使用composer下载FPDF或者FPDI&#xff0c;但是无法解决中文乱码问题。只有使用这个github上的中文包才可以&#xff0c;那俩没必要下。 直接上代码(这里并没有使用任何框架) require(./fpdf/chinese.php);//生成pdf$pdf new PDF_Chinese();$pdf->AddPage…...

智慧车库管理系统

摘 要 随着城市化进程的不断加快&#xff0c;私家车数量的快速增长给城市交通带来了巨大的挑战&#xff0c;停车问题成为城市交通管理中的一大难题。车辆停车时&#xff0c;在停车场寻找停车位耗时过久&#xff0c;不仅仅浪费用户的时间&#xff0c;还可能引起交通拥堵。城市停…...

每日新闻掌握【2024年6月26日 星期三】

2024年6月26日 星期三 农历五月廿一 大公司/大事件 OpenAI将终止对中国提供API服务 从6月24日晚间开始&#xff0c;已有多名用户收到了来自OpenAI的邮件。该邮件表示&#xff0c;“我们的数据显示您的组织来自OpenAI目前不支持的地区的API流量。”邮件进一步表示&#xff0c;…...

InVEST实践及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中应用

白老师&#xff08;研究员&#xff09;&#xff1a;长期从事生态系统结构-格局-过程-功能-服务的变化与响应关系等研究工作,重点围绕生物多样性、生态系统服务与价值等&#xff0c;构建生物地球化学模型和评价指标体系&#xff0c;为城市、区域和自然保护区的可持续发展和生态环…...

慧科新闻搜索研究数据库的使用指南及个人获取途径

《慧科新闻搜索研究数据库》WiseSearch由慧科讯业有限公司出品。WiseSearch是具有新闻搜索/浏览、对比分析等功能的一站式新闻搜索平台&#xff1b;内容包括1200种报刊和8000 网站的新闻资讯&#xff0c;平面媒体涵盖全国综合大报、党委机关报、都市报、行业报刊媒体&#xff0…...

SpringBoot学习03-[Spring Boot与Web开发]

Spring Boot与Web开发 RestTemplateMockMvc在SPringBoot中使用 SpringBoot整合swagger2SpringBoot的springmvc自动配置底层原理包含ContentNegotiatingViewResolver和BeanNameViewResolverContentNegotiatingViewResolverBeanNameViewResolver 支持提供静态资源&#xff0c;包括…...

数据恢复篇:如何恢复丢失的Android短信?

许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是&#xff0c;有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android&#xff0c;这可以成为救命稻草。这些技术不需要深厚的技术知识&#xff0c;也不需要损害设备的安全性。为了帮助您摆脱…...

数据结构历年考研真题对应知识点(栈)

目录 3.1栈 3.1.1栈的基本概念 【栈的特点&#xff08;2017&#xff09;】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…...

BarTender版软件下载及安装教程

​根据行业数据显示强大的配套应用软件甚至能够管理系统安全性、网络打印功能、文档发布、打印作业记录等&#xff0c;为满足不同的需要和预算&#xff0c;BarTender 提供四个版本&#xff0c;每个都拥有卓越的功能和特性。根据软件大数据显示多国语言支持&#xff1a;轻松设计…...

Python 中从字典中提取所有值到列表

目录: 使用 keys() 方法使用 values() 方法使用 items() 方法使用 * 解包使用列表推导式使用 lambda 函数有时候,在使用 Python 字典时,只关心获取字典的值而不关心字典的键。可以使用多种方法从字典中获取所有的值。 使用 keys() 方法 Python 字典(Dictionary) keys() 方…...

Netty中Reactor线程的运行逻辑

Netty中的Reactor线程主要干三件事情&#xff1a; 轮询注册在Reactor上的所有Channel感兴趣的IO就绪事件。 处理Channel上的IO就绪事件。 执行Netty中的异步任务。 正是这三个部分组成了Reactor的运行框架&#xff0c;那么我们现在来看下这个运行框架具体是怎么运转的~~ 这…...

liunx 搭建 zookeeper

创建下载路径 #创建文件夹 mkdir -p /mydata/zookeeper #进入文件夹 cd /mydata/zookeeper下载zookeeper文件 #下载 wget https://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz #解压文件 tar -zxvf apache-zookeeper-3.5.9-bin.…...

selenium 3中等待方式

Selenium 3中的等待方式主要有三种&#xff1a;强制等待、隐式等待和显式等待&#xff08;智能等待的一种&#xff09;。 1. 强制等待&#xff1a;使用time.sleep&#xff08;X&#xff09;方法&#xff0c;强制让浏览器等待X秒&#xff0c;无论当前操作是否完成&#xff0c;都…...

pytorch笔记:named_parameters

named_parameters 是 PyTorch 中一个非常有用的函数&#xff0c;用于访问模型中所有定义的参数及其对应的名称。它是 torch.nn.Module 类的方法之一&#xff0c;返回一个生成器&#xff0c;生成 (name, parameter) 对&#xff0c;name 是参数的名称&#xff0c;parameter 是对应…...

uniapp——H5添加支付宝授权登录,报错:系统异常,请联系商家。REDIRECT_URI_ILLEAGAL

解决方法 https://opensupport.alipay.com/support/FAQ/41bb980b-d18e-4141-8063-9d172cb7e655 这其中最常见的是授权的回调地址配置的不正确 应该为域名后面加上你H5打包后的名字&#xff0c;例如 https://www.xxx.com/agent要正确配置支付宝授权登录的回调地址&#xff0c;…...

群辉NAS使用Kodi影视墙

目录 一、KODI安装 二、修改UI语言 1、修改显示字体 2、修改语言为中文 四、添加媒体库 五、观看电影 五、高级设置 1、视图类型 2、修改点击播动作 五、补充 1、文件组织结构及命名 2、电影信息的刮削 (1)添加影片 (2)演员管理 (3)影片管理 (4)说明 K…...

如何实现HPC数据传输的高效流转,降本增效?

高性能计算&#xff08;HPC&#xff09;在多个行业中都有应用&#xff0c;涉及到HPC数据传输的行业包括但不限于&#xff1a; 1.科学研究&#xff1a;在物理学、化学、生物学、地球科学等领域进行模拟和建模。 2.工程和产品设计&#xff1a;进行复杂系统的设计和分析&#xf…...

redis 定时任务锁 分布式锁

基于 redisTemplate 在分布式集群环境中的最佳实践&#xff0c;其实无论是单机还是集群&#xff0c;保证原子性都是第一位的&#xff0c;如果能同时保证性能和高可用&#xff0c;那么就是一个可靠的分布式锁解决方案。 主要思路是&#xff1a;设置锁时&#xff0c;使用 redis…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...