【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式

news2025/12/18 16:54:05

目录

  • 前言
  • 一、传统 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 {
    @Autowired
    private 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> {
    @Override
    public int insertBatchSomeColumn(List<T> entityList) {
        // 自定义实现逻辑
    }

    @Override
    public 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 {
    @Override
    public void customMethod() {
        // 使用 IService 提供的方法或自定义逻辑
    }
}
  • 优点 : IService中提供的丰富的通用方法,提高开发效率。
  • 缺点 :造成设计层面sql对service的入侵。
  • 适用场景 :适用于小型项目或快速开发项目。

六、使用建议

  1. 小型项目或快速开发项目
    例如个人毕设,单接口服务,简单的管理系统,这种类似一次性开发的项目,当然是怎么快怎么方便怎么来,这时候就十分推荐使用MyBatis-Plus的Model+BaseMapper+IService,可以给开发节省很多时间。
  2. 本地应用或脚本
    例如在本地做数据处理,开发数据引擎,这时候实际上是没有mvc那一说法的,因为大量的操作就是操作数据,使用ActiveRecord模式不会有太大的负面印象,复杂的操作使用QueryWrapperLambdaQueryWrapper,Model类里面也有对应的方法。
  3. 中型项目但是人少
    国内大部分是中小企业,开发人员就五六个,相比于耦合带来的问题,开发进度更重要一些,使用BaseMapper+IService就好,AR模式对业务的侵入还是大了些。
  4. 大型项目最优实践
    创建自己的MyBaseMapper,继承MyBatis-Plus的BaseMapper,在这里编写公共方法,例如IService提供的一些批量处理方法,所有的mapper接口再继承MyBaseMapper

关于sql怎么写:
单表的简单操作直接用BaseMapper提供的方法
单表的复杂操作使用QueryWrapperLambdaQueryWrapper进行组装
多表的简单联查使用mybatis的注解在mapper接口中
多表的复杂联查在mapper.xml中编写

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

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

相关文章

ssti刷刷刷

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

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

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

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…

Java注解详解:从入门到实战应用篇

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

QML 属性动画、行为动画与预定义动画

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

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "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.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…

东芝第3代SiC MOSFET助于降低应用中电源损耗

功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比&#xff0c;碳化硅具有更高的电压和更低的损耗&#xff0c;因此碳化硅&#xff08;SiC&#xff09;被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

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

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

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

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…

车道线检测----CLRKDNet

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

从技术视角解构 Solana Meme 币生态

在高吞吐、高并发的 Solana 网络上&#xff0c;一类轻量化、高热度的代币形式正在爆发式增长——Meme Token&#xff08;迷因代币&#xff09;。尽管起源于社群文化&#xff0c;但其技术实现并非“玩笑”&#xff0c;而是一整套构建于 Solana Runtime 与 Token Extensions 之上…

智能接处警系统:以秒级联动响应重塑应急处置效能

​​随着我国能源、化工、航空等关键行业的快速发展&#xff0c;传统消防管理模式已难以满足高效应急响应的需求。国家能源局、应急管理部、民航总局均出台专项规定&#xff0c;对消防站建设提出更高要求&#xff0c;在此背景下&#xff0c;智能接处警系统正是应对这些挑战的核…

GpuGeek 网络加速:破解 AI 开发中的 “最后一公里” 瓶颈

摘要&#xff1a; 网络延迟在AI开发中常被忽视&#xff0c;却严重影响效率。GpuGeek通过技术创新&#xff0c;提供学术资源访问和跨国数据交互的加速服务&#xff0c;助力开发者突破瓶颈。 目录 一、引言&#xff1a;当算力不再稀缺&#xff0c;网络瓶颈如何破局&#xff1f; …

C# DataGridView 选中所有复选框

问题描述 在程序中尝试选中所有复选框&#xff0c;但出现错误。如果单击顶部的完整选中/释放复选框&#xff0c;同时选中包含复选框的列&#xff0c;则选定区域不会改变。该如何解决&#xff1f; 上面的图片是点击完整版本之后的。 下面是本文的测试代码&#xff0c;函数 dat…

AB Download Manager v1.5.8 开源免费下载工具

下载文件是我们日常工作和生活中经常进行的操作。面对动辄数十GB的4K影片、设计素材包或开发工具&#xff0c;传统浏览器的单线程下载如同"涓涓细流"&#xff0c;非常影响我们的效率和体验。 那么&#xff0c;一款高效且易用的下载工具至关重要。今天就让我们解锁这…