MyBatis 面试题(二)

1. MyBatis 编程步骤是什么样的?

MyBatis 的编程步骤通常包括以下几个主要阶段:

  1. 创建 MyBatis 配置文件

    • 首先,你需要创建一个 MyBatis 的配置文件(通常是 mybatis-config.xml)。这个文件包含了 MyBatis 的核心配置信息,比如数据源信息、事务管理器配置、别名设置等。
  2. 编写 Mapper 接口和 XML 映射文件

    • 根据业务需求,编写 Mapper 接口,定义数据库操作的方法。
    • 接着,为每个 Mapper 接口编写对应的 XML 映射文件。在 XML 文件中,你需要编写 SQL 语句,并将它们映射到 Mapper 接口的方法上。
  3. 创建数据源和 SqlSessionFactory

    • 配置数据源,它负责连接数据库。
    • 使用 MyBatis 的 SqlSessionFactoryBuilder 读取配置文件,并构建 SqlSessionFactorySqlSessionFactory 是创建 SqlSession 的工厂。
  4. 获取 SqlSession

    • 通过 SqlSessionFactory 获取 SqlSession 对象。SqlSession 代表与数据库的一次会话,执行增删改查等操作都需要通过它。
  5. 执行数据库操作

    • 使用 SqlSessiongetMapper 方法获取 Mapper 接口的实例。
    • 调用 Mapper 接口的方法来执行 SQL 语句,这些方法会映射到 XML 文件中定义的 SQL 语句。
  6. 处理结果

    • Mapper 接口的方法执行后会返回查询结果,你可以根据需要对这些结果进行处理。
  7. 关闭 SqlSession

    • 在完成数据库操作后,记得关闭 SqlSession。虽然 SqlSession 在某些情况下可以自动关闭,但最佳实践是手动关闭以确保资源得到正确释放。
  8. 异常处理

    • 在整个过程中,需要适当处理可能出现的异常,比如 SQL 执行错误、数据库连接问题等。

这些步骤构成了使用 MyBatis 进行数据库编程的基本流程。具体的实现细节可能会因项目的需求和结构而有所不同,但总体流程是相似的。

2. MyBatis 和JDBC有什么区别?

MyBatis和JDBC在数据库访问和操作方面都是重要的工具,但它们之间存在一些明显的区别。

  • 首先,JDBC(Java Database Connectivity)是Java提供的一个用于执行SQL语句的API,它允许Java应用程序与各种关系数据库进行交互。JDBC为开发者提供了与数据库进行连接、执行查询和更新操作的基础功能。然而,使用JDBC进行数据库操作通常需要编写大量的重复代码,如注册驱动、创建连接、创建Statement对象、执行SQL语句以及处理结果集等。此外,JDBC并没有提供对象关系映射(ORM)的功能,开发者需要手动处理Java对象与数据库表之间的映射关系。

  • 相比之下,MyBatis是一个轻量级的持久层框架,它内部封装了JDBC,从而简化了数据库操作的复杂性。MyBatis通过XML文件或注解的方式,允许开发者将SQL语句与Java代码分离,从而在不修改程序代码的情况下,直接在配置文件中修改SQL语句。这使得SQL语句的编写和维护变得更加灵活和方便。此外,MyBatis提供了ORM功能,可以将Java对象与数据库表进行映射,使开发者能够以面向对象的方式来操作数据。MyBatis还提供了缓存机制,以提高程序的性能。

总的来说,JDBC是Java与数据库交互的基础工具,而MyBatis则是一个更高级别的框架,它简化了JDBC的使用,提供了更丰富的功能和更灵活的操作方式。选择使用JDBC还是MyBatis,取决于项目的具体需求和团队的技术栈。对于简单的数据库操作,JDBC可能已经足够;而对于更复杂的场景,MyBatis可能是一个更好的选择。

3. MyBatis 中的缓存机制有啥用?

MyBatis中的缓存机制主要用于提高数据访问的效率,解决高并发系统的性能问题。具体来说,缓存机制的作用主要体现在以下几个方面:

  1. 减少IO操作:通过将经常查询的数据存放在内存中(即缓存),当再次查询这些数据时,可以直接从缓存中获取,而无需每次都去数据库中查询。这样可以显著减少与数据库的交互次数,降低IO操作的频率。
  2. 提高查询效率:缓存机制可以使得相同的查询条件在多次执行时,只需要执行一次数据库操作,后续的操作都可以直接从缓存中获取结果。这大大减少了数据库查询的时间,提高了查询的效率。
  3. 减轻数据库压力:由于缓存机制可以减少与数据库的交互次数,因此也可以减轻数据库的压力,提高系统的整体性能。

MyBatis提供了两种缓存机制:一级缓存和二级缓存。一级缓存是SqlSession级别的,主要用于减少同一个SqlSession中相同的查询语句执行的次数;而二级缓存是mapper级别的,多个SqlSession可以共享一个mapper的二级缓存。

需要注意的是,虽然缓存机制可以提高性能,但也可能导致数据不一致的问题。因此,在使用缓存时,需要权衡性能和一致性的需求,并根据实际情况进行配置和优化。

4. MyBatis 一级缓存和二级缓存的区别?

MyBatis的一级缓存和二级缓存的主要区别体现在它们的作用域、生命周期以及使用方式上。

  1. 作用域和生命周期
  • 一级缓存:作用域限定在单个SqlSession中,生命周期与SqlSession的生命周期相同。当SqlSession关闭时,一级缓存也会被清空。此外,在同一个SqlSession中执行了更新(insert、update、delete)操作,一级缓存也会被清空,以确保缓存中的数据与数据库保持一致。
  • 二级缓存:作用域则是针对mapper的,可以在多个SqlSession之间共享。一个SqlSession执行查询并将结果缓存到二级缓存中,另一个SqlSession可以直接从二级缓存中获取结果,而不必重新执行查询。
  1. 使用方式和目的
  • 一级缓存:当在同一个SqlSession中执行相同的查询时,第一次查询结果会被缓存到一级缓存中,后续相同的查询将直接从缓存中获取结果,而不再发起查询请求。这有助于提高查询效率,减少数据库访问次数。
  • 二级缓存:开启它需要手动进行配置,并且需要保证mapper中的SQL语句是确定的,因为二级缓存是跨SqlSession的。如果多个SqlSession去操作数据库中的同一条数据,任何一次数据的改变都会导致其他SqlSession缓存的失效。二级缓存主要用于减少相同查询的数据库访问次数,提高应用性能。

总结来说,MyBatis的一级缓存和二级缓存各有其特点和适用场景。一级缓存主要用于单个SqlSession内的查询优化,而二级缓存则可以在多个SqlSession之间共享缓存数据,进一步提高查询效率。在实际应用中,可以根据项目的具体需求和性能要求来选择合适的缓存策略。

5. MyBatis 一级缓存和二级缓存是什么数据结构?

MyBatis的一级缓存和二级缓存采用了不同的数据结构来实现。

  • 一级缓存是SqlSession级别的缓存,其数据结构主要是基于HashMap实现的。对于每个SqlSession,MyBatis会为其创建一个HashMap作为一级缓存的存储空间。当执行查询操作时,MyBatis会首先在一级缓存中查找是否有对应的结果,如果找到则直接返回,否则才会执行数据库查询操作并将结果存入一级缓存。由于一级缓存的生命周期与SqlSession绑定,因此当SqlSession关闭或清空缓存时,一级缓存中的数据也会被清除。

  • 二级缓存则是Mapper级别的缓存,其数据结构可能因具体实现而有所不同,但通常也是基于某种形式的键值对存储结构,比如HashMap或ConcurrentHashMap等。多个SqlSession可以共享同一个Mapper的二级缓存,因此二级缓存的数据结构需要能够支持并发访问和线程安全。在MyBatis中,二级缓存的实现可以通过配置不同的Cache实现类来定制,例如使用LRU(最近最少使用)算法进行缓存替换,或者使用FIFO(先进先出)算法等。

需要注意的是,虽然二级缓存可以提高性能,但也可能引入数据一致性问题。因此,在使用二级缓存时,需要确保缓存中的数据与数据库中的数据保持一致,并避免在并发场景下出现数据脏读或脏写的情况。这通常需要通过合理的缓存更新策略、事务管理以及并发控制等手段来实现。

6. MyBatis 中的缓存有哪些实现类型?

MyBatis 中的缓存主要有以下几种实现类型:

  1. 一级缓存

    • 一级缓存是 SqlSession 级别的缓存,非全局的,它的生命周期与 SqlSession 一致。
    • 当我们在同一个 SqlSession 中执行相同的 SQL 语句时,第一次查询后的结果会被缓存在这个 SqlSession 中。如果我们再次执行相同的 SQL 语句,MyBatis 就会直接从缓存中取出结果,而不需要再次访问数据库。
    • 一级缓存默认是开启的,不需要做任何配置。
  2. 二级缓存

    • 二级缓存是全局的,它的生命周期与 SqlSessionFactory 一致。
    • 二级缓存是跨 SqlSession 的,多个 SqlSession 可以共享这个缓存。只要一个 SqlSession 查询过一段数据,其他的 SqlSession 就可以直接从二级缓存中取出结果,而不需要再次访问数据库。
    • 为了克服一级缓存的局限性(即不同的 SqlSession 对象之间不能共享缓存),需要开启二级缓存。但请注意,二级缓存默认是不开启的,需要手动进行配置。
  3. 集成第三方缓存

    • 除了 MyBatis 自带的一级和二级缓存,还可以集成其他第三方的缓存框架,如 EhCache(Java 语言开发)或 Memcache(C 语言开发)等。
    • 这些第三方缓存通常提供更多的缓存策略和管理功能,可以根据项目的具体需求进行选择。

需要注意的是,MyBatis 的缓存主要针对于 DQL 语句,也就是说缓存机制主要对应 select 语句。对于增删改(insert、update、delete)操作,由于会改变数据库中的数据,因此不会进行缓存。

总的来说,MyBatis 提供了灵活多样的缓存实现类型,可以根据项目的具体需求和性能要求来选择合适的缓存策略。

7. MyBatis 默认会开启缓存机制吗? 怎么开启?

MyBatis 默认会开启一级缓存,这是SqlSession级别的缓存,其生命周期与SqlSession一致。当我们在同一个SqlSession中执行相同的SQL语句时,第一次查询后的结果会被缓存在这个SqlSession中,如果我们再次执行相同的SQL语句,MyBatis就会直接从缓存中取出结果,而不需要再次访问数据库。

二级缓存是默认不开启的,需要我们手动去开启。在MyBatis中,可以使用cache标签在mapper的XML映射文件中开启二级缓存。同时,还需要配置对应的缓存提供者实现类,比如Ehcache、Redis等。二级缓存是跨SqlSession的,只要是同一个Mapper,无论使用多少个SqlSession进行操作,数据都是共享的。

总的来说,MyBatis的缓存机制可以提高查询效率,减少与数据库的交互次数,但在使用二级缓存时,也需要注意数据一致性的问题。

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

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

相关文章

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下,虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同,虚拟试衣节省时间、方便客户,并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

抽象类和接口的异同之处

参考链接:C#:浅析接口(interface)与抽象类(abstract)的区别 接口与抽象类的相同点 ​ (1)都不能使用new关键字来实例化 ​ (2)成员方法都没有实现部分&…

【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录 写在前面Tag题目来源解题思路方法一:层序遍历方法二:深度优先搜索 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…

Java静态绑定和动态绑定

java动态绑定和静态绑定 在Java中,绑定是指将一个方法调用与方法体连接起来的过程。Java支持两种类型的绑定:静态绑定(也称为早期绑定)和动态绑定(也称为晚期绑定或虚拟调用)。区分这两种绑定方式主要取决…

串口通信如何控制步进电机转动?

在自动化控制系统中,步进电机的控制是一项重要的技术任务。通过串口通信控制步进电机转动,可以实现远程控制和自动化操作,提高生产效率和降低人工成本。本文将详细介绍串口通信控制步进电机转动的关键步骤和技术要点。 首先,我们…

【Linux】进程和计划任务

目录 一、进程介绍 1.1 进程与线程的定义 1.1.1 进程(Process)** 1.1.2 线程(Thread)** 1.1.3 进程与线程的区别 1.2 进程的特征 1.3 进程状态 1.3.1 进程的基本状态 1.3.2 进程更多的状态 1.4 进程的优先级 1.5 进程间通信 1.6 进程的分类* 二、进程管理 2.1 查看…

使用Python操作SQLite

1、连接数据库 import sqlite3 conn sqlite3.connect(example.db)其中 example.db 是数据库文件名,如果不存在则会自动创建。connect() 方法还可以接收多个参数,用于设置连接属性,如 conn sqlite3.connect(example.db, isolation_levelNo…

【shell编程系统巡检项目】

目录 系统巡检指标信息代码 系统巡检 所谓系统巡检就是就是定时检查系统的各项指标,与监控互补。 指标信息 1.基本信息:主机名,ip地址,公网ip,系统发行版本,内核版本,cpu架构 hostname hostname -i curl…

SpringBoot项目创建及简单使用

目录 一.SpringBoot项目 1.1SpringBoot的介绍 1.2SpringBoot优点 二.SpringBoot项目的创建 三.注意点 一.SpringBoot项目 1.1SpringBoot的介绍 Spring是为了简化Java程序而开发的,那么SpringBoot则是为了简化Spring程序的。 Spring 框架: Spring…

【UKE!】2024.4.19

2024.4.19 【你知道的都是真相。只可惜那些并不是真相的全部。】 Friday 三月十一 谷雨 <BGM “谷雨–音阙诗听”> AC :Answer Coarse,粗劣的答案 ​ CE :Compile Easily,轻松通过 ​ PC :Perfect Compile 完美的编译 ​ WA :Wonderful Answer,好答案 ​ RE :Run Exce…

【InternLM 实战营第二期作业04】XTuner微调LLM:1.8B、多模态、Agent

基础作业 训练自己的小助手认知 1.环境安装 安装XTuner 源码 # 如果你是在 InternStudio 平台&#xff0c;则从本地 clone 一个已有 pytorch 的环境&#xff1a; # pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0studio-conda xtuner0.1.17 # 如果你是在其他平台&#x…

区块链的应用场景及优势

区块链技术具有广泛的应用场景和众多的优势。 金融服务&#xff1a;区块链技术可以改善金融服务的效率与安全性。通过使用分布式账本&#xff0c;可以实现更快捷的支付和结算系统&#xff0c;减少交易的中介环节和成本。区块链还可以提供去中心化的借贷、投资和众筹平台&#x…

SpringSecurity源码分析3--UserDetail部分

前言&#xff1a;本章提及的类都是与用户名、密码相关的类 UserDetailsService.class 用于加载用户信息 DaoAuthenticationProvider.class 将数据库的信息拿出来进行认证 AbstractUserDetailsAuthenticationProvider.class DaoAuthenticationProvider的父类&#xff0c;通过模…

【FreeRTOS】RTOS任务的同步与互斥:(二)信号量

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;二&#xff09;信号量 信号量概念二值信号量二值信号量概念二值信号量相关API函数二值信号量的案例设计cubeMX配置软件程序设计 计数型信号量计数型信号量概念计数型信号量相关API函数二值信号量的案例设计cubeMX配置…

VUE 页码分页封装

VUE 页码封装组件 pagination/index.vue &#xff1a; <template><div class"pagination-contianer"><el-pagination background layout"prev, pager, next" :total"total" current-change"currentChange"> </e…

点赞列表查询列表

点赞列表查询列表 BlogController GetMapping("/likes/{id}") public Result queryBlogLikes(PathVariable("id") Long id) {return blogService.queryBlogLikes(id); }BlogService Override public Result queryBlogLikes(Long id) {String key BLOG_…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

从数据库中到处所有表的列、注释、类型、是否必填等信息

从数据库中到处所有中文表名、英文表名、所有列、注释、类型、长度、是否必填等信息&#xff0c;效果如下&#xff1a; 要实现上面的表格可以直接用SQL实现&#xff0c;实现SQL如下&#xff1a; #查询SQL select* FROMinformation_schema.COLUMNS as columns left join (sele…

【Jenkins PipeLine】Jenkins PipeLine 联动参数示例

目录 1. Pipeline script&#xff1a; 1.1.代码说明&#xff1a; 2. 实现效果&#xff1a; 3.联动说明&#xff1a; 4.Jenkins安装插件 1. Pipeline script&#xff1a; properties([parameters([[$class: "ChoiceParameter", choiceType: "PT_SINGLE_SELE…

在mini2440上编写linux应用程序、字符设备驱动程序的编写与编译

在mini2440上编写linux应用程序 结合前两篇的学习&#xff0c;一个linux操作系统已经在mini2440上运行起来了&#xff0c;结合交叉编译环境和nfs等工具&#xff0c;我们可以在mini2440上编写任何我们在linux系统编程中学到的应用程序。一个简要的多文件Makefile文件如下&#…