【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式
目录
- 前言
- 一、传统 Mapper 接口方式
- 二、继承 BaseMapper 的方式
- 三、自定义通用 Mapper 的方式
- 四、使用 MyBatis-Plus 的 ActiveRecord 模式
- 五、使用 MyBatis-Plus 的 IService 接口
- 六、使用建议
前言
mapper文件,作为Mybatis框架中定义SQL语句和映射关系的配置文件,在引入mybtis-plus后,有了更多的实现方式,本文对此做一个对比总结。
一、传统 Mapper 接口方式
先重温一下原始Mybatis的实现方式,以下所有方式均以用户类 User 作为实体类
- 定义Mapper接口 :为每个实体类创建对应的 Mapper 接口,接口中声明所需的数据库操作方法。例如,针对用户实体类 User,创建 UserMapper 接口。
@Mapper
public interface UserMapper {// 自定义方法List<User> selectAllUsers();
}
- 实现Mapper接口 :通常使用 MyBatis 的注解或 XML 配置文件来实现接口中的方法。对于简单方法,可以使用注解;对于复杂查询,使用 XML 配置。
@Select("SELECT * FROM user")
List<User> selectAllUsers();
或者在 UserMapper.xml 文件中配置:
<select id="selectAllUsers" resultType="com.example.entity.User">SELECT * FROM user
</select>
- 优点 :开发人员对数据库操作有较高的控制度,能够灵活地定义各种复杂的 SQL 查询;适合处理复杂的业务场景,尤其是涉及到多表关联等复杂操作时。
- 缺点 :需要为每个实体类编写对应的 Mapper 接口和实现代码,当实体类较多时,工作量较大;代码重复性较高,对于简单的 CRUD 操作,需要重复编写类似的接口方法。
- 适用场景 :适用于业务逻辑复杂、需要精确控制数据库操作的项目,尤其是涉及到大量自定义 SQL 查询的场景。
二、继承 BaseMapper 的方式
这是 MyBatis-Plus 提供的一种简化方式,利用其内置的通用 Mapper 接口来快速实现常见的数据库操作。
- 定义Mapper接口 :让自定义的 Mapper 接口继承 MyBatis-Plus 提供的
BaseMapper
接口。这样就可以直接使用BaseMapper
中定义的通用的增删改查方法。
@Mapper
public interface UserMapper extends BaseMapper<User> {// 可以添加自定义的其他方法
}
- 使用通用方法 :通过继承
BaseMapper
,可以直接使用如insert()
(插入)、deleteById()
(根据 ID 删除)、updateById()
(根据 ID 更新)、selectById()
(根据 ID 查询)、selectList()
(查询列表)等方法,无需自己实现。
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void addUser(User user) {userMapper.insert(user);}public User getUserById(Long id) {return userMapper.selectById(id);}
}
- 优点 :极大地简化了代码编写,减少了重复代码;对于简单的 CRUD 操作,开发效率显著提高。
- 缺点 :对于一些复杂的查询和操作,可能需要结合自定义的 SQL 来实现,此时需要在继承
BaseMapper
的基础上扩展自定义方法。 - 适用场景 :适用于对实体类进行简单的增删改查操作的场景,能够快速开发出基本的数据访问功能。
三、自定义通用 Mapper 的方式
如果对 MyBatis-Plus 的默认 BaseMapper
提供的方法不满意,或者需要在多个项目中复用自定义的通用 Mapper,可以自定义通用 Mapper。
- 创建自定义通用Mapper接口 :定义一个接口,例如
MyBaseMapper
,并根据需求定义通用的方法。
public interface MyBaseMapper<T> {int insertBatchSomeColumn(List<T> entityList);List<T> selectByCustomCondition(Map<String, Object> params);
}
- 实现自定义通用Mapper :可以通过继承 MyBatis-Plus 的
BaseMapper
并实现自定义接口,或者完全自己实现通用方法。
public class MyBaseMapperImpl<T> extends BaseMapper<T> implements MyBaseMapper<T> {@Overridepublic int insertBatchSomeColumn(List<T> entityList) {// 自定义实现逻辑}@Overridepublic List<T> selectByCustomCondition(Map<String, Object> params) {// 自定义实现逻辑,可以使用 MyBatis 的注解或 XML 配置}
}
- 使用自定义通用Mapper :让具体的 Mapper 接口继承自定义的通用 Mapper 接口。
@Mapper
public interface UserMapper extends MyBaseMapper<User> {
}
- 优点 :可以根据项目需求灵活定制通用的数据库操作方法,提高代码的可复用性和可维护性。
- 缺点 :需要花费一定的时间进行自定义通用 Mapper 的设计和实现,增加了开发的初始工作量;如果设计不合理,可能会影响后续的使用和扩展。
- 适用场景 :适用于有特殊数据库操作需求,或者需要在多个项目中共享通用 Mapper 的情况。
四、使用 MyBatis-Plus 的 ActiveRecord 模式
这种方式让实体类本身承担数据访问的职责,无需编写 Mapper 接口。
- 实体类继承 Model :实体类继承 MyBatis-Plus 的
Model
类,并实现相关的主键指定方法。
public class User extends Model<User> {private Long id;private String name;private Integer age;
}
- 使用实体类进行数据操作 :通过实体类的实例直接调用数据访问方法,如
insert()
、delete()
、update()
、selectById()
等。
@Service
public class UserService {public void addUser(User user) {user.insert();}public User getUserById(Long id) {return User.selectById(id);}
}
- 优点 :减少了 Mapper 接口的编写工作,使代码更加简洁;对于简单的 CRUD 操作,开发效率较高。
- 缺点 :实体类承担了过多的数据访问职责,导致类的职责不清晰;在处理复杂的业务逻辑和多表关联时,代码的可维护性和可读性较差。
- 适用场景 :适用于小型项目或快速原型、本地应用开发,主要用于简单的数据操作场景。
五、使用 MyBatis-Plus 的 IService 接口
这种方式结合了 MyBatis-Plus 的 Mapper 和 Service 层的通用接口,提供更丰富的预设方法。
- 定义Mapper接口继承 BaseMapper :和前面提到的继承
BaseMapper
的方式一样,为实体类创建对应的 Mapper 接口。
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
- 定义 Service 接口继承 IService :让自定义的 Service 接口继承 MyBatis-Plus 提供的
IService
接口,IService
提供了一些常用的业务逻辑方法。
public interface UserService extends IService<User> {// 自定义业务逻辑方法
}
- 实现 Service 接口 :在 Service 实现类中,注入对应的 Mapper 接口,并使用
IService
提供的方法以及自定义的业务逻辑。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic void customMethod() {// 使用 IService 提供的方法或自定义逻辑}
}
- 优点 : IService中提供的丰富的通用方法,提高开发效率。
- 缺点 :造成设计层面sql对service的入侵。
- 适用场景 :适用于小型项目或快速开发项目。
六、使用建议
- 小型项目或快速开发项目
例如个人毕设,单接口服务,简单的管理系统,这种类似一次性开发的项目,当然是怎么快怎么方便怎么来,这时候就十分推荐使用MyBatis-Plus的Model+BaseMapper+IService
,可以给开发节省很多时间。 - 本地应用或脚本
例如在本地做数据处理,开发数据引擎,这时候实际上是没有mvc那一说法的,因为大量的操作就是操作数据,使用ActiveRecord
模式不会有太大的负面印象,复杂的操作使用QueryWrapper
或LambdaQueryWrapper
,Model类里面也有对应的方法。 - 中型项目但是人少
国内大部分是中小企业,开发人员就五六个,相比于耦合带来的问题,开发进度更重要一些,使用BaseMapper+IService
就好,AR模式对业务的侵入还是大了些。 - 大型项目最优实践
创建自己的MyBaseMapper
,继承MyBatis-Plus的BaseMapper
,在这里编写公共方法,例如IService
提供的一些批量处理方法,所有的mapper接口再继承MyBaseMapper
关于sql怎么写:
单表的简单操作直接用BaseMapper
提供的方法
单表的复杂操作使用QueryWrapper
或LambdaQueryWrapper
进行组装
多表的简单联查使用mybatis的注解在mapper接口中
多表的复杂联查在mapper.xml中编写
相关文章:
【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式
目录 前言一、传统 Mapper 接口方式二、继承 BaseMapper 的方式三、自定义通用 Mapper 的方式四、使用 MyBatis-Plus 的 ActiveRecord 模式五、使用 MyBatis-Plus 的 IService 接口六、使用建议 前言 mapper文件,作为Mybatis框架中定义SQL语句和映射关系的配置文件&…...

ssti刷刷刷
[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字,但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码,这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…...

java+selenum专题(一)
环境搭建部署篇-> 1.简介 java版的selenium,介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个IDE来进行开发&…...
物体雅克比、空间雅克比、解析雅克比、几何雅克比
在机器人学中,雅可比矩阵是连接广义坐标速度与末端执行器速度的关键工具。根据应用场景和参考系的不同,雅可比矩阵可分为物体雅可比(Body Jacobian)、空间雅可比(Space Jacobian)、解析雅可比(A…...

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)
[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五) 引言:一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时,发现日志中频繁出现 WPS 相关模块(如 k…...

ACM模式用Scanner和System.out超时的解决方案和原理
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:笔试强训 📚本系列文章为个人学…...

Java注解详解:从入门到实战应用篇
1. 引言 Java注解(Annotation)是JDK 5.0引入的一种元数据机制,用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战,全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…...

QML 属性动画、行为动画与预定义动画
目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1:属性动画应用示例2:行为动画实现示例3:预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例,结合属性动画(PropertyAnimatio…...

window nvidia-smi命令 Failed to initialize NVML: Unknown Error
如果驱动目录下的可以执行,那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…...

自学嵌入式 day19-数据结构 链表
二、线性表的链式存储 1.特点: (1)线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。 (2)所以…...

东芝第3代SiC MOSFET助于降低应用中电源损耗
功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比,碳化硅具有更高的电压和更低的损耗,因此碳化硅(SiC)被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…...
Vue 2.0学习
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
Mendix 中的XPath 令牌(XPath Tokens)详解
在 Mendix 中,XPath 令牌(XPath Tokens) 是一种特殊的动态参数化查询技术,允许你在 XPath 表达式中使用变量或上下文相关的值,从而实现更灵活的查询逻辑。 1. 什么是 XPath 令牌? XPath 令牌是 Mendix 提…...
Spring Batch学习,和Spring Cloud Stream区别
Spring Batch学习,和Spring Cloud Stream区别 1. 使用Spring Initializr创建项目2. 使用步骤构建作业(Chunk 模式)🧩 场景说明🧰 1. 示例目录结构📄 2. 创建输入文件(users.csv)&…...
【技术原理】Linux 文件时间属性详解:Access、Modify、Change 的区别与联系
在 Linux 系统中,每个文件都有三个核心时间属性:Access Time (atime)、Modify Time (mtime) 和 Change Time (ctime)。它们分别记录文件不同维度的变更信息,以下是具体区别与联系: 一、定义与触发条件 时间属性定义触发条件示例A…...
k8s之LoadBalancer Service 解析
Kubernetes LoadBalancer Service 解析:IP与端口详解 服务类型与IP解析 Service 是 Kubernetes 中的资源类型,用来将一组 Pod 的应用作为网络服务公开。每个 Pod 都有自己的 IP,但是这个 IP 的生命周期与 Pod 生命周期一致,也就…...
Vue3项目使用ElDrawer后select方法不生效
Vue3 项目中 ElDrawer 内 ElSelect 下拉框 z-index 失效问题分析与解决方案 问题描述问题分析解决方案结论 问题描述 在 Vue3 项目中使用 Element Plus 的 ElDrawer 组件时,当在抽屉内部使用 ElSelect 组件,发现下拉选择框(dropdownÿ…...

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践
为了适应 PD 分离式推理部署架构,百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设,到网络流量层面的设备配置和管理,再到通信组件和算子层面的优化,显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…...

官方 Elasticsearch SQL NLPChina Elasticsearch SQL
官方的可以在kibana 控制台上进行查询: POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询,但是可以使用postman接口进行查询:...

5月16日复盘-目标检测开端
5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 Object Detection,是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 目标检测将目标的分割和识别合二为一。 What、Where 2. 使用场景 目标检测用于…...
读取toml, 合并,生成新文件
依次读取三个TOML文件并合并,后续文件覆盖之前的值,最终将结果写入新文件 import toml def deep_update(base_dict, update_dict): """ 递归合并字典,后续字典的值覆盖前者[6] """ for key, …...

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...

IDEA怎么汉化idea中文改回英文版
第一步:点击左上角的File,然后选择Setting 第二步:Setting页面选择 Appearance & Behavior,然后展开System Settings,然后选择 Language and Region,进行修改 我操作的是2024年的版本 File->Settings -> Ap…...
Android minSdk从21升级24后SO库异常
问题 minSdk从21调整到24后: java.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity- Bg31QvFwF4qsCwv2XCqT-w/split_config.arm64_v8a.apkjava.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity-…...

车道线检测----CLRKDNet
今天的最后一篇 车道线检测系列结束 CLRKDNet:通过知识蒸馏加速车道检测 摘要:道路车道是智能车辆视觉感知系统的重要组成部分,在安全导航中发挥着关键作用。在车道检测任务中,平衡精度与实时性能至关重要,但现有方法…...

从技术视角解构 Solana Meme 币生态
在高吞吐、高并发的 Solana 网络上,一类轻量化、高热度的代币形式正在爆发式增长——Meme Token(迷因代币)。尽管起源于社群文化,但其技术实现并非“玩笑”,而是一整套构建于 Solana Runtime 与 Token Extensions 之上…...

智能接处警系统:以秒级联动响应重塑应急处置效能
随着我国能源、化工、航空等关键行业的快速发展,传统消防管理模式已难以满足高效应急响应的需求。国家能源局、应急管理部、民航总局均出台专项规定,对消防站建设提出更高要求,在此背景下,智能接处警系统正是应对这些挑战的核…...
OpenCV直方图与直方图均衡化
一、图像直方图基础 1. 什么是图像直方图? 图像直方图是图像处理中最基本且重要的统计工具之一,它用图形化的方式表示图像中像素强度的分布情况。对于数字图像,直方图描述了每个可能的像素强度值(0-255)在图像中出现…...
7-15 计算圆周率
π131352!3573!⋯357⋯(2n1)n!⋯ 输入格式: 输入在一行中给出小于1的阈值。 输出格式: 在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。 输入样例: 0.01输出样例: 3.132157 我的代码 #i…...
Mosaic数据增强技术
Mosaic 数据增强技术是一种在计算机视觉领域广泛应用的数据增强方法。下面是Mosaic 数据增强技术原理的详细介绍 一、原理 Mosaic 数据增强是将多张图像(通常是 4 张)按照一定的规则拼接在一起,形成一张新的图像。在拼接过程中,会…...