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;还能帮助我们规避一些潜在的风险。在这篇文章…

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

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

学习微信小程序的下拉列表控件-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;多分类交叉…

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…

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

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#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;以下是具体代码路径的修改内容。 解决方案&…

C#高级:通过 Assembly 类加载 DLL 和直接引用DLL的方法大全

一、主项目不添加引用 &#xff08;主项目不添加引用&#xff0c;而是通过路径获取指定dll&#xff09; 1.打印类的属性名称 namespace ReflectionDemo {class Program{static void Main(string[] args){// 指定【编译输出】的项目类库dll&#xff08;启动项目编译输出目录下…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

电脑换固态硬盘

参考&#xff1a; https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种&#xff1a; 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜&#xff1a; M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…

回顾2024年在CSDN的成长

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN&#xff1a;编程新手的避风港初学者的福音&#xff1a;细致入微的知识讲解考试复习神器&#xff1a;技术总结的“救命指南”曾经的自己&#xff1a;为何迟迟不迈出写博客的第一步兴趣萌芽&#xff1a;从“读”到“想写”的初体验…