关于MyBatis和JVM的最常见的十道面试题

news2024/9/24 23:33:05

ORM项目中类属性名和数据库字段名不一致会导致什么问题?它的解决方案有哪些?

在ORM项目中,如果类的属性名称和数据库字段名不一致会场导致插入、修改时设置的这个不一致字段为null,查询的时候即使数据库有数据,但是查询的结果也是为null。它的常见解决方法如下:

  1. 更改程序中属性名或数据库的字段名,使其一致
  2. 使用结果映射,使用<resultMap>映射对应的字段
    1. <!-- 在 XML 配置文件中定义 resultMap -->
      <resultMap id="userResultMap" type="com.example.User">
        <!-- 指定 id 字段映射 -->
        <id property="id" column="id"/>
        <!-- 指定 username 字段映射 -->
        <result property="username" column="username"/>
        <!-- 指定 email 字段映射 -->
        <result property="email" column="email"/>
      </resultMap>
      //在SQL映射文件中,可以使用这个<resultMap>来进行查询结果的映射:
      <select id="selectUser" resultMap="userResultMap">
        SELECT id, username, email
        FROM user
        WHERE id = #{id}
      </select>
      
  3. 使用MyBatis Plus框架中的@TableFild注解映射二者的字段,如下图:
  4. 如果是查询操作 ,可以使用as重命名字段名,这样查询也就不会为null了

MyBatis中如何实现分页?它有几种实现分页的方式?

MyBatis中实现分页主要是一下两种实现方式:

  • 物理分页:物理上是使用SQL擦哈寻语句,在数据库引擎层面实现的,如MySQL的LIMIT语法进行分页
  • 逻辑分页:逻辑分页时在应用程序层面进行的分页,通常是先查询出所有符合条件的数据,然后在内存中对数据进行分页操作

物理分页

使用limit实现分页

物理分页是可以直接在XML中拼加SQL进行分页:

<select id="getUserList"resultType="User">
    select *from user
    limit #{limit} offset #{offset}
</select>

使用PageHelper插件实现分页

实现代码如下:

PageHelper.startPage(1,10);
//1 表示要查询的页码为第一页,10 表示每页显示的记录数为 10 条
List<User>list=userMapper.selectIf(1);
 PageHelper实现原理分析

PageHelper底层是使用MyBatis的拦截器(Interceptor)机制,在MyBatis进行查询时,拦截并对SQL语句进行动态修改(添加limit等分页查询操作),之后查询数据库、并对查询结果进行包装,包装成分页对象(如包含数据列表、总记录数、总页数等信息的分页对象),最后再将这个分页对象返回给客户端

逻辑分页

MyBatis自带的RowBounds进行分页就是逻辑分页,它的一次性查询很多数据,然后在数据中在进行检索,实现代码如下:

RowBounds rowBounds = new RowBounds(offset, limit);
List<User> users = sqlSession.selectList("getUserList", null, rowBounds);

其中 offset 为起始行偏移量,limit 是每页数据量,虽然设置了这两个值,但在使用 RowBounds 时,它会一次性查询多条数据,然后再在内存中进行 offset 和 limit 的筛选,最后在返回符合结果的数据 

MyBaits二级缓存有几种淘汰策略?如何设置缓存淘汰策略?

  1. LRU-最近最少使用:移除最长时间不被使用的对象
  2. FIFO-先进先出:按照对象进入缓存的顺序来移除对象
  3. SOFT-软引用:基于垃圾回收器状态和软引用规则移除对象
  4. WEAK-弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象

默认的缓存淘汰策略时LRU

可以通过eviction属性来设置淘汰策略,如下:

<cache eviction="FIFO"/>

MyBatisPlus如何实现分页功能?它的底层是如何实现的?

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上提供了更多方便的功能,包括分页功能。在 MyBatis-Plus 中,实现分页功能非常简单,主要使用 Page 类进行分页操作。

以下是使用 MyBatis-Plus 实现分页功能的基本步骤:

  • 在 Mapper 接口中定义查询方法,并接收一个 Page 类型的参数,用于分页
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

public interface UserMapper extends BaseMapper<User> {
    Page<User> selectUserPage(Page<User> page);
}
  • 在 Mapper XML 文件中编写对应的 SQL 查询语句
<select id="selectUserPage" resultType="com.example.User">
    select * from user
</select>
  • 在 Service 层调用 Mapper 中定义的查询方法,并传入一个 Page 对象作为参数
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public Page<User> selectUserPage(int pageNum, int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return userMapper.selectUserPage(page);
    }
}

这样就完成了分页功能的实现。MyBatis-Plus会自动将查询结果封装到Page对象中,其中包含了分页的相关信息,比如当前页码、每页大小、总记录数等

MyBatis-Plus底层是通过拦截器实现分页的,它会在执行SQL语句前进行拦截,并根据传入的分页参数自动生成对应的分页SQL语句,然后执行分页查询。最后将查询结果封装到Page对象中返回给调用方。这样,开发人员不需要手动编写分页的SQL语句,简化了开发流程

MyBatis中使用了哪些设计模式?举例说明一下

  1. 工厂模式:工厂模式是Java中最常见的设计模式之一。工厂模式就是它提供一个工厂,当有客户需要调用的时候,只调用这个工厂类就可以得到自己想要的结果,从而无需关注某类的具体实现过程。工厂模式在MyBatis中典型的代表就是SqlSessionFactory。SqlSession是MyBatis中的重要而Java接口,可以通过该接口来执行SQL语句,获取映射器示例和管理事务,而SqlSessionFactory正在用来产生SqlSession对象的,所以它在MyBatis中是比较核心的接口
  2. 建造者模式:建造者模式就是将一个复杂对象的构建与它的表示分离,使得的同样的构建过程可以创建不同的表示。也就是说建造者可以通过多个模块一步一步实现对象的构建,相同的构建过程可以创建不同产品。建造者模式在MyBatis中典型代表就是SqlSessionFactoryBuilder。普通的对象都是通过new关键字直接创建的,但是如果创建对象需要构造参数很多,且不能保证每个参数都是正确的或者不能一次性得到构建所需的所有参数,那么就需要将构建逻辑从对象本身抽离出来,让对象只关注功能,把构建交给构建类,这样就可以简化对象的构建,也可以达到分布构建对象的目的
  3. 单例模式:单例模式是Java中最简单的设计模式之一,此模式保证某个类在运行期间,只有一个实例对外提供服务,而这类被称为单例类。单例模式在MyBatis中典型的代表就是ErrorContext。ErrorContext是线程级别的单例,每一个线程有一个此对象的单例,用于记录该现成的执行环境的错误信息
  4. 代理模式:代理模式是指给某个对象提供一个代理对象,并由代理对象控制原对象的调用。代理模式在MyBatis中典型的代表就是MapperProxyFactory。MapperProxyFactory的newInstance()方法就是生成一个具体的代理类来实现某个功能

JVM是如何运行的?

JVM的执行流程如下:

  1. 程序再执行之前先要把Java代码转换成字节码(class文件),JVM首先需要把字节码通过一定的方式类加载器(ClassLoader)把文件加载到内存中运行时数据区(Runtime Data Area)
  2. 但是字节码文件是JVM的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器,也就是JVM的执行引擎会将字节码翻译成底层系统指令再交由CPU去执行
  3. 在执行的过程中,也需要调用其他语言接口,如通过调用本地库接口(Native Interface)来实现整个程序的运行

所以整体来看,JVM主要是通过以下四个部分来执行Java程序的:

  1. 类加载器
  2. 运行时数据区
  3. 执行引擎
  4. 本地库接口

Java是编译性语言还是解释性语言?

编译型语言和解释性语言区别如下:

  • 编译性语言:在程序执行之前,先经过编译器的处理,将源代码转换为目标及其可以执行的二进制机器码,然后直接执行。因此编译过程只需要进行一次,生成可执行文件可以重复运行
    • 优点:执行效率高
    • 缺点:编译时间长跨平台能力有限
  • 解释性语言:不需要事先编译成机器码,而是在运行时由解释器江源带哦吗逐行解释执行
    • 优点:跨平台性比较好,无需编译
    • 缺点:执行效率低,不宜保护源代码

而Java语言既不属于编译性语言也而不属于解释性语言,又不完全属于解释性语言。Java是半编译语言,也叫编译-解释型语言,其执行过程包括编译和解释两个阶段:

  1. 编译阶段:Java源代码(.Java文件)通过Java编译器编译成字节码文件(.class文件)。字节码是一种中间语言,它具有平台无关性,可以在任何支持Java虚拟机(JVM)平台上运行
  2. 解释阶段:达昂程序运行时,Java虚拟机会加载字节码,并且对其进行解释或即使编译执行。现代JVM普遍采用JIT技术,会根据代码热点将频繁执行的字节码动态编译成本地机器指令以提高性能

为什么需要将 java 代码编译成字节码(.class)?

Java需要编译成字节码(.class文件)的原因主要是有以下几点:

  1. 跨平台执行:将Java代码编译成字节码,可以使不同平台下的Java虚拟机(JVM)识别,从而根据平台特性,从而生成不同平台的二进制机器码进行执行,这样就可以实现跨平台执行
  2. 代码检查:编译器在编译阶段会对代码进行类型检查,确保代码的类型安全性,让我们提前发现一些潜在的错误,例如类型不匹配、缺少方法等问题
  3. 动态加载和扩展:将Java代码编译成字节码可以动态扩展一些功能,例如Lombok插件的@Getter和@Setter方法就是编译器进行字节码生成的
  4. 高效执行:字节码是一种中间表示形式,相比于原始的源代码,可以提供更高效的执行和优化。JVM会通过即使编译等技术将字节码转换为机器码,以提高程序的执行速度
  5. 代码保护:编译后的字节码是一种经过转换的相信那个是,与原始的源代码相比,更难以直接理解。这可以提供一定程度的代码保护,使得源代码的逻辑和实现细节难以被逆向工程或恶意更改

说一下JVM的内存布局?

通常所说的JVM内存布局,通常是指JVM运行时数据区,也就是当字节码被类加载器加载后的执行区域。JVM运行时数据区主要分为以下几个部分:

  1. 程序计数器:当存储当前线程执行的字节码指令地址,在多线程环境之中,程序计数器用于实现线程切换,保证线程恢复执行时能后继续从正确的位置执行代码
  2. Java虚拟机栈:用于存储方法调用和局部变量(方法内部定义的变量),在方法调用和返回时,虚拟机栈用于保存方法的调用帧,包括方法的局部变量、操作数栈、方法返回地址等
  3. 本地方法栈:与薰妮基栈类似,本地方法找用于执行本地方法
  4. Java堆:JVM中的最大一块内存存储区域,用于存储对象实例,所有对象都在堆中分配内存
  5. 方法区:用于存储类的元数据信息,包括类的结构、字段、方法、静态变量、常量池等

Java虚拟机规范和Java虚拟机有什么关系 

它们是一个JVM规范,以一个是针对规范的实现产品,具体来说:

  • Java 虚拟机规范(JVM Specification)是 Sun Microsystems 公司(现为 Oracle 公司)制定的一套详细的文档,它定义了 Java 虚拟机的内部工作原理、结构、指令集、数据类型、内存区域、垃圾收集、类文件格式、加载和执行机制等具体规则,这些规则是 Java 平台实现兼容性和可移植性的基础
  • Java 虚拟机(Java Virtual Machine,JVM)则是根据上述规范实现的具体软件系统,它是一个实际运行在物理硬件上的程序,负责装载并执行 Java 字节码。任何符合 Java 虚拟机规范的 JM 都可以正确解释和执行标准的 Java 字节码,从而确保 Java 代码的“一次编写,到处运行”的特性

因此,Java 虚拟机规范与 Java 虚拟机的关系可以理解为规范与实现的关系。规范描述了所有 Java 虚拟机应遵循的标准和约定,而各种不同的 Java 虚拟机则是按照该规范进行设计和实现的具体产品。例如,HotSpot JVM 就是由 Oracle 开发的一款广泛使用的 Java 虚拟机的默认实

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

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

相关文章

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出&#xff0c;滑到最下面&#xff0c;出现这个就说明构建成功了&#xff0c;如果没有出现&#xff0c;说明构建有问题&#xff0c;需要解决好问题才能启动哦~

Python 九九乘法表的7种实现方式

Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一&#xff0c;因此各种语言都有对应的实现方式&#xff0c;而 Python 也不例外。在 Python 中&#xff0c;我们可以使用多种方式来生成一个简单的九九乘法表。 实现方式一&#xff1a;双重循环 f…

使用 Node.js 和 Cheerio 爬取网站图片

写一个关于图片爬取的小案例 爬取效果 使用插件如下&#xff1a; {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…

Android T 远程动画显示流程(更新中)

序 本地动画和远程动画区别是什么? 本地动画&#xff1a;自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画&#xff1a;拿来吧你&#xff01;一个app A对另一个app B通过binder跨进程通信&#xff0c;控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…

F5负载均衡有何技术优势?为你详细解读

当今数字化时代&#xff0c;网络应用的性能对于企业的成功至关重要。负载均衡建立在现有网络结构之上&#xff0c;提供了有效的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。F5负载均衡技术则成为了许多企业实现高可用性和高…

原生table样式

HTML <div><table style"width: 100%;"><thead><tr><th style"width:25%;">董事会</th><th style"width:25%;">监事会</th><th style"width:25%;">股东</th><th sty…

物理信息神经网络PINN2024最新改良方案汇总(含复现代码)

传统的数值方法在处理复杂问题时可能需要大量的计算资源和时间&#xff0c;而改良后的PINN可以通过更有效的算法减少计算成本&#xff0c;使得求解过程更加高效。 在写论文时&#xff0c;我们也可以通过改进PINN减少数据需求、加速模型收敛、提高预测准确性、增强可解释性&…

linux -- 内存管理 -- SLAB分配器

SLAB分配器&#xff08;slab allocator&#xff09; SLAB分配器用于小内存空间管理&#xff0c;基本思想是&#xff1a;先利用页面分配器分配出单个或多个连续的物理页面&#xff0c;然后再此基础上将整块页面分割为多个相等的小内存单元&#xff0c;来满足小内存空间分配的需…

kerberos+kafka(2.13)认证(单节点ubuntu)

一&#xff1a;搭建kerberos。 1. 运行安装命令 apt-get install krb5-admin-server krb5-kdc krb5-user krb5-config2. 检查服务是否启动。 systemctl status krb5-admin-server systemctl status krb5-kdcsystemctl start krb5-admin-server systemctl startkrb5-kdc3. 修…

网络安全知识和华为防火墙

网络安全 网络空间安全 ---Cyberspace 2003年美国提出的网络空间概念 ---一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海、陆、空、天以外的第五大人类互动领域。 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安…

校园教学气象站是什么

TH-XQ3在当今社会&#xff0c;气象科学的重要性日益凸显。它不仅关系到农业、交通、航空等多个领域的安全&#xff0c;更对人类的生活产生深远影响。因此&#xff0c;许多学校纷纷开设气象学相关课程&#xff0c;帮助学生了解气象知识&#xff0c;培养他们的科学素养。而在这其…

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

termux 玩法(一)

termux基础 termux基础玩法推荐国光写的手册&#xff1a;Termux 高级终端安装使用配置教程 | 国光 (sqlsec.com) termux安装 个人使用F-Droid安装的termux&#xff1a;Termux | F-Droid - Free and Open Source Android App Repository 基础知识 这些基础知识简单了解一下…

HDFS Federation前世今生

一 背景 熟悉大数据的人应该都知道&#xff0c;HDFS 是一个分布式文件系统&#xff0c;它是基于谷歌的GFS实现的开源系统&#xff0c;设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode&#xff0c;如下 从上面…

【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本&#xff0c;和插入排序有着相同的特性&#xff0c;即原始数组有序度越高则算法的时间复杂度越低&#xff08;预排序机制&#xff09;&#xff0c;但是是不稳定排序算法。 为了降低算法的时间复杂度&#xff0c;所以我们需要在排序之前尽…

3D效果图加树进去太卡,渲染太慢怎么办?

周末的时候&#xff0c;有个朋友私信来问&#xff1a;3dmax模型加树进去打开时特别的卡&#xff0c;是怎么回事。 不知道有没有朋友遇上这么个情况。 3dmax加树建议就用代理&#xff0c;这样相比于直接加而言&#xff0c;会流畅许多。 在3D效果图中&#xff0c;“树代理”是…

计网Lesson11 - 虚拟机网络环境及socket概述

文章目录 虚拟机的简述socket概述 虚拟机的简述 放张图在这&#xff0c;根本没明白是啥对啥&#xff0c;以后学了Linux再来吧 &#x1f626; socket概述 s o c k e t socket socket 是一种用于应用层的用户态与应用层以下的内核态交互的工具&#xff0c;本意为“插座”。 也就是…

AI新工具(20240130) Code Llama 70B-开源代码生成模型;海螺问问

Code Llama 70B-开源代码生成模型 Code Llama 70B是一个大型语言模型&#xff0c;通过对自然语言指令进行微调&#xff0c;可以生成有用且安全的答案。它提供了三个版本&#xff0c;分别是基础代码模型、专门针对Python的版本&#xff0c;以及针对理解自然语言指令进行微调的版…

电气自动化行业,全面数字化工作流程

电气自动化行业数字化转型所需流程软件&#xff0c;与大家分享如下&#xff1a; D-Hub企业数字化协同平台、SuperHarness数字线束软件、SuperPanel母排设计软件、D-Hub生产管理系统&#xff0c;全面的数字化工作流程&#xff0c;智能降本增效&#xff01; D-Hub D-Hub是一款…

怎么制作出圈的虚拟数字人城市宣传短片?

如今&#xff0c;中国城市面临一个从To B&#xff08;企业客户&#xff09;、To G&#xff08;政府客户&#xff09;到To C&#xff08;一般客户&#xff09;的转变。其中&#xff0c;城市宣传片作为与C端沟通的最佳途径&#xff0c;一个“吸睛”的城市短片&#xff0c;可以有效…