面试题009-Java-MyBatis

面试题009-Java-MyBatis

目录

  • 面试题009-Java-MyBatis
    • 题目自测
    • 题目答案
      • 1. 什么是MyBatis?它与Hibernate有什么区别?
      • 2. 说一下MyBatis的执行流程?
      • 3. MyBatis是否支持延迟加载?
      • 4. MyBatis中一级缓存和二级缓存的区别?
      • 5. MyBatis中的动态SQL是什么?
      • 6. 如何在MyBatis中实现分页?
      • 7. MyBatis如何实现大规模数据插入MySQL数据库中?
      • 8. MyBatis-Plus了解吗?

题目自测

  • 1. 什么是MyBatis?它与Hibernate有什么区别?
  • 2. 说一下MyBatis的执行流程?
  • 3. MyBatis是否支持延迟加载?
  • 4. MyBatis中一级缓存和二级缓存的区别?
  • 5. MyBatis中的动态SQL是什么?
  • 6. 如何在MyBatis中实现分页?
  • 7. MyBatis如何实现大规模数据插入MySQL数据库中?
  • 8. MyBatis-Plus了解吗?

题目答案

1. 什么是MyBatis?它与Hibernate有什么区别?

答:MyBatis是一个半自动化的持久层框架,它可以通过XML或注解来编写SQL语句,并将SQL语句与Java对象进行映射。MyBatis不完全自动生成SQL语句,而是让开发人员手动编写SQL,从而提供了更大的灵活性和控制权。
Hibernate是一个全自动的ORM框架,它可以自动生成SQL语句,提供了更多的功能,但是它的配置也相对比较复杂。

2. 说一下MyBatis的执行流程?

答:MyBatis的执行流程包括几个主要步骤,从配置初始化到执行SQL并返回结果。详细流程如下

  1. 加载配置文件:记载配置文件(如mybatis-config.xml),里面包含数据库连接信息、映射文件位置等信息。
  2. 创建SqlSessionFactory:通过SqlSessionFactoryBuilder构造器创建SqlSessionFactory实例。
  3. 创建SqlSession:通过SqlSessionFactory获取SqlSession实例,里面提供了执行SQL语句所需的方法。
  4. 获取Mapper:通过SqlSession获取具体的Mapper实例。
  5. 执行SQL:调用Mapper接口方法,MyBatis根据配置文件中的映射信息生成并执行具体的SQL语句。
  6. 处理结果集:MyBatis将数据库返回的结果集映射为Java对象,并返回给调用者。
  7. 事务管理:如果配置了事务管理器,SqlSession会处理事务的开始、提交或回滚。
  8. 关闭SqlSession:释放资源。
    // 1. 加载配置文件
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);// 2. 创建SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3. 创建SqlSession
    try (SqlSession session = sqlSessionFactory.openSession()) {// 4. 获取MapperUserMapper mapper = session.getMapper(UserMapper.class);// 5. 执行SQLUser user = mapper.selectUser(1);// 6. 处理结果集System.out.println(user);// 7. 管理事务(如果需要)session.commit();
    } catch (Exception e) {e.printStackTrace();
    } finally {// 8. 关闭SqlSessionsession.close();
    }
    

3. MyBatis是否支持延迟加载?

答:MyBatis支持延迟加载。延迟加载是一种优化技术,只有当真正需要数据时才从数据库加载。在MyBatis中,延迟加载主要用于关联对象或集合对象。当需使用关联数据时,MyBatis才执行相应的SQL语句。
MyBatis中延迟加载可以通过全局配置或具体的映射文件进行配置。

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

答:MyBatis中的缓存机制分为一级缓存和二级缓存,都是用于提高数据库的查询性能。

  • 一级缓存:是SqlSession级别的缓存,作用范围是当前的SqlSession,默认是开启的。

    try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);// 第一次查询,从数据库中查询并缓存结果User user1 = mapper.selectUser(1);System.out.println(user1);// 第二次查询,相同的SqlSession,相同的查询和参数,从缓存中取值User user2 = mapper.selectUser(1);System.out.println(user2);
    }
    
  • 二级缓存:是Mapper级别或全局级别的缓存,作用范围是整个应用程序,多个SqlSession可以共享,需要手动配置开启。

    // 第一次查询
    try (SqlSession session1 = sqlSessionFactory.openSession()) {UserMapper mapper = session1.getMapper(UserMapper.class);User user1 = mapper.selectUser(1);System.out.println(user1);
    }// 第二次查询,不同的SqlSession,但二级缓存启用,从缓存中取值
    try (SqlSession session2 = sqlSessionFactory.openSession()) {UserMapper mapper = session2.getMapper(UserMapper.class);User user2 = mapper.selectUser(1);System.out.println(user2);
    }
    

5. MyBatis中的动态SQL是什么?

答:MyBatis中的动态SQL是一种根据运行时条件生成SQL语句的机制。它使得SQL语句更加灵活和动态,能够适应不同的查询条件和需求。MyBatis通过提供一组标签和表达式,允许开发人员在XML映射文件中编写动态SQL。- -

  • :用于条件判断,根据条件决定是否包含某段SQL。
  • 、、 :类似于Java中的switch-case语句,选择性包含SQL片段。
  • 、、 :用于处理SQL片段中的多余部分(如逗号、AND/OR等)。
  • :用于迭代集合生成SQL片段。
  • :绑定表达式结果到变量。

6. 如何在MyBatis中实现分页?

答:在MyBatis中,有多种方式可以实现分页。1. 可以直接通过编写分页SQL语句。 2. 使用RowBounds对象进行分页。 3. 使用分页插件 PageHelper 实现分页。

  • 使用SQL语句分页

    <select id="selectUsers" resultType="User">SELECT * FROM usersLIMIT #{offset}, #{limit}
    </select>
    
  • 使用RowBounds对象分页

    RowBounds rowBounds = new RowBounds(offset, limit);
    List<MyEntity> entities = sqlSession.selectList("mySelectStatement", parameter, rowBounds);
    
  • 使用分页插件PageHelper

    PageHelper.startPage(pageNum, pageSize);
    List<MyEntity> entities = sqlSession.selectList("mySelectStatement", parameter);
    

7. MyBatis如何实现大规模数据插入MySQL数据库中?

答:将大规模数据插入到MySQL有多种实现方式,如使用MyBatis的批量插入,原生JDBC,MyBatis-Plus插件等方式。在疲劳插入时,需要对数据进行分批处理,控制事务的使用 来提高插入性能和安全。

  • MyBatis批量插入:
    <mapper namespace="com.example.mapper.UserMapper"><insert id="insertUsers">INSERT INTO users (username, email)VALUES<foreach collection="users" item="user" separator=",">(#{user.username}, #{user.email})</foreach></insert>
    </mapper>
    
    public class BatchInsertExample {public static void main(String[] args) {String resource = "mybatis-config.xml";InputStream inputStream = BatchInsertExample.class.getClassLoader().getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);List<User> users = new ArrayList<>();for (int i = 0; i < 1000000; i++) {users.add(new User("username" + i, "email" + i));}int batchSize = 1000;try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = session.getMapper(UserMapper.class);for (int i = 0; i < users.size(); i += batchSize) {List<User> batchList = users.subList(i, Math.min(i + batchSize, users.size()));mapper.insertUsers(batchList);session.commit();session.clearCache();}} catch (Exception e) {e.printStackTrace();}}
    }
    

8. MyBatis-Plus了解吗?

答:MyBatis-Plus是MyBatis的一个增强工具,在MyBatis的基础上提供了许多额外的功能和特性,使得开发者可以更加方便快捷地操作数据库。

MyBatis-Plus官方:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

参考资料

  • JavaGuide
  • 牛客网-Java面试宝典
  • ChatGPT
  • MyBatis官方文档
  • MyBatis-Plus官方文档

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

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

相关文章

Unity AssetsBundle 详解

文章目录 1.AssetBundle 概念2.AssetBundle 优势3.AssetBundle 特性4.AssetBundle 使用流程4.1 分组4.2 打包4.3 加载包4.4 加载资源4.5 卸载资源 5.AssetBundleManifest6.AssetBundle的内存占用7.AB包资源加密 1.AssetBundle 概念 AssetBundle又称AB包&#xff0c;是Unity提供…

【TORCH】查看dataloader里的数据,通过dataloader.dataset或enumerate

文章目录 dataloader.dataset示例代码使用自定义数据集使用 MNIST 数据集 说明 enumerate示例代码说明使用 MNIST 数据集的例子 dataloader.dataset 是的&#xff0c;您可以直接访问 train_loader 的数据集来查看数据&#xff0c;而不必通过 enumerate 遍历数据加载器。可以通…

如何用Vue3和Plotly.js创建交互式表格?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js 动态生成 HTML 表格 应用场景介绍 在数据分析和可视化领域&#xff0c;经常需要以表格的形式展示数据。Plotly.js 是一款功能强大的 JavaScript 库&#xff0c;不仅可以创建交互式图表&#xff0c;…

基于Java的飞机大战游戏的设计与实现论文

点击下载源码 基于Java的飞机大战游戏的设计与实现 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#xff0c;第四代移动通信技术&#xff09;网络的深入&#xff0c;越来越多的IT行业开始向手机…

【SVN-CornerStone客户端使用SVN-多人开发-解决冲突 Objective-C语言】

一、接下来,我们来说第三方的图形化界面啊, 1.Corner Stone:图形化界面,使用SVN, Corner Stone的界面,大概就是这样的, 1)左下角:是我们远程的一个仓库, 2)右上角:是我们本地的一些东西, 首先,在我的服务器上,再开一个仓库,叫做wechat, 我在这个里边,新建…

Stable Diffusion / huggingface 相关配置问题汇总

目录 1 OSError: Cant load tokenizer for openai/clip-vit-large-patch14.报错解决方法方法1——手动下载方法2——自动下载其他方法&#xff08;待研究&#xff09; 2 huggingface_hub.utils._errors.LocalEntryNotFoundError:报错解决方法 笔者在配置SD的时候遭遇了许多bug&…

NestJs实现各种请求与参数解析

NestJs中的各种请求与携带参数的解析 demo.controller.ts import { Body, Param, Controller, Delete, Get, Post, Patch } from nestjs/common; import { DemoService } from ./demo.service; import { adduser, updateuser } from "./types/index" Controller(de…

用Racket做一个拼图游戏——4 实现工具

4 实现工具 思路理清楚了&#xff0c;接下来就一个一个功能实现。在阐述实现功能的编程过程中&#xff0c;会延伸讲解编程思路、相关的Racket函数及相关知识点&#xff0c;力图达到在实践中的学习目的。 在编程实现过程中&#xff0c;首先实现图片操作功能&#xff0c;再通过…

告别混乱,可道云企业网盘个人标签,让文件管理更轻松

在信息爆炸的时代&#xff0c;你是不是常常觉得自己的大脑就像一台过载的处理器&#xff0c;各种文件、资料、想法在脑海中“打架”&#xff0c;让你焦头烂额&#xff1f; 别担心&#xff0c;可道云企业网盘个人标签功能来拯救你的“大脑内存”了&#xff01; 我们需要告别无…

Docker 容器出现 IP 冲突

Docker 容器出现 IP 冲突的情况可能由以下几个原因导致&#xff1a; 静态 IP 分配&#xff1a;如果你在 docker-compose.yml 文件中为多个容器手动设置了相同的静态 IP 地址&#xff0c;那么这些容器在启动时就会出现 IP 冲突。确保每个容器分配的静态 IP 地址是唯一的。桥接网…

求函数最小值-torch版

目标&#xff1a;torch实现下面链接中的梯度下降法 先计算 的导函数 &#xff0c;然后计算导函数 在处的梯度 (导数) 让 沿着 梯度的负方向移动&#xff0c; 自变量 的更新过程如下 torch代码实现如下 import torchx torch.tensor([7.5],requires_gradTrue) # print(x.gr…

【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程

一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …

Elasticsearch 搜索模板:重用和共享查询

在Elasticsearch&#xff08;ES&#xff09;的日常开发和运维中&#xff0c;我们经常会遇到需要频繁执行相似查询的场景。这些查询可能因业务逻辑的复杂性而涉及多个字段、过滤条件和聚合分析。为了优化这些操作&#xff0c;提高开发效率&#xff0c;Elasticsearch提供了搜索模…

连续6年夺冠 6项细分领域第一,中电金信持续领跑中国银行业IT解决方案市场

7月9日&#xff0c;工信部赛迪顾问发布《2023年度中国银行业IT解决方案市场分析报告》&#xff08;简称《报告》&#xff09;。中电金信以7.38%的市场份额再度蝉联2023中国银行业IT解决方案市场份额第一&#xff0c;以显著优势持续领跑中国银行业IT解决方案市场。在细分领域&am…

最小生成树prim优先队列优化版

动态数组加结构体省空间&#xff0c;重载结构体排序写队列优先级。 #include<iostream> #include<queue> #include<vector> using namespace std; int n,m; int vis[5001]; struct edge{int v,w; }; vector<edge> G[5001];struct node{int id,d; };st…

视频调色的技巧和方法 视频调色的操作步骤 视频调色用什么软件好免费 会声会影下载免费中文版

学会视频调色&#xff0c;就等于掌握了剪辑艺术的密码。视频调色不是为了画面好看&#xff0c;而是通过精心构思的色彩参数&#xff0c;向观众传达作品的情绪和内涵。普通剪辑师与剪辑高手之间的差距&#xff0c;就在于能否领悟视频调色的真谛。 一、视频调色有什么用 掌握混…

MySQL语法笔记(补充版)

补充上一篇博客没涉及到的实用语法 MySQL语法笔记&#xff08;温习版&#xff09; 查看正在使用的数据库 SELECT DATABASE()查看时区 show VARIABLES like time_zone修改时区 timestamp类型存储的时间与MySQL数据库系统安装时所选的时区有关&#xff0c;在不同时区下查看的同…

springboot定制化书籍销售系统-计算机毕业设计源码71193

摘要 随着电子商务的快速发展和图书市场的不断变革&#xff0c;定制化书籍销售系统的需求日益凸显。本文介绍了一种基于SpringBoot框架的定制化书籍销售系统的设计与实现。该系统旨在满足用户对于个性化、专业化的书籍需求&#xff0c;为用户提供高效、便捷的定制化购书体验。 …

前端JS特效第27波:jQuery商品放大镜预览代码

jQuery商品放大镜预览代码&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!doctype html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content&quo…

结构体案例1

代码 #include <iostream> using namespace std; #include <string> #include <ctime>//学生的结构体 struct Student {string sName;int score; }; //老师的结构体定义 struct Teacher {string tName;struct Student sArray[5]; };//给老师和学生赋值的函数…