JAVA面试题大全(十三)

1、Mybatis 中 #{}和 ${}的区别是什么?

在 MyBatis 中,#{} 和 ${} 是两种用于参数绑定的方式,它们之间的主要区别在于数据处理的方式和 SQL 注入的风险。

  1. #{}:预编译处理

    • #{} 用于预编译处理,MyBatis 会为其生成 PreparedStatement 对象,然后通过 setXXX 方法为 SQL 语句中的参数赋值。
    • 使用 #{} 可以有效防止 SQL 注入,因为所有的参数值都会被当作一个字符串字面量参数。在 SQL 语句中,参数将被一个占位符 ? 替代,然后由 PreparedStatement 的 setXXX 方法设置参数值。
    • 例子:SELECT * FROM users WHERE id = #{id}。在执行这条 SQL 时,MyBatis 会将其转换为类似 SELECT * FROM users WHERE id = ? 的 PreparedStatement,并通过 setXXX 方法为 ? 设置具体的值。
  2. ${}:字符串替换

    • ${} 是将参数直接替换到 SQL 语句中,相当于字符串替换。
    • 使用 ${} 时,需要特别注意 SQL 注入的风险,因为它不会进行任何预处理或转义。只有当你能确保传入的内容是安全的,或者传入的参数是常量(例如数据库表名、列名等)时,才应使用 ${}
    • 例子:SELECT * FROM ${tableName}。在执行这条 SQL 时,MyBatis 会直接将 ${tableName} 替换为具体的表名。

总结:

  • 使用 #{} 是安全的,可以有效防止 SQL 注入,适用于传递参数值。
  • 使用 ${} 需要谨慎,因为它可能导致 SQL 注入风险,通常用于动态指定表名、列名等场景。在使用 ${} 时,务必确保传入的参数是安全的。

 2、Mybatis 有几种分页方式?

Mybatis主要有以下几种分页方式:

  1. 借助数组进行分页
    这种方式是首先查询出全部数据,然后在返回的结果集中截取需要的部分来实现分页。这种方式需要在内存中进行大量数据处理,适合数据量较小的情况。

  2. 借助SQL语句进行分页(物理分页)
    通过在SQL语句中添加LIMIT子句来实现分页功能。例如,SELECT * FROM table LIMIT offset, size。这种方式直接在数据库层面进行分页,效率较高,特别适合于大数据量的情况。

  3. 利用拦截器分页
    可以通过Mybatis的拦截器(Interceptor)功能,在SQL语句执行前给其末尾添加LIMIT子句来实现分页查询。这是一种更为动态和灵活的方式,但需要一定的编程能力来实现拦截器。

  4. 利用RowBounds实现分页(逻辑分页)
    Mybatis提供了RowBounds类来实现分页功能。这种方式是在执行完整的SQL查询后,将结果集加载到内存中,然后根据RowBounds中指定的偏移量和限制数在内存中进行分页处理。这种方式适合数据量较小的情况,因为它需要将所有符合条件的数据加载到内存中。

  5. 使用分页插件
    如PageHelper等分页插件,这些插件通常使用拦截器的方式实现物理分页,能够简化分页操作,并提供更高效的分页性能。

 3、RowBounds 是一次性查询全部结果吗?为什么?

不是。Mybatis是JDBC的封装,在jdbc驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据,假如要查询更多的数据,它会在执行next的时候,去查询更多的数据。这样可以有效的防止内存溢出。

4、Mybatis 逻辑分页和物理分页的区别是什么?

Mybatis中的逻辑分页和物理分页有以下主要区别:

  1. 分页原理
    • 逻辑分页:逻辑分页是在应用层面进行的分页处理。它首先将所有符合条件的记录查询出来,加载到内存中,然后在内存中进行分页操作,最后返回指定页的数据。这种方式依赖于程序员的代码来实现。
    • 物理分页:物理分页是在数据库层面进行的分页处理。它利用数据库本身的分页功能(如MySQL的LIMIT关键字),在SQL查询时直接指定返回的记录范围,从而获取分页所需的数据。这种方式依赖于数据库的物理实体来实现。
  2. 服务器负担与性能
    • 逻辑分页:由于逻辑分页需要一次性将所有数据读取到内存中,因此会占用较大的内存空间,尤其是在数据量较大的情况下,这可能导致服务器性能下降。
    • 物理分页:物理分页每次只读取一部分数据,因此占用内存空间较小,对服务器的负担也相对较轻。
  3. 实时性
    • 逻辑分页:由于逻辑分页是一次性将数据读取到内存中进行处理,因此当数据库中的数据发生变化时,这些变化不能实时反映到分页结果中,实时性较差。
    • 物理分页:物理分页每次需要数据时都会访问数据库,因此能够获取数据库的最新状态,实时性较强。
  4. 适用场合
    • 逻辑分页:主要适用于数据量不大、数据稳定的场合,因为在这种情况下,一次性加载所有数据到内存中是可行的,且对服务器性能的影响较小。
    • 物理分页:主要适用于数据量较大、更新频繁的场合。通过物理分页,可以有效地减少数据传输量和数据库的负担,提高系统的性能和响应速度。

综上所述,Mybatis的逻辑分页和物理分页在分页原理、服务器负担与性能、实时性以及适用场合等方面存在明显的区别。在选择分页方式时,应根据具体的应用场景和需求进行权衡和选择。

5、Mybatis 是否支持延迟加载?延迟加载的原理是什么? 

  1. 支持延迟加载
    MyBatis允许在关联查询中,按需执行子查询,即在使用关联对象时才发起查询,这种机制就是延迟加载。

  2. 延迟加载的原理

    • 代理对象:当查询主对象时,MyBatis会生成一个代理对象。这个代理对象包含了对关联对象的引用。
    • 触发时机:延迟加载的触发时机是在访问代理对象中的关联属性时。也就是说,在真正需要使用关联数据时,才会发起级联查询。
    • 基于AOP实现:MyBatis的延迟加载机制是基于代理模式和面向切面编程(AOP)实现的。MyBatis在运行时会拦截对代理对象的方法调用,根据需要决定是否执行关联查询。
    • 优点与注意事项:延迟加载的主要优点是可以减少不必要的数据库查询,从而提高性能,并减轻数据库的压力。然而,它也可能导致N+1查询问题,因此在使用时需要谨慎考虑其影响。
  3. 适用场景
    延迟加载适用于那些当前业务只使用主加载对象的其他属性,而长时间以后才使用关联对象属性的场景。

  4. 实现方式
    MyBatis通过配置文件中的设置来启用或禁用延迟加载。当开启延迟加载时,MyBatis会记录下哪些数据需要被加载,但并不会立即执行查询操作。

 6、说一下 Mybatis 的一级缓存和二级缓存?

  • 一级缓存:一级缓存的作用域是一个sqlsession对象,第一次查询数据时会保存到sqlsession对象中,第二次如果查询相同的数据,则直接从sqlsession获取,直接获取的前提是这期间这个对象中的数据没有改变,即增删改操作;反之,若有改变,则会自动清除sqlsession缓存,重新进行查询,这并不代表我们关闭了sqlsession。
  • 二级缓存:二级缓存是多个sqlsession共享的,是sqlsession factory 级别的,根据 mapper 的 namespace 划分区域 的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使用 mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二级缓存区域是根据 mapper 划分。每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数据写入缓存。Mybatis 内部存储缓存使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的 java 对象。sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区域,防止脏读数据。

缓存更新机制:当某一个作用域(一级缓存Session/二级缓存Mapper)进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。
 

7、Mybatis 和 Hibernate 的区别有哪些?

  • Mybatis入门比较简单,使用门槛也更低
  • SQL直接优化上,Mybatis要比Hibernate方便
  • Hibernate数据库移植性远大于Mybatis
  • 缓存机制上,hibernate要比mybatis更好一些

8、Mybatis 有哪些执行器(Executor)? 

  • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
  • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
  • BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

9、Mybatis 如何编写一个自定义插件?

Mybatis自定义插件主要借助Mybatis四大对象:
   (Executor、StatementHandler 、ParameterHandler 、ResultSetHandler)进行拦截 

Executor:拦截执行器的方法(log记录) 
StatementHandler:拦截Sql语法构建的处理 
ParameterHandler:拦截参数的处理 
ResultSetHandler:拦截结果集的处理

10、Mybatis 分页插件的实现原理是什么?

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

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

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

相关文章

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求,大致参考如下 一、发送webserver请求 先获取登录接口的token,再使用cookie管理器进行关联获取商品(webserver接口),注意参数一般是写在消息体数据中,消息体有点像HTML格式 执…

JavaScript数据类型与转换

JavaScript是一种弱类型语言,在定义变量的时候不用规定数据的类型,但这部表示JavaScript没有规定数据类型。 数值 JavaScript中数值类型不区分浮点数与整数,所有的数值都以浮点型来表示。另外JavaScript核心,Math还提供了大量的…

windows 搭建 go开发环境

go语言(或 Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须…

字典的创建和删除

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,字典与列表类似,也是可变序列,不过与列表不同,它是无序的可变序列,保存的内容…

pip换源ubuntu

到THU网站上有给定的教程 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ 方法1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package然后在https://pypi.org/project/nvidia-cublas-cu12/#files 里面搜索你的包名 方法2 python -m pip install --upg…

决策树|随机森林 GBDT XGBoost|集成学习

文章目录 1 决策树模型1.1 决策树模型简介1.2 决策树模型核心问题1.2.1 分类划分标准1.2.1.1 信息增益1.2.1.2 增益率1.2.1.3 基尼系数 1.2.2 停止生长策略1.2.3 剪枝策略 1.3 决策树 - python代码1.3.1 结果解读1.3.2 决策树可视化1.3.3 CV - 留一法 2 集成学习2.1 Boosting2.…

cin-getline缓存区

更多资源请关注纽扣编程微信公众号 cin.sync()清除缓存区 如果需要输入如下内容 3 This is C language. This is JAVA language. This is Python language. 写如下程序 #include<bits/stdc.h> using namespace std; string str[100]; int main(){int n;cin>&…

SQL练习题:2.5(2完结)

建表 # 学生表 create table t_student (stu_id varchar(10),stu_name varchar(10),stu_age datetime,stu_sex varchar(10) );# 课程表 create table t_t_course (c_id varchar(10),c_name varchar(10),c_teaid varchar(10) );# 教师表 create table t_t_teacher (tea…

开源大模型:AI 发展的未来引擎

人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的世界&#xff0c;而大模型作为 AI 发展的核心驱动力&#xff0c;其发展路径备受关注。在开源和闭源两条路径中&#xff0c;我更看好开源大模型&#xff0c;认为它将成为 AI 发展的未来引擎。 技术创新与协作…

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…

Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

一、问题&#xff1a; VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后闪退并显示如下错误&#xff1a; 二、解决 1、工具栏处依次点击&#xff1a;扩展 一> Qt VS Tools 一> options 弹出选…

网络工程师---第四十二天

1、基于子网的vlan划分配置步骤是什么&#xff1f; 2、基于端口的vlan划分配置步骤是什么&#xff1f; 3、基于MAC地址的vlan划分配置步骤是什么&#xff1f; 4、请简述无线局域网的组网方式有哪几种&#xff0c;区别是什么&#xff1f; 5、请简述堆叠、级联和集群作用和区别是…

在kaggle中的notebook 如何自定义 cuda 版本以及如何使用自定义的conda或python版本运行项目(一)

问题 第一部分 当前kaggle中带有gpu的notebook 默认的cuda 是12.1版本&#xff0c;如果我要跑一个项目是11.3的&#xff0c;如何将默认的cuda 改为自己需要的cuda 11.3 方法 step1 从官网下载需要的版本cuda run 文件&#xff08;如cuda 11.3&#xff09; 在nvidia cuda 下…

基于Netty实现安全认证的WebSocket(wss)服务端

1.Netty服务端 服务端代码参考【基于Netty实现WebSocket服务端-CSDN博客】中的两种方式都可以&#xff1b;这里用的是第一种简单方式。 新增如下逻辑&#xff1a;添加SSLHandler SSLContext sslContext SslUtil.createSSLContext("JKS","D:\\workSpace\\day…

Web(数字媒体)期末作业

一.前言 1.本资源为类似于打飞机的网页游戏 2.链接如下&#xff1a;【免费】前端web或者数字媒体的期末作业&#xff08;类似于打飞机的2D网页小游戏&#xff09;资源-CSDN文库 二.介绍文档

SAP HCM 标准程序如何定位内表赋值 ABAP DEBUG SCRIPT

Complacency is the enemy of study 学习的敌人是自己的满足。 标准内表定位代码位置!!! 不知道大家有没有尝试体会过debug标准程序,debug过程中发现SAP标准的内表不知道什么时候赋值,或者类的静态属性什么时候改变的,本文通过ABAP DEBUG SCRIPT的方式快速定位内表赋值或者类…

VM中Ubuntu16.04的下载以及ROS—kinetic的版本下载

一、Ubuntu镜像地址 转载备份一下&#xff1b; 官方下载地址&#xff08;不推荐&#xff09; https://www.ubuntu.com/downloadhttps://www.ubuntu.com/download 中科大源 Index of /ubuntu-releases/16.04/http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开…

基于51单片机的电压表-数码管显示

一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路&#xff0c;该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0&#xff5e;9V的电压值,并在四位LED数码管上显示电压值。 二.设计功能 &#xff08;1&…

工业网关设备:HiWoo Box网关

在数字化、智能化的工业浪潮中&#xff0c;工业网关以其卓越的性能和广泛的应用场景&#xff0c;成为了工业互联的核心驱动力。作为一款高效、稳定、智能的工业网关设备&#xff0c;HiWoo Box网关不仅实现了工业现场设备与网络的高效连接&#xff0c;更为企业提供了智能化的数据…

使用 Spring 事件监听机制实现跨模块调用

之前一个项目&#xff0c;有两个模块&#xff0c;A 模块需要依赖 B 模块&#xff0c;但现在 B 模块有地方需要调用 A 模块的方法&#xff0c;如果直接依赖&#xff0c;又会产生循环依赖问题。最终选择使用 spring 的事件监听来解决该问题。 思路就是&#xff0c;B 模块去发布事…