当前位置: 首页 > news >正文

Java面试题10

1.MyBatis 中 #{}和 ${}的区别是什么?

        #{} 是预编译的占位符,MyBatis会将其转化为一个占位符参数,安全性较高,可以防止 SQL注入; ${} 是字符串替换,直接将内容替换到SQL语句中,不会进行参数处理,潜在风险是 SQL注入

在 MyBatis 中,#{} 和 ${} 都被用作参数绑定,但它们在处理参数的方式和安全性上有很大的区别:

  1. ${}:这是一个基本的字符串替换操作。比如你在 SQL 语句中写${column},MyBatis 就会直接把这个${column}替换成参数的值。由于它的这种直接替换特性,它可能会引起 SQL 注入问题。比如,如果用户恶意设置参数的值为一个 SQL 语句片段,那么他就可以通过这种方式执行任意的 SQL 语句,这就造成了严重的安全问题。因此,我们需要非常小心地使用${},尽量避免在不受信任的输入或用户控制的输入上使用它。
  2. #{}:MyBatis 会使用预编译语句(PreparedStatement)的方式,通过在 SQL 中构建一个参数占位符?并设值参数来防止 SQL 注入,来安全地处理#{}中的值。这也是 MyBatis 推荐的方式来处理动态参数。你可以在查询中写#{userId},然后在你的参数映射中有一个userId的字段,MyBatis 就会安全地为你的 SQL 语句设值。

总结一下,#{}${}更安全,因为它通过预编译的方式处理参数,可以防止 SQL 注入。除非在你完全确定没有 SQL 注入风险的情况下,一般情况下我们更推荐使用#{}

2.MyBatis 有几种分页方式?

        MyBatis有两种分页方式,一种是使用 RowBounds 进行内存分页,另一种是使用插件进行物理分页。

        RowBounds 是 MyBatis 中的一个分页对象,它可以将所有符合条件的数据全都查询到内存中,然后在内存中对数据进行分页。然而,这种分页操作是对 ResultSet 结果集进行分页,也就是人们常说的逻辑分页,而非物理分页,效率低下,不建议使用。

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

        是的, RowBounds 方式是一次性查询全部结果,MyBatis会将整个结果集读取到内存中, 然后进行分页操作。

        Mybatis可以通过传递RowBounds对象,来进行数据库数据的分页操作,然而遗憾的是,该分页操作是对ResultSet结果集进行分页,也就是人们常说的逻辑分页,而非物理分页(物理分页当然就是我们在sql语句中指定limit和offset值)。

4.MyBatis 逻辑分页和物理分页的区别是什么?

        逻辑分页是在数据库中查询所有结果,然后在应用层进行分页;物理分页是通过数据库的特 定语法(如 LIMIT 、 OFFSET )进行分页,只查询所需数据。

        

逻辑分页是在应用程序层面进行的,它首先从数据库查询出所有的结果,然后在应用程序中对这些结果进行分页显示。这种方法的优点是简单易用,适用于数据量较小的情况。然而,如果数据量很大,查询所有的数据可能会消耗大量的内存和时间。

物理分页是利用数据库的特定语法(如SQL中的LIMIT和OFFSET)进行的,这意味着数据库直接返回所需的数据记录,而不是所有的数据。这种方法的优点是效率高,适用于处理大量数据。然而,使用不同的数据库系统可能会对LIMIT和OFFSET等关键字的支持程度不同,因此可能需要进行一些调整。

5.MyBatis 是否支持延迟加载?延迟加载的原理是什么?

        是的,MyBatis支持延迟加载。延迟加载是指在需要时才真正查询关联对象,原理是在查询 主对象时只查询主对象的数据,当访问关联对象属性时,再根据需要进行关联查询。

MyBatis 支持延迟加载。延迟加载(Lazy Loading)是一种常用的优化技术,用于在需要时才加载数据。在 MyBatis 中,可以通过配置来实现延迟加载。

延迟加载的原理是,在初始加载时,只加载必要的少量数据,然后在需要的时候才加载更多的数据。这样可以减少初始加载的时间和内存消耗,提高应用的启动速度和响应速度。

在 MyBatis 中,可以通过配置 fetchType 属性来实现延迟加载。例如,可以将 fetchType 设置为 lazy 来实现延迟加载。当设置为 lazy 时,MyBatis 只会加载与当前查询结果相关的数据,而不是一次性加载所有数据。

延迟加载的原理是基于对象代理实现的。在 MyBatis 中,可以通过配置 <association> 和 <collection> 元素来实现对象代理。当配置了这些元素后,MyBatis 会为相关对象生成代理对象,从而实现在需要时才加载数据的效果。

需要注意的是,延迟加载可能会增加数据库的查询次数,从而影响应用的性能。因此,在使用延迟加载时,需要根据实际情况进行权衡和优化。

6.说一下 MyBatis 的一级缓存和二级缓存?

        一级缓存是指在同一个SqlSession中,查询的结果会被缓存起来,以提高性能;二级缓存是 指多个SqlSession之间共享缓存,可以跨Session共享数据。  

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。

在 MyBatis 中,一级缓存和二级缓存是两个重要的概念。

  1. 一级缓存:也称为 SqlSession 级别的缓存。每一个新的 SqlSession 有自己的一级缓存,当 SqlSession 进行查询时,会先从一级缓存中查找是否已经存在相应的查询结果,如果存在,则直接返回;如果不存在,再去数据库进行查询,并将查询结果存入一级缓存。一级缓存的生命周期和 SqlSession 保持一致,当 SqlSession 被关闭或清空,那么一级缓存就会消失。
  2. 二级缓存:也称为 Mapper 级别的缓存。二级缓存是多个 SqlSession 共享的,因此,不同的 SqlSession 可以访问、修改和更新二级缓存中的数据。二级缓存的数据会持久化到磁盘中,因此可以跨多个 SqlSession 和多个会话对象进行共享。

MyBatis 的二级缓存可以跨多个 SqlSession,因此它可以在多个数据库之间进行数据共享。然而,需要注意的是,由于二级缓存的数据是共享的,因此如果一个 SqlSession 对数据进行修改,那么这个修改会反映到其他所有的 SqlSession 中。为了避免这种情况,可以在进行修改操作时关闭二级缓存。

总的来说,一级缓存和二级缓存都是 MyBatis 中非常重要的特性,它们可以提高数据库查询的效率,减少对数据库的访问次数。然而,在使用它们时需要注意数据的共享性和一致性问题。

7.MyBatis 和 Hibernate 的区别有哪些?

        MyBatis是基于SQL和映射配置的持久化框架,需要手写SQL,更加灵活;Hibernate是 ORM框架,将Java对象映射到数据库,不需要写SQL,更加面向对象。

MyBatis和Hibernate是两种广泛使用的Java持久化框架,它们的主要区别体现在以下方面:

  1. 原理不同:MyBatis是一种基于SQL语句的持久化框架,通过预编译SQL语句并执行来实现数据库访问。而Hibernate是一种基于对象的持久化框架,通过将Java对象映射到数据库表来实现数据库访问。
  2. 使用方式不同:MyBatis的使用方式更加灵活,允许用户编写自己的SQL语句并执行,支持多种数据库查询方式(如普通查询、存储过程等)。Hibernate也有自己的SQL书写方式,但相较于MyBatis,Hibernate更加注重映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
  3. 开发难度不同:总体来说,Hibernate的开发难度要大于Mybatis。这主要是因为Hibernate比较复杂、庞大,学习周期较长。而Mybatis相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。
  4. 日志统计和数据库扩展性:Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。不过没有自己的日志统计,所以要借助log4j来记录日志。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具有自己的日志统计。另外,Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性、迁移性比较差。

综上所述,MyBatis和Hibernate各有其优点和缺点。在选择使用时,需要根据具体的项目需求和个人经验进行判断。

8.MyBatis有哪些执行器(Executor)?

        MyBatis有三种执行器,分别是 SimpleExecutor 、 ReuseExecutor 和 BatchExecutor , 用于控制SQL语句的执行。

MyBatis 在其内部实现中使用了三种类型的执行器(Executor),分别是 SimpleExecutor,ReuseExecutor 和 BatchExecutor。

  1. SimpleExecutor:这是一个简单的执行器,每次SQL语句都会重新生成SQL,并且会创建新的结果映射器(Mapper)对象,对于一些非常简单不需要映射的操作比较有用。
  2. ReuseExecutor:这是MyBatis默认的执行器,它会重用预处理语句(PreparedStatement)和结果映射器(Mapper)对象,减少了创建和销毁对象的次数,提高了性能。
  3. BatchExecutor:这是批量执行器,它主要用于执行批量操作,可以一次执行多条SQL语句。

9.MyBatis 分页插件的实现原理是什么?

        MyBatis分页插件通过拦截SQL执行,将原始SQL改写为带有分页参数的SQL,然后执行修改后的SQL,最终返回分页结果。

MyBatis 分页插件的实现原理主要是利用了 MyBatis 的插件机制。分页插件通过拦截 MyBatis 的执行语句,在 SQL 执行前后进行相应的操作,以达到分页的效果。

具体来说,分页插件首先通过实现 MyBatis 的插件接口,如 Interceptor,来拦截待执行的 SQL 语句。在拦截到 SQL 语句后,插件会根据 SQL 语句的内容和参数,生成对应的物理分页语句和物理分页参数。然后,插件会将这些物理分页语句和参数插入到原始 SQL 语句中,并继续执行 SQL 语句。

在执行物理分页语句时,插件会根据数据库方言(dialect)的不同,使用不同的物理分页语法。例如,对于 MySQL 数据库,可以使用 LIMIT 和 OFFSET 关键字;对于 Oracle 数据库,可以使用 ROWNUM 关键字等。

另外,为了提高性能,分页插件通常会缓存已经执行过的 SQL 语句和对应的物理分页语句和参数。这样,在下次执行相同 SQL 语句时,可以直接使用缓存的物理分页语句和参数,避免了重复的生成和执行过程。

需要注意的是,虽然物理分页可以提高查询效率,但也可能会增加数据库的负载。因此,在使用物理分页时,需要根据具体的应用场景和数据库性能来权衡选择。

10.MyBatis 如何编写一个自定义插件?

        编写MyBatis自定义插件需要实现 Interceptor 接口,然后通过在MyBatis配置文件中配置 插件,使其生效。插件可以在SQL执行前后进行拦截,实现自定义的功能。

MyBatis 允许用户编写自定义的插件,以便对 SQL 语句进行更细粒度的控制和扩展。以下是一个简单的 MyBatis 自定义插件的示例:

  1. 首先创建一个新的 Java 类,并让它实现 Interceptor 接口:

    import org.apache.ibatis.executor.statement.StatementHandler;  
    import org.apache.ibatis.plugin.*;  import java.sql.Connection;  
    import java.util.Properties;  @Intercepts({  @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})  
    })  
    public class MyInterceptor implements Interceptor {  @Override  public Object intercept(Invocation invocation) throws Throwable {  StatementHandler statementHandler = (StatementHandler) invocation.getTarget();  // 这里可以对 SQL 语句进行修改或扩展  // ...  // 继续执行原始操作  return invocation.proceed();  }  @Override  public Object plugin(Object target) {  if (target instanceof StatementHandler) {  return Plugin.wrap(target, this);  } else {  return target;  }  }  @Override  public void setProperties(Properties properties) {  // 可以设置自定义的属性  // ...  }  
    }

  2. 在 intercept 方法中,你可以通过 StatementHandler 对象获取到 SQL 语句,然后对 SQL 语句进行修改或扩展。这里是一个简单的示例,它将 SQL 语句中的所有 SELECT 关键字替换为 SELECT * FROM

@Override  
public Object intercept(Invocation invocation) throws Throwable {  StatementHandler statementHandler = (StatementHandler) invocation.getTarget();  String sql = statementHandler.getBoundSql().getSql();  String newSql = sql.replace("SELECT", "SELECT * FROM");  // 设置新的 SQL 语句到 StatementHandler 中,以便后续执行  ((BoundSql) statementHandler.getBoundSql()).setSql(newSql);  // 继续执行原始操作  return invocation.proceed();  
}

相关文章:

Java面试题10

1.MyBatis 中 #{}和 ${}的区别是什么&#xff1f; #{} 是预编译的占位符&#xff0c;MyBatis会将其转化为一个占位符参数&#xff0c;安全性较高&#xff0c;可以防止 SQL注入&#xff1b; ${} 是字符串替换&#xff0c;直接将内容替换到SQL语句中&#xff0c;不会进行参数处理…...

DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式

更新时间&#xff1a;2023年10月31日 11:37:53 作者&#xff1a;产品人小柒 dbeaver数据库连接工具,可以支持几乎所有的主流数据库.mysql,oracle.sqlserver,db2 等等,这篇文章主要给大家介绍了关于DBeaver连接MySQL提示"Public Key Retrieval is not allowed"问…...

振弦式轴力计和振弦采集仪组成的安全监测解决方案

振弦式轴力计和振弦采集仪组成的安全监测解决方案 振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具&#xff0c;可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确&#xff0c;并且能够监测长期的结构反应&#xff0c;因此…...

卡尔曼滤波

通过 Eigen 矩阵运算实现线性卡尔曼滤波。模拟的是一辆带火箭发动机的汽车&#xff0c;一开始沿着X轴匀速运动&#xff0c;到X轴中间开启火箭发动机匀加速向Y轴起飞。同理可以仿真&#xff08;x,y,z,yaw,pitch,raw&#xff09; 6自由度的真实飞行情况 #include <iostream&g…...

不受平台限制,Sketch 网页版震撼登场

Sketch 是一种基于 Mac 的矢量图形编辑器&#xff0c;可用于数字设计。其主要功能包括无损矢量编辑、完美像素精度和数百个插件同步功能&#xff0c;可导出预设和代码。它是目前流行的页面交互协作设计工具。但是 Sketch 最大的缺点是对 Windows/PC 用户不友好。严格来说&#…...

如何使用.pth训练模型

一.使用.pth训练模型的步骤如下&#xff1a; 1.导入必要的库和模型 import torch import torchvision.models as models# 加载预训练模型 model models.resnet50(pretrainedTrue) 2.定义数据集和数据加载器 # 定义数据集和数据加载器 dataset MyDataset() dataloader to…...

C++11线程以及线程同步

C11中提供的线程类std::thread,基于此类创建一个新的线程相对简单&#xff0c;只需要提供线程函数和线程对象即可 一.命名空间 this_thread C11 添加一个关于线程的命名空间std::this_pthread ,此命名空间中提供四个公共的成员函数&#xff1b; 1.1 get_id() 调用命名空间s…...

深度学习之基于YoloV3杂草识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在图像识别领域已经取得了显著的成果&#xff0c;其中基于YOLO&#xff08;You Only Look Once&#xff09…...

Linux 命令vim(编辑器)

(一)vim编辑器的介绍 vim是文件编辑器&#xff0c;是vi的升级版本&#xff0c;兼容vi的所有指令&#xff0c;同时做了优化和延伸。vim有多种模式&#xff0c;其中常用的模式有命令模式、插入模式、末行模式&#xff1a;。 (二)vim编辑器基本操作 1 进入vim编辑文件 1 vim …...

轻松配置PPPoE连接:路由器设置和步骤详解

在家庭网络环境中&#xff0c;我们经常使用PPPoE&#xff08;点对点协议过夜&#xff09;连接来接入宽带互联网。然而&#xff0c;对于一些没有网络专业知识的人来说&#xff0c;配置PPPoE连接可能会有些困难。在本文中&#xff0c;我将详细介绍如何轻松配置PPPoE连接&#xff…...

电源控制系统架构(PCSA)之系统分区电源域

目录 4.2 电源域 4.2.1 电源模式 4.2.2 电源域的选择 4.2.3 系统逻辑 4.2.4 Always-On域 4.2.5 处理器Clusters 4.2.6 CoreSight逻辑 4.2.7 图像处理器 4.2.8 显示处理器 4.2.9 其他功能 4.2.10 电源域层次结构要求 4.2.11 SOC域示例 4.2 电源域 电源域在这里被定…...

Linux:docker基础操作(3)

docker的介绍 Linux&#xff1a;Docker的介绍&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/134146721?spm1001.2014.3001.5502 通过yum安装docker Linux&#xff1a;Docker-yum安装&#xff08;2&#xff09;-CSDN博客https://blog.…...

【Axure教程】用中继器制作卡片多条件搜索效果

卡片设计通过提供清晰的信息结构、可视化吸引力、易扩展性和强大的交互性&#xff0c;为用户界面设计带来了许多优势&#xff0c;使得用户能够更轻松地浏览、理解和互动。 那今天就教大家如何用中继器制作卡片的模板&#xff0c;以及完成多条件搜索的效果&#xff0c;我们会以…...

Linux中vi常用命令-批量替换

在日常服务器日志查看中常用到的命令有grep、tail等&#xff0c;有时想查看详细日志&#xff0c;用到vi命令&#xff0c;记录下来&#xff0c;方便查看。 操作文件&#xff1a;test.properites 一、查看与编辑 查看命令&#xff1a;vi 文件名 编辑命令&#xff1a;按键 i&…...

logback-spring.xml的内容格式

目录 一、logback-spring.xml 二、Logback 中的三种日志文件类型 一、logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10 seconds" ><!-- <statusListener…...

nodejs+vue+elementui+express青少年编程课程在线考试系统

针对传统线下考试存在的老师阅卷工作量较大&#xff0c;统计成绩数据时间长等问题&#xff0c;实现一套高效、灵活、功能强大的管理系统是非常必要的。该系统可以迅速完成随机组卷&#xff0c;及时阅卷、统计考试成绩排名的效果。该考试系统要求&#xff1a;该系统将采用B/S结构…...

Navicat 技术指引 | GaussDB 数据查看器

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…...

Docker的registry

简介 地址&#xff1a;https://hub.docker.com/_/registry Dcoker registry是存储Dcoker image的仓库&#xff0c;运行push&#xff0c;pull&#xff0c;search时&#xff0c;是通过Dcoker daemon与docker registry通信。有时候会用Dcoker Hub这样的公共仓库可能不方便&#x…...

【vue_3】关于超链接的问题

1、需求2、修改前的代码3、修改之后&#xff08;1&#xff09;第一次&#xff08;2&#xff09;第二次&#xff08;3&#xff09;第三次&#xff08;4&#xff09;第四次&#xff08;5&#xff09;第五次 1、需求 需求&#xff1a;要给没有超链接的列表添加软超链接 2、修改前…...

redis优化秒杀和消息队列

redis优化秒杀 1. 异步秒杀思路1.1 在redis存入库存和订单信息1.2 具体流程图 2. 实现2.1 总结 3. Redis的消息队列3.1 基于list实现消息队列3.2 基于PubSub实现消息队列3.3 基于stream实现消息队列3.3.1 stream的单消费模式3.3.2 stream的消费者组模式 3.4 基于stream消息队列…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...