MyBatis 知识点总结
一、MyBatis 简介MyBatis是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作可以使用简单的 XML 或注解来配置和映射原生信息将接口和 Java 的 POJOsPlain Old Java Objects普通的 Java 对象映射成数据库中的记录。二、核心组件与工作原理1. 核心组件SqlSessionFactoryBuilder用于创建 SqlSessionFactory 实例。SqlSessionFactory每个 MyBatis 应用的核心用于创建 SqlSession 实例。SqlSession包含了执行 SQL 命令所需的所有方法是 MyBatis 与数据库交互的会话。ExecutorMyBatis 执行器负责 SQL 语句的生成和查询缓存的维护。MappedStatement封装了 SQL 语句的映射信息。ParameterHandler负责将用户传递的参数转换成 JDBC Statement 所需的参数。ResultSetHandler负责将 JDBC 返回的 ResultSet 结果集对象转换成 List 集合。2. 工作原理读取 MyBatis 配置文件mybatis-config.xml和映射文件Mapper.xml。通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory。SqlSessionFactory 创建 SqlSession。SqlSession 调用 Executor 执行器执行映射文件中定义的 SQL。Executor 通过 MappedStatement 对象获取 SQL 信息通过 ParameterHandler 设置参数通过 ResultSetHandler 处理结果集。返回处理结果。三、配置文件详解1. 核心配置文件mybatis-config.xml?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- 环境配置 -- environments defaultdevelopment environment iddevelopment transactionManager typeJDBC/ dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/mybatis_db/ property nameusername valueroot/ property namepassword value123456/ /dataSource /environment /environments !-- 映射器配置 -- mappers mapper resourcecom/example/mapper/UserMapper.xml/ /mappers /configuration2. 映射文件Mapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mapper.UserMapper !-- 结果映射 -- resultMap iduserResultMap typecom.example.entity.User id propertyid columnid/ result propertyusername columnusername/ result propertyemail columnemail/ /resultMap !-- 查询语句 -- select idselectUserById resultMapuserResultMap SELECT * FROM user WHERE id #{id} /select /mapper四、动态 SQLMyBatis 的动态 SQL 功能是其核心特性之一它允许在 XML 映射文件中编写灵活的 SQL 语句根据传入参数的条件动态地拼接 SQL 片段从而避免了在 Java 代码中拼接字符串的繁琐和潜在的安全风险。1. 动态 SQL 标签if 标签作用根据条件判断是否包含 SQL 片段。属性test属性用于指定 OGNL 表达式表达式结果为 true 时标签内的 SQL 会被包含。select idfindActiveUser resultTypeUser SELECT * FROM user WHERE status ACTIVE if testusername ! null and username ! AND username #{username} /if if testemail ! null AND email #{email} /if /selectchoose, when, otherwise 标签作用实现多分支条件选择类似于 Java 中的switch-case-default语句。select idfindUserByState resultTypeUser SELECT * FROM user WHERE choose when teststate ACTIVE status ACTIVE /when when teststate INACTIVE status INACTIVE /when otherwise status IS NOT NULL /otherwise /choose /selecttrim, where, set 标签where智能处理 WHERE 子句。只有当其包含的标签有返回值时才会插入 “WHERE” 关键字。如果标签返回的内容以 “AND” 或 “OR” 开头它会自动将其去除。!-- 使用 where 标签避免 WHERE 后直接跟 AND 导致语法错误 -- select idfindUsers resultTypeUser SELECT * FROM user where if testusername ! null AND username #{username} /if if testemail ! null AND email #{email} /if /where /selectset智能处理 UPDATE 语句中的 SET 子句。它会动态地在行首添加 SET 关键字并会删掉无关的逗号。update idupdateUser UPDATE user set if testusername ! nullusername #{username},/if if testemail ! nullemail #{email},/if if teststatus ! nullstatus #{status},/if /set WHERE id #{id} /updatetrim功能更强大的标签可以自定义前缀、后缀以及要删除的前缀/后缀字符串。可用于替代where或set。!-- 用 trim 实现 where 标签的功能 -- select idfindUsers resultTypeUser SELECT * FROM user trim prefixWHERE prefixOverridesAND |OR if testusername ! null AND username #{username} /if if testemail ! null AND email #{email} /if /trim /selectforeach 标签作用遍历集合如 List、Set、数组、Map常用于构建 IN 条件或批量操作。属性collection指定要遍历的集合属性名。item遍历过程中每个元素的别名。index遍历 List 或数组时的索引遍历 Map 时的 key。open遍历开始时添加的字符串。close遍历结束时添加的字符串。separator元素之间的分隔符。!-- 构建 IN 查询 -- select idselectUsersInIds resultTypeUser SELECT * FROM user WHERE id IN foreach collectionids itemid open( separator, close) #{id} /foreach /select !-- 批量插入 -- insert idbatchInsertUsers INSERT INTO user (username, email) VALUES foreach collectionuserList itemuser separator, (#{user.username}, #{user.email}) /foreach /insertbind 标签作用创建一个变量通常用于模糊查询或字符串处理并将其绑定到上下文可以在 OGNL 表达式中使用。select idfindUsersLikeName resultTypeUser bind namepattern value% username % / SELECT * FROM user WHERE username LIKE #{pattern} /select2. 动态 SQL 原理与最佳实践原理MyBatis 在解析 XML 映射文件时会构建一个包含动态 SQL 节点如if,foreach的 SQL 源对象。执行时根据传入的参数对象使用 OGNL 表达式计算每个动态节点的test条件动态地拼接出最终的 SQL 字符串。最佳实践优先使用where和set标签避免 SQL 语法错误。在if的test条件中使用and和or进行逻辑判断注意字符串空值判断testname ! null and name ! 。对于复杂的动态 SQL可以考虑使用sql标签定义可重用的 SQL 片段再用include标签引用提高可维护性。注意性能过于复杂的动态 SQL 可能会影响 SQL 解析和缓存效率。对于固定模式的多条件查询可以考虑使用 MyBatis-Plus 等增强框架的 QueryWrapper。3. 综合示例select idselectByCondition resultTypeUser SELECT * FROM user where if testusername ! null and username ! bind nameusernamePattern value% username % / AND username LIKE #{usernamePattern} /if if teststatusList ! null and statusList.size() 0 AND status IN foreach collectionstatusList itemstatus open( separator, close) #{status} /foreach /if choose when testorderBy name ORDER BY username /when when testorderBy time ORDER BY create_time DESC /when otherwise ORDER BY id /otherwise /choose /where /select五、高级特性1. 一级缓存与二级缓存一级缓存SqlSession 级别默认开启同一个 SqlSession 中执行相同的 SQL 查询第二次会从缓存中获取。二级缓存Mapper 级别需要手动开启多个 SqlSession 共享缓存数据。2. 延迟加载懒加载与立即加载延迟加载Lazy Loading也称为懒加载是指在需要时才加载关联数据。MyBatis 默认使用立即加载但可以通过配置开启延迟加载。立即加载Eager Loading在查询主对象时同时加载所有关联对象的数据。配置延迟加载!-- 在 mybatis-config.xml 中配置 -- settings !-- 开启延迟加载 -- setting namelazyLoadingEnabled valuetrue/ !-- 开启按需加载3.4.1版本默认true -- setting nameaggressiveLazyLoading valuefalse/ /settings映射文件中的配置!-- 在 resultMap 中配置关联关系的加载方式 -- resultMap idblogResultMap typeBlog id propertyid columnid/ result propertytitle columntitle/ !-- 立即加载 -- association propertyauthor columnauthor_id javaTypeAuthor selectselectAuthorById/ !-- 延迟加载 -- collection propertycomments columnid ofTypeComment selectselectCommentsByBlogId fetchTypelazy/ /resultMap立即加载 vs 延迟加载的选择立即加载适用场景关联数据量小且大概率会被使用需要一次性获取完整对象图N1 查询问题不严重的情况延迟加载适用场景关联数据量大可能不会被使用需要优化首次查询性能避免不必要的数据库查询关联对象层级较深的情况延迟加载的实现原理MyBatis 通过动态代理技术CGLIB 或 Javassist创建关联对象的代理。当访问代理对象的属性或方法时才会触发真正的 SQL 查询。3. 插件InterceptorMyBatis 允许在映射语句执行过程中的某些点进行拦截调用可以用于分页、性能监控、SQL 日志等场景。六、常见面试题#{} 和 ${} 的区别是什么#{}预编译处理可以防止 SQL 注入。${}字符串替换直接拼接 SQL 语句存在 SQL 注入风险。MyBatis 如何实现延迟加载通过配置setting namelazyLoadingEnabled valuetrue/开启使用 CGLIB 或 Javassist 创建代理对象在真正访问关联对象时才执行查询。MyBatis 有哪些执行器SimpleExecutor每执行一次 update 或 select就开启一个 Statement 对象用完立刻关闭。ReuseExecutor执行 update 或 select以 SQL 作为 key 查找 Statement 对象存在就使用不存在就创建。BatchExecutor执行 update没有 selectJDBC 批处理不支持 select将所有 SQL 都添加到批处理中等待统一执行。

相关新闻

Java泛型接口详解

Java泛型接口详解

1. 泛型接口概述泛型接口是Java泛型编程的重要组成部分&#xff0c;它允许在接口定义中使用类型参数&#xff0c;从而创建更灵活、类型安全的API。2. 泛型接口的基本语法泛型接口的声明使用尖括号<>来指定类型参数&#xff0c;这些参数可以在接口的方法签名和返回类型中使…

2026/8/8 9:25:52 阅读更多 →
Project计划高效导出Excel:3种方法详解与避坑指南

Project计划高效导出Excel:3种方法详解与避坑指南

1. 从甘特图到数据表&#xff1a;为什么需要将Project计划导出为Excel 在日常的项目管理工作中&#xff0c;我们常常会遇到一个非常具体的需求&#xff1a;如何把在Microsoft Project里精心排布好的项目计划&#xff0c;完整地“搬”到Excel里。这听起来像是一个简单的“另存为…

2026/8/8 9:24:52 阅读更多 →
网站建设应注重实用性:拒绝花哨陷阱,回归商业本质才是硬道理

网站建设应注重实用性:拒绝花哨陷阱,回归商业本质才是硬道理

在这个互联网信息爆炸的时代,如果你去问十个老板或者创业者:“你们公司网站是做什么的?”得到的回答千奇百怪。有的说是品牌展示窗口,有的说是获客渠道,还有的说是为了“跟上时代步伐”。但是,当你真正去审视那些号称价值连城、耗资百万打造的“国际范儿”网站时,你会发…

2026/8/8 9:24:52 阅读更多 →

最新新闻

Windows AI功能彻底移除指南:如何一键清理Copilot、Recall等AI组件,提升系统性能与隐私保护

Windows AI功能彻底移除指南:如何一键清理Copilot、Recall等AI组件,提升系统性能与隐私保护

Windows AI功能彻底移除指南&#xff1a;如何一键清理Copilot、Recall等AI组件&#xff0c;提升系统性能与隐私保护 【免费下载链接】RemoveWindowsAI Force Remove Copilot, Recall and More in Windows 11 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindows…

2026/8/8 19:44:11 阅读更多 →
构建跨平台实时通信应用:libdatachannel轻量级WebRTC库完全指南

构建跨平台实时通信应用:libdatachannel轻量级WebRTC库完全指南

构建跨平台实时通信应用&#xff1a;libdatachannel轻量级WebRTC库完全指南 【免费下载链接】libdatachannel C/C WebRTC network library featuring Data Channels, Media Transport, and WebSockets 项目地址: https://gitcode.com/GitHub_Trending/li/libdatachannel …

2026/8/8 19:44:11 阅读更多 →
如何用DeepFilterNet在3分钟内实现专业级音频降噪?新手必看教程

如何用DeepFilterNet在3分钟内实现专业级音频降噪?新手必看教程

如何用DeepFilterNet在3分钟内实现专业级音频降噪&#xff1f;新手必看教程 【免费下载链接】DeepFilterNet Noise supression using deep filtering 项目地址: https://gitcode.com/GitHub_Trending/de/DeepFilterNet DeepFilterNet是一款基于深度学习的实时音频降噪框…

2026/8/8 19:44:11 阅读更多 →
红黑树插入后哪里失衡:三种修复路径逐层展开

红黑树插入后哪里失衡:三种修复路径逐层展开

&#xff1a;红黑树插入最难的不是记住左旋右旋&#xff0c;而是判断父节点、叔叔节点和祖父节点的颜色与方向。本文从红色新节点为何不破坏黑高讲起&#xff0c;逐层展开叔叔为红、内侧折线和外侧直线三类路径&#xff0c;并用 Java 完整插入与验证程序检查有序性、根颜色和黑…

2026/8/8 19:44:11 阅读更多 →
ZotMoov终极指南:5步实现Zotero文献附件自动化管理

ZotMoov终极指南:5步实现Zotero文献附件自动化管理

ZotMoov终极指南&#xff1a;5步实现Zotero文献附件自动化管理 【免费下载链接】zotmoov Zotero plugin to automatically move attachments and link them 项目地址: https://gitcode.com/gh_mirrors/zo/zotmoov 还在为Zotero中杂乱无章的文献附件而烦恼吗&#xff1f;…

2026/8/8 19:44:11 阅读更多 →
Flipper Zero Sub-GHz无线信号分析实战:车库门安全评估深度指南

Flipper Zero Sub-GHz无线信号分析实战:车库门安全评估深度指南

Flipper Zero Sub-GHz无线信号分析实战&#xff1a;车库门安全评估深度指南 【免费下载链接】Flipper Playground (and dump) of stuff I make or modify for the Flipper Zero 项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper Flipper Zero作为一款多功能渗…

2026/8/8 19:43:11 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及&#xff0c;无数企业下场搭建智能体系统&#xff0c;可落地阶段难题接踵而至&#xff1a;上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节&#xff0c;空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南&#xff1a;用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代&#xff0c;二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起&#xff1a;为什么我们需要一个隐私保护通用组件&#xff1f;最近在维护一个基于uniapp开发的微信小程序矩阵时&#xff0c;我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格&#xff0c;几乎每一个新版本发布&#xff0c;或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流&#xff1a;一个核心问题的诞生想象一下&#xff0c;你是一个城市供水系统的总工程师。你的城市有多个水源&#xff08;水库&#xff09;&#xff0c;需要通过一个复杂的地下管道网络&#xff0c;将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/8 17:02:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →