mybaits 面试题总结(上)

简介: MyBatis 是一款半 ORM 框架,简化了 JDBC 的繁琐操作,让开发者专注于 SQL 语句编写。它支持 XML 或注解配置,能将 POJO 映射至数据库记录,提供动态 SQL 功能。相比 JDBC,它大幅减少冗余代码,提升数据库兼容性,并与 Spring 融合良好。

一、什么是 MyBatis?

1、MyBatis 是一个半 ORM (对象关系映射) 框架,它内部封装了 JDBC, 开发时只需要关注 SQL 语句本身,不需要花费精力处理加载驱动、创建连接、创建 statement 等复杂的过程。程序员直接编写原生 SQL, 可以严格控制 SQL 执行性能,灵活度高。

2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射数据库中记录。避免了大部分的 JDBC 代码和手动设置参数以及获取结果集。

二、MyBatis 的优点

1、基于 SQL 语句编程,只要你对 SQL 语句熟悉就已经成功了大半。因为 SQL 写在 XML 中,解除了 SQL 和程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并且可以重用。

2、和 JDBC 相比,减少了大部分的冗余代码,消除了 JDBC 大量冗余的代码。不需要手动开关连接。

3、数据库兼容性特别高(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。

4、和 Spring 框架能够更好的集成。

三、MyBatis 框架的缺点

1、SQL 语句编写工作量较大。尤其当字段多、关联表多时。对开发人员编写 SQL 语句的功底有一定的要求。

2、SQL 语句依赖数据库,导致数据库移植性差,不能随意更换数据库。

四、MyBatis 和 Hibernate 有哪些不同?

1、MyBatis 和 Hibernate 不同的是,MyBatis 是一个半 ORM 框架,因为 MyBatis 需要程序员自己编写 SQL 语句。

2、MyBatis 直接编写原生 SQL, 可以严格控制 SQL 执行性能,灵活度高。适合对关系数据模型要求不高的软件开发,因为这种系统需求变化频繁,一旦需求变化需要迅速输出成果。但是 MyBatis 做不到数据库无关性,如果需要多种数据库连接,需要自定义多套 SQL 映射文件。

3、Hibernate 对象关系映射能力强,数据库无关性好,对于关系模型要求高的系统,Hibernate 可以节省很多代码。

五、#{} 和 ${} 的区别是什么?

{} 是预编译处理、${} 是字符串替换。MyBatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ?号,调用 PreparedStatement 的 set 方法赋值。在处理 ${} 时,直接把 ${} 替换成实际的值。 使用 #{} 可以防止有效的 SQL 注入,提高系统的安全性。

六、MyBatis 是如何进行分页的?分页插件的原理是什么?

MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,不是非物理分页。可以在 SQL 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL, 然后重写 SQL 根据 dialect 方言,添加对应的物理分页语句语句和物理分页参数。

七、MyBatis 的一级缓存、二级缓存

MyBatis 提供了两级缓存机制:一级缓存(Local Cache)和二级缓存(Secondary Cache)。这两级缓存机制在优化数据库查询、提高应用程序性能方面起着重要作用。

1、一级缓存(Local Cache)

一级缓存是 MyBatis 的默认缓存机制,它是基于 SqlSession 的,也就是说,每个 SqlSession 都会有一个独立的一级缓存区域。一级缓存的作用域是 SqlSession 级别的,当在同一个 SqlSession 中执行相同的查询时,MyBatis 会从一级缓存中直接返回结果,而不会再次查询数据库,从而提高了查询效率。

特点:

  • 作用域:SqlSession 级别。
  • 生命周期:与 SqlSession 生命周期相同,当 SqlSession 关闭或提交事务后,一级缓存中的数据会被清空。
  • 数据共享:只在当前 SqlSession 内部共享数据。

注意事项:

  • 当执行更新、删除、插入操作时,MyBatis 会清空当前 SqlSession 的一级缓存,以保证缓存数据与数据库的一致性。
  • 不同的 SqlSession 之间的一级缓存是互相隔离的。

2、 二级缓存(Secondary Cache)

二级缓存是跨 SqlSession 的,它的作用域是 Mapper 映射文件级别的。多个 SqlSession 可以共享同一个二级缓存区域的数据。当多个 SqlSession 执行相同的查询时,如果二级缓存开启且数据未过期,MyBatis 会直接从二级缓存中返回结果,避免了多次查询数据库。

特点:

  • 作用域:Mapper 映射文件级别(可以细粒度到 namespace)。
  • 生命周期:依赖于 MyBatis 的配置文件和具体的缓存实现,可以配置缓存的过期时间等。
  • 数据共享:多个 SqlSession 可以共享同一个二级缓存中的数据。

开启和使用二级缓存的步骤:

  1. 在 mybatis-config.xml 配置文件中开启二级缓存支持。
  2. 在 Mapper 映射文件中使用 <cache/> 标签来启用二级缓存。
  3. 序列化:由于二级缓存数据是跨 SqlSession 的,所以存储在二级缓存中的数据必须是可序列化的。
  4. 注意事项:当更新数据时,需要手动清空二级缓存或配置缓存策略(如使用 Redis、Ehcache 等外部缓存时)以保证数据一致性。

注意事项:

  • 并非所有的查询都适合使用二级缓存,对于频繁变动的数据,使用二级缓存可能会带来数据一致性问题。
  • 在分布式系统中,二级缓存可能需要配合分布式缓存解决方案(如 Redis)来实现。

综上所述,MyBatis 的一级缓存和二级缓存各有其特点和适用场景。在实际应用中,可以根据具体需求和数据特性来选择合适的缓存策略,以达到最优的性能和数据一致性。

目录
相关文章
|
JavaScript
使用nodejs连接ftp上传下载
使用nodejs连接ftp,进行ftp的操作,包括列表、上传、下载以及速率等。
使用nodejs连接ftp上传下载
|
11月前
|
监控 Linux 应用服务中间件
Debian 中使用 less +F 实现实时日志查看(新手友好版 Linux 日志监控教程)
本文介绍在Debian系统中使用`less +F`实时查看日志的方法,详解其命令用法、快捷键操作及与`tail -f`的区别,帮助Linux用户高效监控日志,适合新手快速上手。
|
机器学习/深度学习 人工智能 搜索推荐
Deep Search 如何理解业务仓库代码?
本文系统地介绍了 Deep Search 和 Deep Research 的概念、与传统 RAG 的区别、当前主流的商业产品与开源方案、在代码领域的应用(如 Deep Search for 仓库问答)以及未来的发展规划。
1142 21
Deep Search 如何理解业务仓库代码?
|
10月前
|
安全 API Windows
【Azure APIM】如何解决后端API服务配置自签名证书时APIM请求报错500:Error occured while calling backend service
本文介绍在Azure API管理(APIM)中使用自签名证书时,因CA证书不受信任导致后端HTTPS连接失败的问题及解决方案。通过分析错误日志和验证流程,指出需将根CA和中间CA证书分别上传至APIM的受信任证书库,并强调仅上传完整链PFX文件无效。最终按正确步骤上传CER格式的CA证书后,问题得以解决,实现安全通信。
325 4
|
安全 Linux 数据安全/隐私保护
掌握文件权限:理解Linux chomod
文件权限是Linux系统安全管理的核心,chmod命令作为调整文件权限的关键工具,帮助管理员灵活设置用户对文件的读取、写入和执行权限。通过数字或符号表示权限,如“755”分别赋予所有者完全访问及组用户和其他人仅读与执行权。此外,chmod支持递归修改(-R)、添加(+)、删除(-)或替换(=)权限,确保系统资源的安全访问。掌握chmod的最佳实践对于维护系统安全至关重要,例如定期审核权限和谨慎使用递归选项。
658 5
|
弹性计算 负载均衡 网络协议
阿里云SLB深度解析:从流量分发到架构优化的技术实践
本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
1175 76
|
人工智能 开发工具
AI实时互动:3项核心能力发布
AI实时互动是帮助企业快速构建AI音视频通话应用的解决方案。用户可通过简单操作在10分钟内创建专属AI智能体,并实现与终端用户的实时交互。已为钉钉、陌陌、网商银行等上千家企业提供服务,支持语义断句、AI声学V2.5及电话通话功能,提升多场景沟通体验。
605 3
|
人工智能 自然语言处理 JavaScript
专为 Claude Code 设计的基于 YAML 的 Playwright MCP 自动化测试
YAML配置结合Claude Code与Playwright MCP,将自动化测试变得人人可用。通过简洁的YAML语法替代复杂的JavaScript代码,解决传统测试中冗长、硬编码和复用性差等问题。自然语言描述测试步骤,AI解析执行,支持多环境切换与智能报告生成,极大降低技术门槛,提升团队协作效率。无论是开发、QA还是产品经理,都能轻松参与测试流程,真正实现可读、易维护的自动化测试新范式。
4893 3
|
存储 安全 数据管理
服务器违规资源被删,数据定时备份OSS 云存储才是 “救命稻草”
在数字化时代,数据已成为企业与个人的核心资产。然而,服务器违规、硬件故障等问题频发,导致数据丢失、业务中断,甚至造成不可挽回的损失。为保障数据安全与业务连续性,定时备份至关重要。阿里云国际站OSS提供高效、可靠的云存储解决方案,支持自动定时备份,帮助用户轻松应对数据风险。本文详解OSS备份操作步骤与注意事项,助你为数据穿上“防护甲”,实现安全无忧存储。
|
数据采集 人工智能 运维
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
748 0