MyBatis与MyBatis-Plus深度分析
MyBatis与MyBatis-Plus深度分析
一、MyBatis原理与基础
1. MyBatis核心原理
MyBatis是一个半自动ORM框架,主要原理包括:
- SQL与代码分离:通过XML或注解配置SQL语句
- 动态SQL:提供if、choose、foreach等标签实现动态SQL
- 结果集映射:将数据库结果集自动映射到Java对象
- 一级/二级缓存:提供缓存机制提高性能
2. MyBatis基础知识点
核心组件:
- SqlSessionFactory:创建SqlSession的工厂
- SqlSession:执行SQL的核心接口
- Mapper接口:定义数据库操作方法
- Mapper XML:编写SQL语句的配置文件
关键特性:
- 参数映射(#{}, ${})
- 结果映射(resultMap)
- 动态SQL标签
- 插件机制
3. MyBatis简单案例
// Mapper接口
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);
}// 实体类
public class User {private Integer id;private String name;private String email;// getters/setters
}// 使用示例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1);System.out.println(user.getName());
}
二、MyBatis-Plus原理与增强
1. MyBatis-Plus核心原理
MyBatis-Plus在MyBatis基础上增强:
- 自动CRUD:内置通用Mapper,减少基础SQL编写
- 条件构造器:通过Lambda表达式构建查询条件
- 代码生成器:自动生成Entity、Mapper等代码
- 分页插件:简化分页操作
- 性能分析插件:输出SQL执行性能
2. MyBatis-Plus基础知识点
核心特性:
- 通用CRUD操作
- Lambda表达式查询
- 主键策略支持
- 全局配置
- 乐观锁支持
- SQL注入器
与MyBatis主要区别:
特性 | MyBatis | MyBatis-Plus |
---|---|---|
CRUD操作 | 需手动编写 | 内置通用方法 |
条件构造 | 需写SQL | Lambda表达式 |
代码生成 | 需第三方工具 | 内置生成器 |
分页 | 需插件 | 内置分页插件 |
性能分析 | 需配置 | 内置插件 |
3. MyBatis-Plus简单案例
// 实体类
@Data
@TableName("users")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private String email;
}// Mapper接口
public interface UserMapper extends BaseMapper<User> {// 已继承基本CRUD方法
}// 服务层
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getUsersByName(String name) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().eq(User::getName, name);return userMapper.selectList(queryWrapper);}
}// 使用Lambda查询
List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, "张").gt(User::getAge, 18)
);
三、综合对比与选择建议
1. 适用场景
- MyBatis适用场景:
- 需要精细控制SQL
- 复杂查询和存储过程调用
- 已有MyBatis项目维护
- MyBatis-Plus适用场景:
- 快速开发CRUD功能
- 需要减少样板代码
- 新项目开发
2. 性能考虑
- MyBatis-Plus在简单CRUD上效率更高(减少代码量)
- 复杂SQL场景两者性能相当(最终都转为MyBatis执行)
- MyBatis-Plus的Lambda查询会转换为MyBatis的SQL,无额外性能损耗
3. 综合案例展示
复杂查询+分页案例:
// MyBatis实现
@Select("SELECT * FROM users WHERE name LIKE #{name} AND age > #{age} LIMIT #{offset}, #{size}")
List<User> findUsers(@Param("name") String name, @Param("age") int age,@Param("offset") int offset,@Param("size") int size);// MyBatis-Plus实现
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.like(User::getName, "张").gt(User::getAge, 18);
IPage<User> userPage = userMapper.selectPage(page, wrapper);
动态更新案例:
// MyBatis实现
@Update("<script>" +"UPDATE users " +"<set>" +" <if test='name != null'>name=#{name},</if>" +" <if test='email != null'>email=#{email},</if>" +"</set>" +"WHERE id=#{id}" +"</script>")
void updateUserSelective(User user);// MyBatis-Plus实现
userMapper.update(null, Wrappers.lambdaUpdate(User.class).set(User::getName, "新名字").eq(User::getId, 1));
四、总结
- MyBatis提供更精细的SQL控制,适合复杂场景
- MyBatis-Plus大幅简化CRUD操作,提高开发效率
- 两者可以结合使用,MyBatis-Plus处理简单操作,复杂SQL仍可用原生MyBatis方式
- 新项目推荐使用MyBatis-Plus,可显著减少样板代码
根据项目需求和团队熟悉程度选择合适的框架,大型项目中也可以两者混合使用,兼顾开发效率和灵活性
相关文章:
MyBatis与MyBatis-Plus深度分析
MyBatis与MyBatis-Plus深度分析 一、MyBatis原理与基础 1. MyBatis核心原理 MyBatis是一个半自动ORM框架,主要原理包括: SQL与代码分离:通过XML或注解配置SQL语句动态SQL:提供if、choose、foreach等标签实现动态SQL结果集映射…...
STM32 变量加载到flash的过程中
在STM32中,BIN文件内需要加载到RAM的数据由链接脚本(Linker Script)和启动代码(Startup Code)共同决定,具体机制如下: 一、BIN文件内容结构 STM32的BIN文件包含三类数据: Co…...
TCP核心机制
1. TCP五大核心机制 1.1. 顺序问题(稳重不乱) 背景:网络传输中数据包可能因路径不同或网络波动导致乱序到达,需保证接收方能按正确顺序处理数据。 原理: 序列号(Sequence Number)࿱…...
6.3对象序列化
在 Java 中,ObjectInputStream 和 ObjectOutputStream 是用于实现对象序列化(Serialization)和反序列化(Deserialization)的核心类。通过这两个类,可以将对象转换为字节流进行存储或传输,并在需…...
Flutter小白入门指南
Flutter小白入门指南 🚀 轻松构建漂亮的跨平台应用 📑 目录 一、Flutter是什么? 为什么选择Flutter?Flutter工作原理 二、环境搭建与命令行 安装Flutter SDK常用Flutter命令创建第一个项目 三、Flutter基础语法 变量与类型函数条…...
Python -将MP4文件转为GIF图片
给大家提供一个工具代码,使用Python,将MP4格式的视频文件,转换为GIF图片 首先先安装必要的包: pip install imageio pip install imageio[ffmpeg] 工具代码: import imageio# 视频文件路径 video_path r""…...
51c嵌入式~电路~合集27
我自己的原文哦~ 一、7805应用电路 简介 如上图,7805 集成稳压电路。 7805是串联式三端稳压器,三个端口分别是电压输入端(IN),地线(GND),稳压输出(OUT)…...
数据结构—(链表,栈,队列,树)
本文章写的比较乱,属于是缝合怪,很多细节没处理,显得粗糙,日后完善,今天赶时间了。 1. 红黑树的修复篇章 2. 红黑树的代码理解(部分写道注释之中了) 3. 队列与栈的代码 4. 重要是理解物理逻辑&a…...
GitHub 趋势日报 (2025年05月12日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型,一键生成高清短视频使用…...
ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107+ 种语言
一、软件介绍 文末提供程序和源码下载 ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107 种语言。从电子书到带有章节和元数据的有声读物的 CPU/GPU 转换器,使用 XTTSv2、Bark、Vits、Fairseq、YourTTS …...
《算法导论(第4版)》阅读笔记:p39-p48
《算法导论(第4版)》学习第 13 天,p39-p48 总结,总计 10 页。 一、技术总结 1. recurrence/recurrence equation 书里面 recurrence(递归式) 和 recurrence equation(递归方程) 指的是同一个东西。 二、英语总结(生词:2) 1. squint (1)…...
c语言第一个小游戏:贪吃蛇小游戏07
贪吃蛇吃饭喽 所谓贪吃蛇的食物,也就是创建一个和蛇身一样的结构体,只是这个结构体不是链表,也是将这个结构体设置hang和lie坐标,放进gamepic进行扫描,扫到了就也是做操作将 ## 打出来 #include <curses.h> #i…...
(七)深度学习---神经网络原理与实现
分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.神经网络原理概述 二.神经网络的训练方法 三.基于Ker…...
VSCode中Node.js 使用教程
一、visual studio code下载与安装 二、修改vscode主题颜色 三、汉化 菜单view-->Command Palette...,输入Configure Display Language。 重启之后如下: 四、安装node.js Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,使用了事件驱动、非阻…...
web 自动化之 KDT 关键字驱动详解
一、什么是关键字驱动? 1、什么是关键字驱动?(以关键字函数驱动测试) 关键字驱动又叫动作字驱动,把项目业务封装成关键字函数,再基于关键字函数实现自动化测试 2、关键字驱动测试原理 关键字驱动测试是一…...
web 自动化之 yaml 数据/日志/截图
文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…...
基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
数学复习笔记 6
前言 复习一下行列式的一些基本的题。感觉网课有点没跟上了。今天花点时间跟上网课的进度。要紧跟进度,然后剩下的时间再去复习前面的内容。多复习,提升自己的解题能力。 行列式和矩阵 三年级,我现在是三年级下册。。。马上就要结束大学的…...
JS Map使用方法
JS Map使用方法 Map 是 ES6 引入的一种新的数据结构,它类似于对象(Object),但提供了更强大的键值对存储功能。 文章目录 JS Map使用方法基本特性基本用法创建 Map常用方法遍历方法 与 Object 的区别实际应用示例示例1:…...
大模型分布式光伏功率预测实现详解
一、引言 随着全球能源结构向可再生能源转型,光伏发电作为清洁能源的重要组成部分,其装机容量持续快速增长。然而,光伏发电具有显著的间歇性和波动性特点,给电力系统的稳定运行带来了巨大挑战。准确的光伏功率预测对于电网调度、电力市场交易和电站运营管理至关重要。近年…...
武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集
作者:Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位:武汉大学计算机学院 论文标题:RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…...
【LLM模型】如何构建自己的MCP Server?
什么是 MCP? Model Context Protocol (MCP) 是一种协议,它允许大型语言模型(LLMs)访问自定义的工具和服务。Trae 中的智能体作为 MCP 客户端可以选择向 MCP Server 发起请求,以使用它们提供的工具。你可以自行添加 MC…...
SQL 索引优化指南:原理、知识点与实践案例
SQL 索引优化指南:原理、知识点与实践案例 索引的基本原理 索引是数据库中用于加速数据检索的数据结构,类似于书籍的目录。它通过创建额外的数据结构来存储部分数据,使得查询可以快速定位到所需数据而不必扫描整个表。 索引的工作原理 B-…...
java基础-方法的重写、super关键字
1.定义:子类可以根据需要改写从父类那继承来的方法,执行时,子类的方法会覆盖父类的方法 2.要求: (1)子类和父类的方法必须同名,同参数列表 (2)父类中private修饰的方法…...
技术并不能产生一个好的产品
技术是产生一个好的产品充分条件,不是必要条件。 当笔者到了40岁的年龄时间,发现再怎么努力提升技术,也没办法挽救烂的产品设计。 一个好的产品,首先要找准自己的定位,不能动不动就把自己拿一线品牌来比较。 好的产品…...
lubuntu 系统详解
Lubuntu 系统详解:轻量高效的 Ubuntu 衍生版 一、系统概述 定位与背景: Lubuntu 是 Ubuntu 的官方衍生版本(Flavor),专注于轻量性与高效性,旨在为低配置设备(如老旧电脑、上网本、低配笔记本 …...
《设备管理与维修》审核严吗?“修改后再投”是拒稿了吗?
有过论文投稿经验的朋友,可能在审核后收到过“修改后再投”的回复。有些期刊可能是真的建议投稿人在修改后再投稿,有些则可能是标准的拒稿模板。 《设备管理与维修》审核严吗?收到“修改后再投”的回复该怎么办?下面我就来分享下之…...
2025年5月-信息系统项目管理师高级-软考高项一般计算题
决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时,npv越大越好...
界面组件DevExpress WPF中文教程:Grid - 如何自定义Band Header外观?
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
Supabase 的入门详细介绍
Supabase 是什么? 简单来说,Supabase 是一个开源的 Firebase 替代品。它提供了一整套后端即服务 (BaaS - Backend as a Service) 的工具,让你能够快速构建应用程序的后端,而无需自己从头搭建和管理服务器、数据库等基础设施。 S…...
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
🚀🔧【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)📊 📑 目录 🚀🔧【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全…...
20、map和set、unordered_map、un_ordered_set的复现
一、map 1、了解 map的使用和常考面试题等等,看这篇文章 map的key是有序的 ,值不可重复 。插入使用 insert的效率更高,而在"更新map的键值对时,使用 [ ]运算符效率更高 。" 注意 map 的lower和upper那2个函数&#x…...
leetcode 189. 轮转数组
题目描述 代码: class Solution { public:void rotate(vector<int>& nums, int k) {int len nums.size();k k % len;reverse(nums,0,len-1);reverse(nums,0,k-1);reverse(nums,k,len-1);}void reverse(vector<int>& nums,int left,int right…...
得物0509面试手撕题目解答
题目 使用两个栈(一个无序栈和一个空栈)将无序栈中的元素转移到空栈,使其有序,不允许使用其他数据结构。 示例:输入:[3, 1, 6, 4, 2, 5],输出:[6, 5, 4, 3, 2, 1] 思路与代码 如…...
8天Python从入门到精通【itheima】-6~10
目录 7节-开发出第一个Python程序: 1.在cmd窗口写下第一个最简单的程序:Hello World!!! 9节: 1.如何卸载python: 2.报错:不是可运行的程序 编辑 3.报错:无法初始化设备PRN: 4.报错&…...
Qt —— 使用Enigma Virtual Box将Qt程序打包为独立可运行exe(附:完整打包方法且完美运行)
🔔 Qt 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 打包结果 1、如下图,准备好Qt已打包后程序文件夹。附 Qt —— 在Windows下打包Qt应用程序(在其他Windows电脑下使用)...
大语言模型RLHF训练框架全景解析:OpenRLHF、verl、LLaMA-Factory与SWIFT深度对比
引言 随着大语言模型(LLM)参数规模突破千亿级,基于人类反馈的强化学习(RLHF)成为提升模型对齐能力的关键技术。OpenRLHF、verl、LLaMA-Factory和SWIFT作为开源社区的四大标杆框架,分别通过分布式架构、混合…...
VTK|类似CloudCompare的比例尺实现1-源码分析
文章目录 CloudCompare源码分析void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)🧩 总体功能🧠 函数逐步解析✅ 1. 断言只在正交模式下使用✅ 2. 计算显示的实际长度✅ 3. 字体和图形区域准备✅ 4. 计算比例尺图形的绘制位置✅ 5.…...
【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析
基于Tesseract与OpenCV的字符识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线1) 形态学操作2) 自适应阈值 2.2 Tesseract OCR引擎 3. 实战部署指南3.1 环境配置3.2 项目结构优化建议3.3 增强版代码实现 4. 常见问题与解决方案4.1 Tesseract路径错误4.2…...
CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开
苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁,该漏洞可能允许恶意应用程序突破沙箱限制,获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证(PoC)利用代码后,该漏洞已在macOS Se…...
使用CAS操作实现乐观锁的完整指南
乐观锁是一种高效的并发控制机制,而CAS(Compare-And-Swap)是实现乐观锁的核心技术。下面我将详细介绍如何通过CAS操作实现乐观锁。 一、CAS操作原理 CAS(Compare-And-Swap)是一种原子操作,包含三个操作数: 内存位置(V)预期原值(A)新值(B) …...
java之网络编程
文章目录 网络编程概述什么是网络编程基本的通信架构CS架构BS架构 Java提供了哪些网络编程解决方案? 网络编程三要素IPIP地址IP域名(Domain Name)DNS域名解析(Domain Name System)公网IP、内网IP本机IPInetAddress类In…...
苍穹外卖--新增菜品
1.需求分析和设计 产品原型 业务规则: 菜品名称必须是唯一的 菜品必须属于某个分类下,不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计: 根据类型查询分类(已完成) 文件上传 新增菜品 根据类型…...
Spark处理过程-转换算子
(一)RDD的处理过程 Spark使用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。RDD的处理过程如图所示; RDD经过一系列的“转换”操作,每一次转换都会产生不同的RDD,以供给下一次“转换”操作使…...
运行Spark程序-在Spark-shell——RDD
一、基本概念 RDD(弹性分布式数据集)是 Apache Spark 的核心抽象,是 Spark 提供的最基本的数据处理单元。理解 RDD 的概念对于掌握 Spark 编程至关重要。以下是 RDD 的核心概念和特性: 1. 什么是 RDD? 定义…...
Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案
程序启动时优化的价值 在桌面软件开发领域,应用程序的启动过程就像音乐的序曲,决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时,会让大多数用户产生负面看法,而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...
vue3父子组件传值
父 → 子:props 父组件 <template><ChildComponent :message"parentMessage" :user"user" /> </template><script setup> import ChildComponent from ./ChildComponent.vue; const parentMessage Hello from paren…...
中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果
品牌,作为企业不可或缺的隐形财富,在当今竞争激烈的市场环境中,其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品,激光院激光公司于2020年3月7日正式注册“风采”商标,创建拥有自主知识产权…...
合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent
随着大模型及Agent技术的飞速发展,通过大模型调用外部工具正在成为AI应用开发的新范式。然而,由于不同大模型的调用结构和参数格式各异,开发者需要分别编写工具调用逻辑,AI工具集成效率低下,MCP(Model Cont…...
佰力博科技与您探讨表面电阻的测试方法及应用领域
表面电阻测试是一种用于测量材料表面电阻值的技术,广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法: 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中,平行电极法通过在试样…...