Mybatis plus中的BaseMapper与ServiceImpl

BaseMapper接口方法与ServiceImpl类方法的区别与联系

什么是BaseMapper?什么是ServiceImpl?

BaseMapper 是 MyBatis-Plus 提供的一个基础 Mapper 接口,封装了常用的 CRUD 操作方法,如 selectByIdinsertupdateByIddeleteById 等。

ServiceImpl 是 MyBatis-Plus 提供的一个服务层实现类,它实现了 IService 接口。ServiceImpl 类内部自动注入了 BaseMapper 的动态代理类实例,并通过方法代理机制,将 IService 接口中定义的方法转发到 BaseMapper 的实现类中。

什么时候使用BaseMapper?什么时候使用ServiceImpl
  • 使用 BaseMapper:当你需要直接对数据库进行简单的 CRUD 操作,且不需要复杂的业务逻辑处理时,直接使用 BaseMapper 中的方法。
  • 使用 ServiceImpl:当你需要在业务逻辑层中处理复杂的业务逻辑,如事务管理、数据校验、组合多个数据库操作等时,使用 ServiceImpl 中的方法,并在其中调用 BaseMapper 的方法。
BaseMapper 的实现类在哪里?

在 MyBatis-Plus 中,BaseMapper 是一个接口,它定义了一系列常用的 CRUD 操作方法。这些方法的具体实现是由 MyBatis-Plus 框架在运行时动态生成的。因此,你不会在 MyBatis-Plus 的源码中找到一个具体的 BaseMapper 实现类。

动态代理机制

MyBatis-Plus 使用 MyBatis 的动态代理机制来生成 BaseMapper 的实现类。具体来说,MyBatis 会根据 BaseMapper 接口定义的方法,动态生成一个代理类,并在运行时调用这些方法。这个代理类会自动生成相应的 SQL 语句并执行数据库操作。

关于BaseMapper和ServiceImpl的关系 、动态代理机制还有补充,未完待续…


以下是BaseMapper中的方法和ServiceImpl中的方法对照关系:BaseMapper接口中的方法有一个特征是都以insertupdateselectdelete开头。

  1. save(T entity) ~ insert(entity)
public boolean save(T entity) {return this.retBool(this.baseMapper.insert(entity));
}
  1. removeById(Serializable id) ~ deleteById(id)
public boolean removeById(Serializable id) {return SqlHelper.retBool(this.baseMapper.deleteById(id));
}
  1. removeByMap(Map<String, Object> columnMap) ~ deleteById(id)
public boolean removeByMap(Map<String, Object> columnMap) {Assert.notEmpty(columnMap, "error: columnMap must not be empty", new Object[0]);return SqlHelper.retBool(this.baseMapper.deleteByMap(columnMap));
}
  1. remove(Wrapper wrapper) ~ delete(wrapper)
public boolean remove(Wrapper<T> wrapper) {return SqlHelper.retBool(this.baseMapper.delete(wrapper));
}
  1. removeBuIds(Collection<? extends Serializable> idList) ~ deleteBatchIds(idList)
public boolean removeByIds(Collection<? extends Serializable> idList) {return SqlHelper.retBool(this.baseMapper.deleteBatchIds(idList));
}
  1. updateById(T entity) ~ updateById(entity)
public boolean updateById(T entity) {return this.retBool(this.baseMapper.updateById(entity));
}
  1. update<T entity, Wrapper updateWrapper ~ update(entity,updateWrapper)
public boolean update(T entity, Wrapper<T> updateWrapper) {return this.retBool(this.baseMapper.update(entity, updateWrapper));
}
  1. getById(Serializable id) ~ selectById(id)
public T getById(Serializable id) {return this.baseMapper.selectById(id);
}
  1. listByIds(Collection<? extends Serializable> idList) ~ selectBatchIds(idList)
public Collection<T> listByIds(Collection<? extends Serializable> idList) {return this.baseMapper.selectBatchIds(idList);
}
  1. listByMap(Map<String,Object> columnMap) ~ selectByMap(columnMap)
public Collection<T> listByMap(Map<String, Object> columnMap) {return this.baseMapper.selectByMap(columnMap);
}
  1. getOne(Wrapper queryWrapper,boolean throwEx) ~ selectList(queryWrapper)
public T getOne(Wrapper<T> queryWrapper, boolean throwEx) {return throwEx ? this.baseMapper.selectOne(queryWrapper) : SqlHelper.getObject(this.log, this.baseMapper.selectList(queryWrapper));
}
  1. getMap(Wrapper queryWrapper) ~ selectMaps(queryWrapper)
public Map<String, Object> getMap(Wrapper<T> queryWrapper) {return (Map)SqlHelper.getObject(this.log, this.baseMapper.selectMaps(queryWrapper));
}
  1. count(Wrapper queryWrapper) ~ selectCount(queryWrapper)
public int count(Wrapper<T> queryWrapper) {return SqlHelper.retCount(this.baseMapper.selectCount(queryWrapper));
}
  1. list(Wrapper queryWrapper) ~ selectList(queryWrapper)
public List<T> list(Wrapper<T> queryWrapper) {return this.baseMapper.selectList(queryWrapper);
}
  1. page(IPage page, Wrapper queryWrapper) ~ selectPage(page, queryWrapper)
public IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper) {return this.baseMapper.selectPage(page, queryWrapper);
}
  1. listMaps(Wrapper queryWrapper) ~ selectMaps(queryWrapper)
public List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper) {return this.baseMapper.selectMaps(queryWrapper);
}
  1. listObjs(Wrapper queryWrapper, Function<? super Object, V> mapper) ~ selectObjs(queryWrapper)…
public <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {return (List)this.baseMapper.selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
}
  1. pageMaps(IPage page, Wrapper queryWrapper) ~ selectMapsPage(page, queryWrapper)
public IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper) {return this.baseMapper.selectMapsPage(page, queryWrapper);
}

以下ServiceImpl中的方法没有使用到BaseMapper中的方法:

saveBatch  saveOrUpdate saveOrUpdateBatch  updateBatchById getObj

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

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

相关文章

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时&#xff0c;command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似&#xff0c;但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率&#xff0c;还能帮助我们规避一些潜在的风险。在这篇文章…

【认识油管头部频道】ep5 “5-Minute Crafts”——DIY 和生活技巧

5-Minute Crafts 是一个非常受欢迎的 DIY 和生活技巧频道&#xff0c;它的火爆有多方面的原因&#xff1a; 1. 简单实用的内容 视频主要以解决日常生活中遇到的小问题为主&#xff0c;提供简单易学的技巧&#xff0c;吸引了想快速获取实用知识的观众。 2. 短视频形式 每个视…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…

MongoDB 学习指南:深入探索非关系型数据库

MongoDB学习资料 MongoDB学习资料 MongoDB学习资料 在当今数字化时代&#xff0c;数据量呈爆炸式增长&#xff0c;数据结构也变得愈发复杂多样。传统的关系型数据库在处理一些大规模、高并发以及非结构化数据时&#xff0c;逐渐显露出局限性。而 MongoDB 作为一款领先的非关系…

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…

Mac 使用 GVM 管理多版本 Go 环境

使用 GVM 管理多版本 Go 环境 在本文中&#xff0c;我们将使用 gvm&#xff08;Go Version Manager&#xff09;工具管理本地多个 Go 语言版本。gvm 功能类似于 Python 的 Anaconda&#xff0c;可以方便地切换不同版本的 Go 环境&#xff0c;非常适合需要多版本开发与测试的场…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程&#xff08;主线是江科大的视频&#xff09;中的记录与发散思考。 初学难免有所纰漏、错误&#xff0c;还望大家不吝指正&#xff0c;感谢~ 一、I2C 外设简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主多从的串行通信协议…

.Net Core webapi 实现JWT认证

文章目录 需求准备创建JWT配置创建JWTService注册JWT创建中间件读取jwt的token在需要的接口上添加属性启动认证启动swagger的授权认证使用 需求 实现一个记录某个用户所有操作的功能 准备 创建你的webapi项目从nuget下载安装JWT资源包根据你的项目使用.net版本下载对应的jwt…

leetcode203-移除链表元素

leetcode203 什么是链表 之前不懂链表的数据结构&#xff0c;一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的&#xff0c;题目中给的链表是单向链表&#xff0c;有两个值&#xff0c;一个val表示值&#xff0c;一个next&#xff1a;表示连接的下一个…

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和pe…

ebno_db_vec 和 num_block_err参数

ebno_db_vec 和 num_block_err 都是与无线通信系统中误码率 (BER) 测试和性能评估相关的变量。 1. ebno_db_vec (0:0.5:5) 7; ebno_db_vec 是一个表示 信噪比 (SNR) 的向量&#xff0c;通常用于测试系统在不同信噪比条件下的性能。具体来说&#xff0c;ebno_db_vec 是通过将…

stack_queue的底层,模拟实现,deque和priority_queue详解

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#xff0c;这种模式将类的接口转化为用户希…

DNS介绍与部署-Day 01

1. 什么是DNS DNS&#xff08;Domain Name System&#xff09;域名系统&#xff0c;是一种采用客户端/服务器机制&#xff0c;负责实现计算机名称与IP地址转换的系统。DNS作为一种重要的网络服务&#xff0c;既是Internet工作的基础&#xff0c;同时在企业内部网络中也得到了广…

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

杰盛微 IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 SOP28封装

IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 IRS2336是 N型高压、高速功率 MOSFET/IGBT高低侧三相栅极驱动芯片&#xff0c;包含三路独立的半桥驱动电路。内部集成了欠压保护和过流保护功能&#xff0c;出现异常时立即关断六通道输出。提供外部使能控制可同时关断…

深入理解第三范式(3NF):数据库设计中的重要性与实践

title: 深入理解第三范式(3NF):数据库设计中的重要性与实践 date: 2025/1/17 updated: 2025/1/17 author: cmdragon excerpt: 在数据库设计中,规范化是确保数据完整性、减少冗余和提高查询效率的关键过程。第三范式(3NF)作为关系数据库设计的高级规范,建立在前两范式…

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…

RK3576 Android14 状态栏和导航栏增加显示控制功能

问题背景&#xff1a; 因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制&#xff0c;包括对锁屏后下拉状态栏的屏蔽&#xff0c;在设置功能里增加此功能的控制&#xff0c;故参考一些博客完成此功能&#xff0c;以下是具体代码路径的修改内容。 解决方案&…

TypeScript特有运算符和操作符

文章目录 TypeScript 特有运算符1. keyof2. typeof3. in4. extends5. is6. as 和 <Type>7. never8. readonly9. ?10. []11. | 和 &12. !13. ?? 和 ?. 总结 TypeScript 特有运算符 1. keyof 作用&#xff1a;用于获取对象类型的所有键&#xff08;属性名&#x…