随记:MybatisPuls中的抽象类Model和BaseMapper、自定义MetaObjectHandler实现类

有关Model:

  • 基础概念
    • 在 MyBatis - Plus 中,Model是一个很重要的抽象类。当实体类继承Model类后,它会获得一系列方便操作数据库的功能。这些功能主要是基于 MyBatis - Plus 提供的强大的 CRUD(增删改查)操作增强。
  • 主要优势
    • 数据库操作方法继承:继承Model类的实体类可以直接使用诸如insert()deleteById()selectById()updateById()等方法。例如,假设你有一个User实体类继承自Model,你可以通过User user = new User();创建一个用户对象,设置其属性后,直接使用user.insert()方法将该用户信息插入到数据库中。这比手动编写 SQL 语句或者使用传统的 MyBatis 的 Mapper 接口方法更加简洁高效。
    • 自动填充功能支持:如果你的数据库表中有一些字段需要自动填充,比如创建时间、更新时间等,Model提供了方便的自动填充机制。你只需要在实体类中通过注解(如@TableField(fill = FieldFill.INSERT_UPDATE))来指定字段的填充策略,MyBatis - Plus 就会在插入或更新操作时自动填充这些字段。
    • 逻辑删除功能集成:逻辑删除是一种常见的数据库操作策略,通过在表中设置一个标志位(如is_deleted字段)来表示记录是否被删除,而不是真正从数据库中物理删除记录。Model类支持逻辑删除功能,你可以在实体类中通过@TableLogic注解来指定逻辑删除字段,这样在执行删除操作时,MyBatis - Plus 会自动更新逻辑删除字段的值,而不是执行真正的删除操作。
    • 乐观锁功能配合:如果你的数据库操作需要使用乐观锁来处理并发问题,继承Model类也能很好地支持这一功能。通过在实体类中设置乐观锁字段(如version字段),并使用@Version注解进行标记,MyBatis - Plus 会在更新操作时自动检查和处理乐观锁相关的逻辑,确保数据的一致性。

Model和自定义MetaObjectHandler实现类区别:

  1. Model类自动填充功能的相似点
    • 目的相同
      • 这个MyMetaObjecthandle类和Model类的自动填充功能都是为了在数据库操作过程中自动设置某些字段的值。例如,在插入或更新操作时自动填充创建时间、更新时间等字段,以保证数据的完整性和一致性。它们都在一定程度上减少了手动设置这些字段的工作量,并且遵循相同的业务逻辑需求,即确保这些公共字段在合适的时候被正确赋值。
  2. Model类自动填充功能的不同点
    • 实现方式不同
      • Model类自动填充(基于框架内部机制):当实体类继承Model类后,MyBatis - Plus框架会根据实体类上的注解(如@TableField(fill = FieldFill.INSERT_UPDATE))来自动识别需要填充的字段。框架内部有一套自己的机制来触发和执行填充操作,它紧密集成在Model类以及整个MyBatis - Plus的持久层操作流程中。
      • MyMetaObjecthandle自定义实现(手动设置)MyMetaObjecthandle类是通过实现MetaObjectHandler接口,然后手动在insertFillupdateFill方法中使用metaObject.setValue方法来设置字段的值。这种方式相对更加灵活,因为你可以完全控制填充的逻辑和过程,但是需要更多的手动代码编写来实现和Model类自动填充类似的功能。
    • 集成程度不同
      • Model类自动填充(深度集成)Model类的自动填充功能是MyBatis - Plus持久层框架的一部分,它与Model类的其他数据库操作功能(如插入、更新、查询等)以及框架的其他特性(如逻辑删除、乐观锁等)紧密结合。例如,在一个完整的MyBatis - PlusCRUD操作中,自动填充功能会在合适的时机自动触发,不需要额外的配置就可以和其他功能协同工作。
      • MyMetaObjecthandle(相对独立):虽然MyMetaObjecthandle类实现了自动填充功能,但它相对独立于Model类。它需要在MyBatis - Plus的配置中进行额外的配置,告知框架使用这个自定义的MetaObjectHandler来进行自动填充。例如,需要在MyBatis - Plus的配置类中添加类似于mybatisPlusInterceptor.addInnerInterceptor(new MetaObjectHandlerInterceptor(myMetaObjecthandle));(假设MetaObjectHandlerInterceptor是自定义的拦截器用于应用MetaObjectHandler)这样的代码来使这个自动填充功能生效。
    • 适用范围略有差异
      • Model类自动填充(以实体类为中心)Model类的自动填充主要是针对继承Model类的实体类的数据库操作。它的填充逻辑是基于实体类的字段和注解定义的,所以它的适用范围主要是在MyBatis - Plus持久层中,对实体类相关的数据库操作进行自动填充。
      • MyMetaObjecthandle(更灵活的通用填充)MyMetaObjecthandle由于是手动实现的自动填充逻辑,它可以更灵活地应用于一些特殊情况或者非Model类继承的实体类。例如,如果有一些旧的实体类没有继承Model类,但是也需要自动填充功能,就可以通过配置使用MyMetaObjecthandle来实现自动填充。

Model和使用BaseMapper接口有什么区别:

  1. 功能特性方面
    • Model
      • 高级功能集成:当实体类继承Model后,它不仅可以进行基本的数据库操作,还集成了如自动填充、逻辑删除和乐观锁等高级功能。例如,对于逻辑删除功能,在实体类中通过@TableLogic注解标记逻辑删除字段后,使用Model类的deleteById方法执行删除操作时,不会真正从数据库中删除记录,而是更新逻辑删除字段的值。
      • 面向对象操作:以更面向对象的方式操作数据库。它的方法是基于实体类本身的,例如model.insert()方法,从对象层面理解就是将这个模型(实体)插入到数据库中。在这个过程中,会自动考虑实体类配置的各种规则,如自动填充相关字段。
    • BaseMapper接口
      • 基本数据库操作封装BaseMapper主要提供了基本的数据库操作方法,如insertselectByIdselectListupdateByIddeleteById等。这些方法更侧重于对 SQL 操作的简单封装,是比较底层的数据库交互方式。例如,selectById方法会根据传入的主键值生成对应的 SQL 语句(如SELECT * FROM table_name WHERE id =?)并执行查询操作,返回查询结果。
      • 缺乏高级功能集成(原生):在没有额外配置的情况下,BaseMapper本身不具备自动填充、逻辑删除和乐观锁这些高级功能。它只是单纯地执行 SQL 操作对应的增删改查功能。不过,在一些复杂的项目中,可以通过自定义拦截器或者其他方式来为BaseMapper的操作添加类似自动填充这样的功能,但这需要额外的开发工作。
  2. 使用方式方面
    • Model
      • 直接在实体类上操作:因为Model类的方法是实体类继承后就可以直接使用的,所以在业务逻辑层(Service 层)可以很方便地直接在实体对象上调用方法。例如,在一个用户服务类中,可以直接通过user.insert()来插入用户数据,这种方式更符合面向对象的编程习惯,代码看起来更直观。
      • 与实体类配置紧密结合:使用Model类的方法时,需要关注实体类的配置,如字段上的注解(@TableField@TableLogic等),因为这些配置会影响Model类方法的执行行为。例如,如果实体类配置了自动填充字段,那么在调用insertupdate方法时就会自动填充相应的字段。
    • BaseMapper接口
      • 依赖注入使用BaseMapper接口需要在对应的服务类(如UserService)中通过@Autowired(或其他依赖注入方式)注入后才能使用。例如,@Autowired private UserMapper userMapper;,然后通过userMapper.selectById(id)这样的方式来调用方法。
      • SQL 操作思维方式:在使用BaseMapper接口时,开发者更多地是从 SQL 操作的角度去思考。例如,在构建查询条件时,可能需要考虑如何使用Wrapper(条件构造器)来组合条件,以便生成正确的 SQL 查询语句。这种方式相对来说更接近传统的 MyBatis 的使用方式,对于熟悉 SQL 操作的开发者来说比较容易理解。
  3. 性能和效率方面(在简单场景下)
    • Model
      • 可能存在一定的性能损耗(相对):由于Model类的方法会处理很多额外的逻辑,如自动填充、逻辑删除检查等,在一些简单的数据库操作场景下,可能会引入少量的性能损耗。例如,每次插入操作都要检查是否有需要自动填充的字段,这会增加一定的执行时间。不过,在大多数企业级应用场景中,这种性能损耗通常是可以接受的,因为它带来的便利性和功能完整性更为重要。
    • BaseMapper接口
      • 相对高效(简单场景):在只需要执行基本的、没有复杂业务逻辑的数据库操作时,BaseMapper接口可能会更高效。因为它只是直接执行 SQL 操作,没有额外的逻辑处理步骤。例如,在一个只需要简单查询数据的接口中,使用BaseMapperselectList方法可以快速地返回结果,而不需要像Model类那样可能会涉及到自动填充字段的检查等操作。

最后自己总结:

model抽象类有自动填充、逻辑删除、乐观锁等,和自定义MeteObjectHandler差不多,但是没有自定义MeteObjectHandler灵活,填充的值不能设置。model类的方法和实现baseMapper接口相比model给实体类在service层有了对数据库的操作的方法,basemapper有一些相比于model可以填充等等功能的简单方法。减少了对对象的注入比如实现basemapper接口的类。

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

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

相关文章

Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认

文章目录 Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认小结 Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认 确定仪器连接问题,常用的是监测仪器的连接状态,如下代码所示&…

Java Lock ConditionObject 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & ConditionObject & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & ConditionObject & 总结》(学习…

SLAM|1. 相机投影及相机畸变

一个能思考的人,才真是一个力量无边的人。——巴尔扎克 本章主要内容: 1.针孔相机模型 2.相机成像的几个坐标系图像 3.畸变及相机标定 本节主要介绍在照相机拍摄过程中,现实物体如何跟照片上的像素关联起来,具体涉及相机成像的物…

服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例

服务器数据恢复环境: 某品牌服务器同品牌存储,Linux centos7EXT4文件系统。 服务器故障: 意外断电导致服务器操作系统不能正常启动。经过修复后系统可以正常启动,但是挂载的分区无法正常访问。使用fsck修复这个问题分区&#xff…

[含文档+PPT+源码等]精品基于PHP实现的培训机构信息管理系统的设计与实现

基于PHP实现的培训机构信息管理系统的设计与实现背景,可以从以下几个方面进行阐述: 一、社会发展与教育需求 随着经济的不断发展和人口数量的增加,教育培训行业迎来了前所未有的发展机遇。家长对子女教育的重视程度日益提高,课外…

modelsim命令:add atv

此命令在指定的评估尝试开始时间为指定的断言或覆盖指令&#xff08;由其路径名指定&#xff09;打开一个断言线程视图&#xff08;ATV&#xff09;窗口。此命令的参数依赖于顺序。请阅读参数描述以获取更多信息。 语法 add atv <pathname> <time> 参数 • <…

基于SSM+小程序的童装商城管理系统(商城3)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的童装商城管理系统实现了管理员及用户。 1、管理员实现了 首页、个人中心、用户管理、分类列表管理、童装商城管理、系统管理、订单管理。 2、用户实现了 注册、登录、首…

行为设计模式 -命令模式- JAVA

命令模式 一.简介二. 案例2.1 接收者&#xff08;Receiver&#xff09;2.2 命令接口实现对象&#xff08;ConcreteCommand&#xff09;2.3 调用者&#xff08; invoker&#xff09;2.4 获取Receiver对象2. 5 装配者客户端测试 三. 结论3.1 要点3.2 示例 前言 本设计模式专栏写了…

LCR 024. 反转链表 最细图片逐行解析过程

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例…

云计算平台上的DevOps实践

文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…

DIY可视化-uniapp悬浮菜单支持拖动、吸附-代码生成器

在Uniapp中&#xff0c;悬浮菜单支持拖动和吸附功能&#xff0c;可以为用户带来更加灵活和便捷的操作体验。以下是对这两个功能的详细解释&#xff1a; 悬浮菜单支持拖动 提高用户体验&#xff1a;用户可以根据自己的需要&#xff0c;将悬浮菜单拖动到屏幕上的任意位置&#x…

Threejs 实现3D 地图(06)3d 地图飞线动画

3d 地图飞线 代码仓库&#xff1a; King/threejs-3d-map 核心代码&#xff1a; import flyLine from "./constant/flyLine.json";const initFlyLine () > {flyLine.forEach(item > {const [from_x, from_y] d3Function(item.from)const [to_x, to_y] d3Fu…

微信小程序 - 动画(Animation)执行过程 / 实现过程 / 实现方式

前言 因官方文档描述不清晰,本文主要介绍微信小程序动画 实现过程 / 实现方式。 实现过程 推荐你对照 官方文档 来看本文章,这样更有利于理解。 简单来说,整个动画实现过程就三步: 创建一个动画实例 animation。调用实例的方法来描述动画。最后通过动画实例的 export 方法…

2D拓扑图

2D拓扑图主要指的是在二维平面上表示物体形状和关系的一种图形表示方法。 一、基本概念 2D网格拓扑结构&#xff1a;在二维平面上&#xff0c;由一系列的节点&#xff08;node&#xff09;和边&#xff08;edge&#xff09;组成。每个节点代表一个具体的位置或坐标点&#xf…

Kafka认证时Successfully logged in真的认证成功了?

背景 某个应用需要配置 Kafka 集群信息&#xff0c;且需要在验证集群是否可达。基本实现思路是创建一个生产者对象&#xff0c;然后发送一条测试数据&#xff0c;调用 Producer 的 send 方法发送消息后&#xff0c;再调用 get() 方法&#xff0c;即同步发送消息&#xff0c;测…

基于spootboot学生选课系统设计与实现

资料下载 https://download.csdn.net/download/qq_63753925/89888794 https://download.csdn.net/download/qq_63753925/89888793 https://download.csdn.net/download/qq_63753925/89885091 https://download.csdn.net/download/qq_63753925/89882320 摘 要 近年来&#xf…

机器人转人工时,开启实时质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们实现步骤1. 修改拨号方案2. 启用拨号方案 前言 在客户与机器人对话中&#xff0c;是不能开启质检功能的。因为机器人识别会与质检识别产生冲突。如果用户想通过机器人转接到人工时&#xff0c;开启质检功能&#xff0c;记录客户与人工之间的对话。应该如…

MySQL史上最全总结

MySQL学习笔记 安装与配置myini文件内容&#xff1a;初始化MySQL: MySQL语法&#xff1a;SQL-DDL数据库1.创建数据库2.查看数据库3.修改4.删除 数据库中的表管理1.创建表2.查找3.修改4.删除5.截断表 SQL-DML1.添加数据1.1插入多条数据1.2表内容复制 2.修改数据3.删除 TRUNCATE和…

Android中的epoll机制

深入理解Android中的epoll机制 在Android系统中&#xff0c;epoll广泛用于高效管理网络和文件的I/O操作。它通过减少CPU资源消耗和避免频繁的内核态-用户态切换&#xff0c;实现了在多连接、多任务环境中的高性能。epoll的特性使其非常适合Android系统中网络服务器、Socket通信…

php伪协议和move_uploaded_file、rename、copy等文件操作

move_uploaded_file、rename、copy 三个函数的区别&#xff1a; move_uploaded_file 函数是专门用于将通过 HTTP 上传的临时文件移动到指定位置的。如果你想要将一个已经存在的文件移动到另一个位置&#xff0c;而不是上传的文件&#xff0c;那么你应该使用 rename 函数或 co…