Mybtis和Mybatis-Plus区别

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架,MyBatis-Plus 是在 MyBatis 基础上增强的工具包,让开发更便捷、高效。下面是两者主要的区别:


✅ 核心区别总结:

特性MyBatisMyBatis-Plus
配置复杂度需要手写大量 XML 或注解极简配置,自动生成 SQL
CRUD 操作手写 Mapper 方法 + SQL内置通用 CRUD 方法
分页功能需要手写分页逻辑或第三方插件内置分页插件,开箱即用
条件构造器无,需要手写 where 条件内置 Lambda 条件构造器
代码生成提供代码生成器(Code Generator)
主键策略需要手动配置内置多种主键生成策略
乐观锁自己实现提供内置乐观锁插件
审计字段(如创建时间、修改时间)自行维护提供自动填充功能
性能分析需要额外工具内置 SQL 性能分析插件
兼容性灵活、手动控制高完全兼容 MyBatis,可随时退回

🧩 1. 配置复杂度

✅ MyBatis:
  • 需要创建 Mapper 接口 + Mapper.xml 文件

  • SQL 都需要手动写,配置较繁琐

  • 实体类、字段和表结构需要手动映射(resultMap 或 @Results)

<!-- MyBatis 的 select 示例 -->
<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>
✅ MyBatis-Plus:
  • 只需配置数据库连接、扫描 Mapper 包

  • 不需要写 XML,自动完成 SQL 拼接

  • 实体类字段与表字段名称一致可自动映射

// 简洁调用
User user = userMapper.selectById(1L);

🧩 2. CRUD 操作

✅ MyBatis:
  • 所有 CRUD 方法都需要手写

  • 如果实体类字段多,SQL 写起来冗长,易出错

✅ MyBatis-Plus:
  • 提供 BaseMapper<T>,自动拥有 20+ 个通用 CRUD 方法

  • 例如:

    • selectById, insert, updateById, deleteById

    • 批量插入、分页查询、条件查询等也支持

userMapper.insert(user); // 自动生成 insert SQL

🧩 3. 分页功能

✅ MyBatis:
  • 需要自己拼接分页 SQL(LIMIT/OFFSET)

  • 或接入第三方分页插件如 PageHelper

✅ MyBatis-Plus:
  • 提供 分页插件,配置一次后,使用非常方便

  • 统一使用 Page<T> 对象传参

Page<User> page = new Page<>(1, 10); // 页码1,每页10条
Page<User> result = userMapper.selectPage(page, null);

🧩 4. 条件构造器

✅ MyBatis:
  • 条件查询时需要手写 SQL 中的 where 子句
✅ MyBatis-Plus:
  • 提供 QueryWrapperLambdaQueryWrapper

  • 可链式编程、支持条件组合、动态拼接

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20).like(User::getName, "张");
List<User> users = userMapper.selectList(wrapper);

🧩 5. 代码生成

✅ MyBatis:
  • 没有自带代码生成工具,通常需要借助 MyBatis Generator 插件,且配置复杂
✅ MyBatis-Plus:
  • 自带 Code Generator,支持通过数据库自动生成:

    • 实体类、Mapper 接口、XML、Service、Controller 等
// 快速生成一整套文件,只需配置数据库和模板路径
AutoGenerator generator = new AutoGenerator();
// 配置略...
generator.execute();

🧩 6. 主键策略

✅ MyBatis:
  • 插入数据时需要手动指定主键或配置主键返回策略(如 useGeneratedKeys)
✅ MyBatis-Plus:
  • 支持多种主键生成方式:

    • 自增、UUID、雪花算法(默认使用雪花)
  • 只需在实体类中加注解即可

@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成主键
private Long id;

🧩 7. 乐观锁

✅ MyBatis:
  • 需要手动实现版本字段逻辑和 SQL 拼接
✅ MyBatis-Plus:
  • 提供内置插件支持乐观锁,自动对 version 字段进行比较和更新
@Version
private Integer version; // 更新时会自动加入 version=... 的判断

🧩 8. 审计字段(创建时间、修改时间)

✅ MyBatis:
  • 需要手动在 insert/update 语句中维护 createTime, updateTime
✅ MyBatis-Plus:
  • 提供自动填充功能,支持插入/更新时自动填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
  • 需要配置 MetaObjectHandler,一次性设置全局规则

🧩 9. 性能分析

✅ MyBatis:
  • 需要自己接入日志框架或 SQL 监控工具(如 P6Spy)
✅ MyBatis-Plus:
  • 内置 SQL 执行分析插件(dev/test 环境下很实用)
// 开启性能分析插件
interceptor.addInnerInterceptor(new PerformanceInterceptor());

🧩 10. 兼容性

✅ MyBatis:
  • 灵活度高,自由度大,但需要手动控制 SQL
✅ MyBatis-Plus:
  • 100% 兼容原生 MyBatis

  • 可以只使用通用功能,特殊需求时照样写 XML、注解 SQL


🚀 使用场景建议:

  • MyBatis:适合 SQL 极度复杂、强定制化的项目,想完全控制 SQL。

  • MyBatis-Plus:适合大多数通用业务,追求开发效率、简洁的项目,尤其适合中后台管理系统。

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

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

相关文章

JavaScript 性能优化实战

一、代码执行效率优化 1. 减少全局变量的使用 全局变量在 JavaScript 中会挂载在全局对象(浏览器环境下是window,Node.js 环境下是global)上,频繁访问全局变量会增加作用域链的查找时间。 // 反例:使用全局变量 var globalVar = example; function someFunction() {con…

学习笔记十六——Rust Monad从头学

&#x1f9e0; 零基础也能懂的 Rust Monad&#xff1a;逐步拆解 三大定律通俗讲解 实战技巧 &#x1f4e3; 第一部分&#xff1a;Monad 是什么&#xff1f; Monad 是一种“包值 链操作 保持结构”的代码模式&#xff0c;用来处理带上下文的值&#xff0c;并方便连续处理。 …

PL/SQL登录慢,程序连接Oracle 提示无法连接或无监听

PL/SQL登录慢&#xff0c;程序连接Oracle 提示无法连接或无监听 错误提示&#xff1a;ORA-12541: TNS: 无监听程序 的解决办法&#xff0c; 现象&#xff1a;PL/SQL登录慢&#xff0c;程序连接Oracle 提示无法连接或无监听 监听已经正常开起&#xff0c;但还是PL/SQL登录慢或…

Windows10,11账户管理,修改密码,创建帐户...

在这里&#xff0c;我们使用微软操作系统的一款工具:netplwiz 它可以非常便捷的管理用户账户. 一:修改密码(无需现在密码) 01修改注册表 运行命令&#xff1a;regedit 在地址栏输入&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Passwor…

电脑 BIOS 操作指南(Computer BIOS Operation Guide)

电脑 BIOS 操作指南 电脑的BIOS界面&#xff08;应为“BIOS”&#xff09;是一个固件界面&#xff0c;允许用户配置电脑的硬件设置。 进入BIOS后&#xff0c;你可以进行多种设置&#xff0c;具体包括&#xff1a; 1.启动配置 启动顺序&#xff1a;设置从哪个设备启动&#x…

iOS 冷启动时间监控:启动起点有哪些选择?

⏱️ iOS 冷启动时间监控&#xff1a;启动起点有哪些选择&#xff1f; 作者&#xff1a;侯仕奇 来源&#xff1a;sqi.io 在监控 iOS 冷启动性能时&#xff0c;一个关键问题是&#xff1a;如何精确记录 App 冷启动的开始时间&#xff1f; 本文将对不同的“冷启动起点”监控方式…

onlyoffice关闭JWT后依然报错如何解决?

onlyoffice关闭JWT后依然报错如何解决&#xff1f; 一、部署方式 我是以docker方式部署的&#xff0c;直接通过环境变量禁用了JWT&#xff0c;命令如下&#xff1a; docker run -d \--name onlyoffice-no-jwt \--restartalways \-p 8069:80 \-e JWT_ENABLEDfalse \onlyoffic…

rk3588 驱动开发(一)字符设备开发

3.字符设备驱动开发 3.1 什么是字符设备驱动 字符设备&#xff1a;就是一个个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写是按照先后顺序的。 举例子&#xff1a;IIC 按键 LED SPI LCD 等 Linux 应用程序调用驱动程序流程&#xff1a; Linux中驱动加载成功…

设计模式 --- 外观模式

外观模式是一种结构型设计模式&#xff0c;为复杂子系统提供​​统一的高层接口​​&#xff0c;通过定义一个外观类来​​简化客户端与子系统的交互​​&#xff0c;降低系统耦合度。这种模式隐藏了子系统的复杂性&#xff0c;将客户端与子系统的实现细节隔离开来&#xff0c;…

我的gittee仓库

日常代码: 日常代码提交https://gitee.com/xinxin-pingping/daily-code 有需要的宝子们可自行读取。

微服务调用中的“大对象陷阱”:CPU飙高问题解析与优化

背景 对几十万条用户历史存量数据写入&#xff0c;且存在大对象的基础上。kafka消费进行消费写mysql超时。导致上游服务调用时异常&#xff0c;CPU飙高异常。 大对象解释 大对象的定义与危害 1. 什么是大对象&#xff1f; JVM 内存分配机制&#xff1a;Java 中对象优先分配…

代码随想录算法训练营day6(字符串)

华子目录 反转字符串思路 反转字符串II思路 替换数字思路 反转字符串 https://leetcode.cn/problems/reverse-string/ 思路 使用双指针&#xff0c;初始化时&#xff0c;left指向下标0的位置&#xff0c;right指向最后一个元素的下标当while left<right时&#xff0c;交换…

Oracle 19c新特性:OCP认证考试与职业跃迁的关键?

在数字化转型的浪潮中&#xff0c;Oracle 19c作为数据库领域的旗舰版本&#xff0c;不仅承载着技术革新的使命&#xff0c;更成为IT从业者职业进阶的“黄金跳板”。无论是企业级应用的高可用性需求&#xff0c;还是云原生架构的快速迭代&#xff0c;Oracle 19c的智能化与多模型…

【MySQL数据库入门到精通】

文章目录 一、SQL分类二、DDL-数据库操作1.查询2.创建数据库3.删除数据库4.使用数据库 三、DDL-表操作1.查询 一、SQL分类 根据功能主要分为DDL DML DQL DCL DDL:Date Definition Language数据定义语言&#xff1a;定义数据库&#xff0c;表和字段 DML:Date Manipulatin Lan…

MCP服务端开发

MCP(Memory, Context, Planning)是一种增强AI系统认知能力的框架,通过整合记忆管理、上下文理解和规划能力,可以显著提升AI系统的表现。下面我将为您开发一个完整的MCP服务端。 概述 我们将使用Python开发一个基于FastAPI的MCP服务端,包含以下核心组件: Memory Manager…

前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联

在uniapp中&#xff0c;uni.pageScrollTo方法与元素的overflow-y:auto属性之间存在以下关联和差异&#xff1a; 一、功能定位差异 ‌uni.pageScrollTo‌ 属于‌页面级滚动控制‌&#xff0c;作用于整个页面容器‌34。要求页面内容高度必须超过屏幕高度&#xff0c;且由根元素下…

基础知识-指针

1、指针的基本概念 1.1 什么是指针 1.1.1 指针的定义 指针是一种特殊的变量&#xff0c;与普通变量存储具体数据不同&#xff0c;它存储的是内存地址。在计算机程序运行时&#xff0c;数据都被存放在内存中&#xff0c;而指针就像是指向这些数据存放位置的 “路标”。通过指针…

VS远程Linux_CMake项目搭建

VS远程Linux CMake项目搭建 准备工作 远程计算机上安装 gcc: 一个开源的编译器集合, GCC支持多种编程语言的编译&#xff0c;包括C、C、Objective-C、Fortran、Ada、Go、D和Javagdb: GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的调试工具&#xff0c;主要用于调…

替代升级VMware | 云轴科技ZStack构建山西证券一云多芯云平台

通过云轴科技ZStack Cloud云平台&#xff0c;山西证券打造了敏捷部署、简单运维的云平台&#xff0c;不仅兼容x86、海光、鲲鹏三种异构服务器实现一云多芯&#xff0c;还通过云平台虚拟化纳管模块纳管原有VMware虚拟化资源&#xff0c;并对接第三方集中式存储&#xff0c;在保护…

MATLAB - 模型预测控制器(MPC)的稳定性和鲁棒性问题

系列文章目录 目录 系列文章目录 前言 一、被控对象模型 二、初始控制器设计 三、改进初始设计 五、查看软约束 七、参考 前言 您可以检查模型预测控制器设计是否存在潜在的稳定性和鲁棒性问题。具体操作如下 在命令行中&#xff0c;使用审查功能。在 MPC Designer 中&a…