MyBatis 详解

1. 什么是 MyBatis?

MyBatis 是一款优秀的 持久层框架,它通过 XML 或注解配置,将 Java 对象(POJO)与数据库操作(SQL)进行灵活映射,简化了 JDBC 的复杂操作。

  • 核心思想SQL 与代码分离,开发者可专注 SQL 优化,同时享受 ORM(对象关系映射)的便捷。

  • 定位:介于 JDBC 和全自动 ORM(如 Hibernate)之间的半自动化框架,灵活控制 SQL,适合复杂查询和高性能场景。


2. 核心特性
特性说明
动态 SQL支持条件分支(<if><choose>)、循环(<foreach>)等动态生成 SQL。
参数映射自动将 Java 对象属性映射到 SQL 参数(#{property})。
结果集映射将查询结果自动封装为 Java 对象(<resultMap>)。
缓存机制提供一级缓存(SqlSession 级别)和二级缓存(Mapper 级别)。
插件扩展支持自定义插件(如分页、日志),通过拦截器修改 MyBatis 核心行为。

3. 核心组件

    1.SqlSessionFactory

  • 作用:创建 SqlSession 的工厂类,全局唯一,通常由 SqlSessionFactoryBuilder 解析配置文件生成。

  • 配置来源:XML 文件(如 mybatis-config.xml)或 Java 代码。

    2.SqlSession

  • 作用:执行 SQL 操作、获取 Mapper 接口实例。非线程安全,需确保每次请求单独创建。

  • 关键方法

    <T> T getMapper(Class<T> type);  // 获取 Mapper 接口实例
    int insert(String statement, Object parameter);  // 直接执行 SQL

    3.Mapper 接口与 XML 映射文件

  • Mapper 接口:定义数据库操作方法,方法名与 XML 中的 SQL ID 对应。

  • XML 映射文件:编写 SQL 语句,配置参数/结果映射。

    4.Executor

  • 作用:SQL 执行器,处理缓存、事务、语句调度等核心逻辑。

  • 类型SimpleExecutor(默认)、ReuseExecutor(重用预处理语句)、BatchExecutor(批处理)。


4. 工作原理
  1. 配置加载

    • 解析 mybatis-config.xml,初始化数据源、事务管理器、Mapper 扫描路径等。

    • 加载 Mapper XML 文件或扫描 Mapper 接口,构建 SQL 映射关系。

  2. SqlSession 创建

    • 通过 SqlSessionFactory.openSession() 创建 SqlSession,内部包含 Executor 和事务控制。

  3. SQL 执行流程

    • Mapper 代理:通过动态代理(如 MapperProxy)将接口方法调用转发给 SqlSession。

    • SQL 解析:根据方法名找到对应的 SQL 语句,处理动态标签(如 <if>)。

    • 参数处理:将 Java 对象转换为 SQL 参数(ParameterHandler)。

    • SQL 执行:通过 Executor 执行 JDBC 操作,返回结果。

    • 结果映射:将 ResultSet 转换为 Java 对象(ResultSetHandler)。


5. 缓存机制
缓存级别作用范围生命周期开启方式
一级缓存SqlSession 级别随 SqlSession 关闭或清空默认开启
二级缓存Mapper 级别应用生命周期,可跨 SqlSession 共享XML 中配置 <cache/> 标签开启

6. 常见问题
  1. MyBatis 与 Hibernate 的区别?

    • MyBatis:半自动化,需手动写 SQL,灵活控制细节。

    • Hibernate:全自动化,通过 HQL 操作对象,适合快速开发。

  2. #{} 和 ${} 的区别?

    • #{}:预编译参数(防 SQL 注入),如 WHERE id = ?

    • **∗∗:字符串替换(慎用),如动态表名‘ORDERBY∗∗:字符串替换(慎用),如动态表名‘ORDERBY{column}`。

  3. 如何实现分页?

    • 物理分页:使用插件(如 PageHelper)或数据库方言(LIMIT)。

    • 内存分页:查询全部数据后在代码中分页(不推荐)。


7. 总结
  • 优势:灵活控制 SQL、动态 SQL 强大、性能优化空间大。

  • 适用场景:复杂查询、需深度优化 SQL、对数据库访问有精细控制需求的项目。

  • 学习路径:掌握 XML/注解配置 → 理解动态 SQL → 熟悉缓存机制 → 整合 Spring/Spring Boot。


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

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

相关文章

循环神经网络 - 深层循环神经网络

如果将深度定义为网络中信息传递路径长度的话&#xff0c;循环神经网络可以看作既“深”又“浅”的网络。 一方面来说&#xff0c;如果我们把循环网络按时间展开&#xff0c;长时间间隔的状态之间的路径很长&#xff0c;循环网络可以看作一个非常深的网络。 从另一方面来 说&…

GoLand 标红但程序可正常运行:由符号索引缓存失效引起的假报错问题

问题描述&#xff1a; 在 GoLand 中&#xff0c;api/tls.go 文件中引用了 api/type.go 中定义的结构体 Options&#xff0c;但 GoLand 把 Options 标红显示为未定义&#xff08;undefined symbol&#xff09;&#xff0c;尽管程序实际可以正常编译和运行&#xff08;go build /…

python-各种文件(txt,xls,csv,sql,二进制文件)读写操作、文件类型转换、数据分析代码讲解

1.文件txt读写标准用法 1.1写入文件 要读取文件&#xff0c;首先得使用 open() 函数打开文件。 file open(file_path, moder, encodingNone) file_path&#xff1a;文件的路径&#xff0c;可以是绝对路径或者相对路径。mode&#xff1a;文件打开模式&#xff0c;r 代表以…

Uniapp:确认框

目录 一、 出现场景二、 效果展示三、具体使用 一、 出现场景 在项目的开发中&#xff0c;会经常出现删除数据的情况&#xff0c;如果直接删除的话&#xff0c;可能会存在误删&#xff0c;用户体验不好&#xff0c;所以需要增加一个消息提示&#xff0c;提醒用户是否删除。 二…

解密 Vue 打包策略

1. 总体概述 在现代前端开发中&#xff0c;Vue 已成为流行框架之一&#xff0c;开发者通常使用 webpack、vite 或 vue-cli 来构建项目。可能会困惑&#xff1a; 为什么源码中的资源引用路径与打包后实际产出的路径会不一样&#xff1f;静态路径与动态路径到底如何正确书写&am…

Golang|接口并发测试和压力测试

文章目录 这里出现某些奖品和数据库中库存量不一致的问题原因就是在并发的情况下&#xff0c;sync.Map仍然会出现脏写问题&#xff0c;就是在同时操作下的操作覆盖问题可以先把数据放到channel里&#xff0c;然后用一个单一的协程负责读取channel并写入map

CentOS下,Xftp中文文件名乱码的处理方式

乱码原因 中文版Windows默认使用GBK编码&#xff0c;现代Linux发行版&#xff08;如CentOS、Ubuntu等&#xff09;默认使用UTF-8编码。Windows下正常的编码&#xff0c;可能在linux下无法识别&#xff0c;例如&#xff1a;Windows的GBK字节0xD6D0被Linux用UTF-8解码时&#xf…

解决 Vue 中 input 输入框被赋值后,无法再修改和编辑的问题

目录 需求&#xff1a; 出现 BUG&#xff1a; Bug 代码复现 解决问题&#xff1a; 解决方法1&#xff1a; 解决方法2 关于 $set() 的补充&#xff1a; 需求&#xff1a; 前段时间&#xff0c;接到了一个需求&#xff1a;在选择框中选中某个下拉菜单时&#xff0c;对应的…

【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现

项目视频介绍&#xff1a; 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介&#xff1a; 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…

【Vue】案例——To do list:

【Vue】案例——To do list&#xff1a; 一、案例介绍&#xff1a;二、效果展示&#xff08;如图&#xff09;三、主要功能&#xff1a;四、技术要点&#xff1a;补充&#xff1a;【Vue】Vue模板语法(点击可跳转)补充&#xff1a;【Vue】数据绑定&#xff08;单双向&#xff09…

导入 .sql 文件到 云服务器上的MySQL中

导入 .sql 文件到 云服务器上的MySQL中 步骤 1&#xff1a;确保 .sql 文件已上传到云服务器步骤 2&#xff1a;登录到云服务器步骤 3&#xff1a;检查文件是否成功传输步骤 4&#xff1a;登录 MySQL步骤 5&#xff1a;创建空数据库&#xff08;如果尚未创建&#xff09;步骤 6&…

我的机器学习之路(初稿)

文章目录 一、机器学习定义二、核心三要素三、算法类型详解1. 监督学习&#xff08;带标签数据&#xff09;2. 无监督学习&#xff08;无标签数据&#xff09;3. 强化学习&#xff08;决策优化&#xff09;(我之后主攻的方向) 四、典型应用场景五、学习路线图六、常见误区警示七…

VueDOMPurifyHTML 防止 ​​XSS(跨站脚本攻击)​​ 风险

VueDOMPurifyHTML 是一个 ​​Vue.js 插件​​&#xff0c;用于在 v-html 指令中安全地渲染 HTML 内容&#xff0c;防止 ​​XSS&#xff08;跨站脚本攻击&#xff09;​​ 风险。 ​​作用​​ ​​解决 v-html 的安全问题​​ Vue 的 v-html 会直接渲染原始 HTML&#xff0…

【数据结构】之散列

一、定义与基本术语 &#xff08;一&#xff09;、定义 散列&#xff08;Hash&#xff09;是一种将键&#xff08;key&#xff09;通过散列函数映射到一个固定大小的数组中的技术&#xff0c;因为键值对的映射关系&#xff0c;散列表可以实现快速的插入、删除和查找操作。在这…

How AI could empower any business - Andrew Ng

How AI could empower any business - Andrew Ng References 人工智能如何为任何业务提供支持 empower /ɪmˈpaʊə(r)/ vt. 授权&#xff1b;给 (某人) ...的权力&#xff1b;使控制局势&#xff1b;增加 (某人的) 自主权When I think about the rise of AI, I’m reminded …

微服务的服务调用详解以及常见解决方案对比

微服务服务调用详解 1. 服务调用分类 服务调用根据通信方式、同步性、实现模式可分为以下类型&#xff1a; 按通信协议分类 类型典型协议/框架特点RPC&#xff08;远程过程调用&#xff09;Dubbo、gRPC、Apache Thrift高性能、二进制协议、强类型定义HTTP/RESTSpring RestTe…

MySQL:B+树索引

InnoDB索引方案 为了使用二分法快速定位具体的目录项&#xff0c;假设所有目录项都可以在物理存储器上连续存储&#xff0c;有以下问题&#xff1a; InnoDB使用页为管理存储空间的基本单位&#xff0c;最多只能保证16KB的连续存储空间&#xff0c;记录数据量多可能需要非常大…

THCON 2025

Crypto OTPas_ouf 用10个字符异或加密的jpg图片&#xff0c;通过头得到key再恢复原图 Mammoths Personnal Slot Machine 梅森旋转恢复 from pwn import * from randcrack import RandCrack from tqdm import trange context.log_level errorp remote(74.234.198.209, 33…

3.8 字符串的常用函数

重点&#xff1a;字符串的常用函数 #1.测试转换大小写 lower:大写->小写 upper&#xff1a;小写->大写 swapcase&#xff1a;自动将大写转小写小写转大写 print("ABC".lower()) #abcprint("abc".upper()) #ABCprint…

Docker:SkyWalking 链路追踪的技术指南

1、简述 Apache SkyWalking 是一个开源的 APM(应用性能监控)工具,能够实现分布式系统的全链路监控、性能分析以及服务依赖关系分析。SkyWalking 支持多种语言的探针,提供强大的可视化监控和分析能力,是微服务架构下性能调优和问题排查的利器。 样例代码: https://gitee.…