JAVA面试题大全(十三)
1、Mybatis 中 #{}和 ${}的区别是什么?
在 MyBatis 中,#{} 和 ${} 是两种用于参数绑定的方式,它们之间的主要区别在于数据处理的方式和 SQL 注入的风险。
-
#{}:预编译处理#{}用于预编译处理,MyBatis 会为其生成 PreparedStatement 对象,然后通过 setXXX 方法为 SQL 语句中的参数赋值。- 使用
#{}可以有效防止 SQL 注入,因为所有的参数值都会被当作一个字符串字面量参数。在 SQL 语句中,参数将被一个占位符?替代,然后由 PreparedStatement 的 setXXX 方法设置参数值。 - 例子:
SELECT * FROM users WHERE id = #{id}。在执行这条 SQL 时,MyBatis 会将其转换为类似SELECT * FROM users WHERE id = ?的 PreparedStatement,并通过 setXXX 方法为?设置具体的值。
-
${}:字符串替换${}是将参数直接替换到 SQL 语句中,相当于字符串替换。- 使用
${}时,需要特别注意 SQL 注入的风险,因为它不会进行任何预处理或转义。只有当你能确保传入的内容是安全的,或者传入的参数是常量(例如数据库表名、列名等)时,才应使用${}。 - 例子:
SELECT * FROM ${tableName}。在执行这条 SQL 时,MyBatis 会直接将${tableName}替换为具体的表名。
总结:
- 使用
#{}是安全的,可以有效防止 SQL 注入,适用于传递参数值。 - 使用
${}需要谨慎,因为它可能导致 SQL 注入风险,通常用于动态指定表名、列名等场景。在使用${}时,务必确保传入的参数是安全的。
2、Mybatis 有几种分页方式?
Mybatis主要有以下几种分页方式:
-
借助数组进行分页:
这种方式是首先查询出全部数据,然后在返回的结果集中截取需要的部分来实现分页。这种方式需要在内存中进行大量数据处理,适合数据量较小的情况。 -
借助SQL语句进行分页(物理分页):
通过在SQL语句中添加LIMIT子句来实现分页功能。例如,SELECT * FROM table LIMIT offset, size。这种方式直接在数据库层面进行分页,效率较高,特别适合于大数据量的情况。 -
利用拦截器分页:
可以通过Mybatis的拦截器(Interceptor)功能,在SQL语句执行前给其末尾添加LIMIT子句来实现分页查询。这是一种更为动态和灵活的方式,但需要一定的编程能力来实现拦截器。 -
利用RowBounds实现分页(逻辑分页):
Mybatis提供了RowBounds类来实现分页功能。这种方式是在执行完整的SQL查询后,将结果集加载到内存中,然后根据RowBounds中指定的偏移量和限制数在内存中进行分页处理。这种方式适合数据量较小的情况,因为它需要将所有符合条件的数据加载到内存中。 -
使用分页插件:
如PageHelper等分页插件,这些插件通常使用拦截器的方式实现物理分页,能够简化分页操作,并提供更高效的分页性能。
3、RowBounds 是一次性查询全部结果吗?为什么?
不是。Mybatis是JDBC的封装,在jdbc驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据,假如要查询更多的数据,它会在执行next的时候,去查询更多的数据。这样可以有效的防止内存溢出。
4、Mybatis 逻辑分页和物理分页的区别是什么?
Mybatis中的逻辑分页和物理分页有以下主要区别:
- 分页原理:
- 逻辑分页:逻辑分页是在应用层面进行的分页处理。它首先将所有符合条件的记录查询出来,加载到内存中,然后在内存中进行分页操作,最后返回指定页的数据。这种方式依赖于程序员的代码来实现。
- 物理分页:物理分页是在数据库层面进行的分页处理。它利用数据库本身的分页功能(如MySQL的LIMIT关键字),在SQL查询时直接指定返回的记录范围,从而获取分页所需的数据。这种方式依赖于数据库的物理实体来实现。
- 服务器负担与性能:
- 逻辑分页:由于逻辑分页需要一次性将所有数据读取到内存中,因此会占用较大的内存空间,尤其是在数据量较大的情况下,这可能导致服务器性能下降。
- 物理分页:物理分页每次只读取一部分数据,因此占用内存空间较小,对服务器的负担也相对较轻。
- 实时性:
- 逻辑分页:由于逻辑分页是一次性将数据读取到内存中进行处理,因此当数据库中的数据发生变化时,这些变化不能实时反映到分页结果中,实时性较差。
- 物理分页:物理分页每次需要数据时都会访问数据库,因此能够获取数据库的最新状态,实时性较强。
- 适用场合:
- 逻辑分页:主要适用于数据量不大、数据稳定的场合,因为在这种情况下,一次性加载所有数据到内存中是可行的,且对服务器性能的影响较小。
- 物理分页:主要适用于数据量较大、更新频繁的场合。通过物理分页,可以有效地减少数据传输量和数据库的负担,提高系统的性能和响应速度。
综上所述,Mybatis的逻辑分页和物理分页在分页原理、服务器负担与性能、实时性以及适用场合等方面存在明显的区别。在选择分页方式时,应根据具体的应用场景和需求进行权衡和选择。
5、Mybatis 是否支持延迟加载?延迟加载的原理是什么?
-
支持延迟加载:
MyBatis允许在关联查询中,按需执行子查询,即在使用关联对象时才发起查询,这种机制就是延迟加载。 -
延迟加载的原理:
- 代理对象:当查询主对象时,MyBatis会生成一个代理对象。这个代理对象包含了对关联对象的引用。
- 触发时机:延迟加载的触发时机是在访问代理对象中的关联属性时。也就是说,在真正需要使用关联数据时,才会发起级联查询。
- 基于AOP实现:MyBatis的延迟加载机制是基于代理模式和面向切面编程(AOP)实现的。MyBatis在运行时会拦截对代理对象的方法调用,根据需要决定是否执行关联查询。
- 优点与注意事项:延迟加载的主要优点是可以减少不必要的数据库查询,从而提高性能,并减轻数据库的压力。然而,它也可能导致N+1查询问题,因此在使用时需要谨慎考虑其影响。
-
适用场景:
延迟加载适用于那些当前业务只使用主加载对象的其他属性,而长时间以后才使用关联对象属性的场景。 -
实现方式:
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方言,添加对应的物理分页语句和物理分页参数。
相关文章:
JAVA面试题大全(十三)
1、Mybatis 中 #{}和 ${}的区别是什么? 在 MyBatis 中,#{} 和 ${} 是两种用于参数绑定的方式,它们之间的主要区别在于数据处理的方式和 SQL 注入的风险。 #{}:预编译处理 #{} 用于预编译处理,MyBatis 会为其生成 Prep…...
搜维尔科技:第九届元宇宙数字人设计大赛入围作品名单
随着第九届元宇宙数字人设计大赛渐近尾声,各院校提交的数字人作品已陆续完成评分统计汇总工作!现将入围名单公布,请入围团队尽可能到场参加大赛颁奖典礼,具体获奖名次将在颁奖典礼中现场公布! 颁奖典礼时间、地点&…...
SMB工具横向移动
一. SMB工具介绍和使用 1.介绍 2013年的Defcon上,就引入了smbexec,后续 smbexec 被 Impacket 进一步完善了。在Impacket中支持明文认证,NTLM认证,Aeskey认证等方式! 2. 使用方法 命令: smbexec.exe 用户…...
cesuim
new Cesium.Color(255,255,0,1), //颜色 Math.PI/2color: Cesium.Color.fromCssColorString("#f40"), //16进制颜色初始化地球 import * as Cesium from "cesium";import { onMounted } from "vue"; onMounted(() > {Cesium.Ion.defaultAcc…...
2023、2024国赛web复现wp
2023 Unzip 类型:任意文件上传漏洞 主要知识点:软链接 随便上传一个一句话木马文件,得到一串php代码 根据代码上传zip文件发现进入后还是此页面 代码审计: <?php error_reporting(0); highlight_file(__FILE__);$finfo fin…...
day34 贪心算法 455.分发饼干 376. 摆动序列
贪心算法理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心一般解题步骤(贪心无套路): 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455.分发饼干 …...
养老院管理系统基于springboot的养老院管理系统java项目
文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色:超级…...
跳台阶扩展问题
题目链接 f(1) 1f(2) 1 1 2f(3) 1 2 1 4f(4) 1 2 4 1 8 所以 f(n) 2 n − 1 ^{n-1} n−1 import java.util.Scanner;public class Solution {public int jumpFloorII(int target) {return 1 << (target - 1);} }...
超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片
博图光电5MP短波红外相机,搭载了索尼IMX992 SenSWIR传感器,支持5.2MP分辨率,适合探测波长在400nm-1700nm波段的可见光和短波红外光,有效面积和透光率得到提升,内置TEC制冷片,实现了像素尺寸和图像均匀性方面…...
攻击渗透思考题
1. windows登录的明文密码,存储过程是怎么样的,密文存在哪个文件下,该文件是否可以打开,并且查看到密文 在Windows操作系统中,登录时输入的明文密码不会以明文形式存储在系统中。相反,Windows使用一种称为“…...
Flutter 中的 Opacity 小部件:全面指南
Flutter 中的 Opacity 小部件:全面指南 在Flutter中,动画和视觉效果是提升用户体验的重要手段。Opacity小部件允许你改变子组件的透明度,从而实现淡入、淡出或其它透明度相关的动画效果。本文将提供Opacity的全面指南,帮助你了解…...
【介绍下如何在SQL中添加数据】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
【Linux学习】深入了解Linux中进程状态及其转换
文章目录 进程状态进程排队进程的状态(运行,阻塞,挂起)进程的七个状态 孤儿进程 进程状态 进程 task_struct 可执行程序 进程不是一 直在运行的,可能在等待软硬件资源,比如scanf后,程序停止运…...
【Python设计模式11】建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。建造者模式通过使用多个简单的对象一步一步构建成一个复杂的对象。 建造者模式的结构 建造者模式…...
coredump文件生成配置
1.打开coredump文件生成开关 查看开关是否打开:ulimit -a 如果core file size 为0,则为关闭。 执行:ulimit -c 10240 将其coredump文件大小设置。 2.coredump文件保存位置: /proc/sys/kernel/core_pattern文件可以控制core文…...
jmeter线程组(下篇)
线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户&#x…...
Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL
今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影,顾名思义,该大模型主要是面向写实摄影,一方面生成的图片人物皮肤纹理细节超级逼真,另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…...
Android 13 配置默认DN
需求: 如果存在用户配置的DNS服务器,则切面拦截运行商下发的DNS,替换为用户自己配置的DNS. 实现: 直接上代码: 1:TelephonyProperties 内新增属性保存用户设置的dns //QSSI.13/frameworks/base/telephony/java/com/android/in…...
系统开发与运行知识
系统开发与运行知识 导航 文章目录 系统开发与运行知识导航一、软件工程二、软件生命周期三、开发模型四、开发方法五、需求分析结构化分析 六、数据流图分层数据流图的画法设计注意事项 七、数据字典数据字典的内容 八、系统设计九、结构化设计常用工具十、面向对象十一、UML…...
算法训练 | 二叉树Part1 | 递归遍历、迭代遍历、统一迭代
目录 递归遍历 前序遍历 迭代遍历 前序遍历(迭代法) 中序遍历(迭代法) 后序遍历(迭代法) 统一迭代法 统一迭代 嵌入式学习分享个人主页:Orion嵌入式随想录 - 小红书 (xiaohongshu.com) …...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
