MyBatis 面试题(八)

1. MyBatis-Plus 是什么框架?

MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了功能扩展和增强,旨在简化开发、提高效率。这个框架提供了许多方便的功能,如自动生成 MyBatis 的 mapper 接口以及对应的实现类,提供了一些通用的 CRUD(创建、读取、更新、删除)方法,支持 Lambda 表达式查询,提供了分页查询的功能,支持主键自动生成,以及提供了代码生成器,可以快速生成代码。

MyBatis-Plus 的优点包括:

  1. 依赖少:仅仅依赖 MyBatis 以及 MyBatis-Spring。
  2. 损耗小:启动即会自动注入基本 CRUD,性能基本无损耗,直接面向对象操作。
  3. 预防 SQL 注入:内置 SQL 注入剥离器,有效预防 SQL 注入攻击。
  4. 通用 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。
  5. 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
  6. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
  7. 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询问题。

在使用 MyBatis-Plus 时,通常需要进行以下步骤:

  1. 配置数据源:在配置文件中配置数据库连接信息,如驱动、URL、用户名和密码等。
  2. 创建实体类:创建与数据库表对应的实体类,使用注解或 XML 配置实体类与数据库表的映射关系。
  3. 创建 Mapper 接口:创建继承 BaseMapper 接口的 Mapper 接口,并在方法上添加对应的注解,如 @Select@Update@Insert@Delete 等。
  4. 使用基本 CRUD 方法:使用 MyBatis-Plus 提供的基本 CRUD 方法,如 insertdeleteByIdupdateByIdselectById 等。
  5. 使用条件构造器:可以使用 MyBatis-Plus 提供的条件构造器来构建灵活的查询条件,如 WrapperQueryWrapperUpdateWrapper 等。

总之,MyBatis-Plus 是一个功能强大且易于使用的 MyBatis 增强工具,它提供了许多方便的功能和特性,可以帮助开发者更高效地进行数据库操作。

2. 什么是 JPA?

JPA(Java Persistence API)是Java持久化API的缩写,它是一套由Sun Microsystems官方提出的Java持久化规范(即ORM映射规范)。JPA是在Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。它整合了ORM映射和JPA规范,很大程度上简化了现有Java应用的持久化开发。

JPA的主要目标是提供一种简单的、统一的API来访问关系数据库。它把底层的数据访问逻辑从业务逻辑中解耦出来,使得开发者能够专注于业务逻辑的实现,而无需关心底层的数据库访问细节。通过JPA,开发者可以使用面向对象的方式来操作数据库,例如创建、读取、更新和删除数据,而无需编写大量的SQL语句。

JPA还提供了一些高级特性,如事务管理、缓存和查询优化等,这些特性可以帮助开发者提高应用的性能和可维护性。此外,JPA还支持多种数据库和JDBC驱动,使得开发者能够灵活地选择适合自己项目需求的数据库和JDBC驱动。

总之,JPA是一种强大的Java持久化规范,它提供了简单易用的API来访问关系数据库,帮助开发者实现高效的数据访问和管理。

3. MyBatis 和JPA 有什么区别?

MyBatis和JPA在多个方面存在明显的区别。

  1. 开发方式:MyBatis是一种SQL中心的开发方式,它允许开发者直接编写SQL语句,并提供强大的动态SQL功能,使得根据不同条件构建不同的SQL语句成为可能,提高了SQL语句的灵活性。而JPA则是一种对象中心的开发方式,它让开发者可以专注于业务逻辑和对象模型,而不需要关心SQL语句的细节。
  2. 事务管理:JPA支持事务管理,提供了一组注解和API来管理事务的起始、提交和回滚,确保数据的一致性和完整性。相比之下,MyBatis本身并不直接处理事务管理,它更多地关注于SQL的映射和执行,而事务管理通常是由调用者(如Spring框架)来处理的。
  3. 对象关系映射:JPA允许开发人员将Java对象映射到关系数据库的表结构中,实现简单的对象持久化。这可以通过注解或XML配置来定义对象与数据库表之间的映射关系。MyBatis虽然也支持对象与数据库的映射,但它更多地是通过XML或注解来定义SQL语句和参数,而不是直接处理对象与表之间的映射。
  4. 控制级别:JPA提供了更高层次的抽象和封装,使得开发者可以更加专注于业务逻辑。而MyBatis则提供了更低层次的控制和定制,允许开发者直接编写和优化SQL语句。
  5. 实现方式:JPA本身并不提供具体的实现,而是由如Hibernate、EclipseLink等框架来实现。MyBatis则是一个独立的框架,它提供了自己的API和工具。

总结来说,MyBatis和JPA各有其特点和适用场景。MyBatis更适合那些需要直接控制SQL语句和需要高度定制化的场景,而JPA则更适合那些希望以对象为中心,减少直接编写SQL语句的场景。选择哪个框架取决于具体的项目需求和个人或团队的偏好。

4. MyBatis 中 StatementHandler 和 MappedStatement 区别?

MyBatis 是一个优秀的持久层框架,它封装了 JDBC 的底层操作细节,使得开发者能够更方便地进行数据库操作。在 MyBatis 中,StatementHandlerMappedStatement 都是重要的组件,但它们各自的角色和职责有所区别。

  1. StatementHandler

    • 角色:StatementHandler 是 MyBatis 中用于处理 JDBC Statement 的核心组件。
    • 职责:它负责处理 JDBC Statement 的创建、参数设置、SQL 语句执行以及结果集映射等工作。这意味着,当 MyBatis 需要与数据库进行交互时,它会通过 StatementHandler 来构建和执行相应的 SQL 语句,并将结果集转换为 Java 对象。
    • 实现:StatementHandler 接口有两个实现类,分别是 RoutingStatementHandler 和 BaseStatementHandler。其中,RoutingStatementHandler 会根据 MappedStatement 指定的 statementType 字段来创建对应的 StatementHandler 接口实现。
  2. MappedStatement

    • 角色:MappedStatement 是描述 Mapper 中 SQL 配置信息的关键组件。
    • 职责:它主要用于描述如何在数据库上执行 SQL。每一个 <select/><insert/><update/><delete/> 标签都对应一个 MappedStatement 对象。这些对象包含了 SQL 语句、输入参数映射和返回结果映射等信息。简而言之,MappedStatement 是 MyBatis 中关于如何执行 SQL 的详细描述。
    • 与 Mapper 的关系:MappedStatement 是对 Mapper XML 配置文件中的 sql 标签或者 Mapper 接口中的 sql 注解配置信息的封装。这意味着,当你定义一个 Mapper 接口或编写一个 Mapper XML 文件时,MyBatis 会解析这些定义并创建相应的 MappedStatement 对象。

总结来说,StatementHandler 和 MappedStatement 在 MyBatis 中各自扮演了不同的角色。MappedStatement 主要负责描述 SQL 配置信息,而 StatementHandler 则负责处理这些 SQL 语句的实际执行。它们协同工作,使得 MyBatis 能够高效地执行数据库操作。

5. MyBatis 常用的 TypeHandler 有哪些?

MyBatis 中常用的 TypeHandler 主要用于处理 Java 类型和数据库类型之间的转换。以下是一些常见的 TypeHandler:

  1. BooleanTypeHandler:用于处理 Java 的 Boolean 类型和数据库中的 BIT 类型之间的转换。
  2. DateTypeHandler 和 TimestampTypeHandler:这两个处理器都用于处理 Java 的 java.util.Date 类型和数据库中的 TIMESTAMP 类型之间的转换。DateTypeHandler 主要处理日期部分,而 TimestampTypeHandler 则处理日期和时间部分。
  3. IntegerTypeHandler:用于处理 Java 的 Integer 类型和数据库中的 INTEGER 类型之间的转换。
  4. LongTypeHandler:用于处理 Java 的 Long 类型和数据库中的 BIGINT 类型之间的转换。
  5. BigDecimalTypeHandler:用于处理 Java 的 BigDecimal 类型和数据库中的 DECIMAL 或 NUMERIC 类型之间的转换。
  6. StringTypeHandler:用于处理 Java 的 String 类型和数据库中的 VARCHAR 或 CHAR 类型之间的转换。
  7. EnumTypeHandler:用于处理 Java 的枚举类型和数据库中的 VARCHAR 或其他类型之间的转换。这通常需要自定义实现,因为 MyBatis 没有为所有枚举类型提供默认的 TypeHandler。

除了上述常用的 TypeHandler,MyBatis 还允许开发者根据需要自定义 TypeHandler,以处理特定的类型转换需求。自定义 TypeHandler 需要实现 MyBatis 提供的 TypeHandler 接口或继承其实现类,并覆盖相应的方法来实现类型转换逻辑。

需要注意的是,TypeHandler 的选择和使用应该根据具体的数据库类型、Java 类型以及业务需求来确定。在配置 MyBatis 时,可以通过在 XML 配置文件中指定 typeHandler 属性,或者在注解中使用相应的 TypeHandler 类来指定要使用的 TypeHandler。

6. MyBatis 怎么实现自定义的 TypeHandler?

MyBatis 允许你通过实现 TypeHandler 接口或继承 BaseTypeHandler 类来创建自定义的类型处理器(TypeHandler)。类型处理器用于在 Java 类型和 JDBC 类型之间进行转换。例如,你可能需要实现一个自定义的 TypeHandler 来处理枚举类型,或者处理一些特殊的日期时间格式。

以下是一个自定义 TypeHandler 的基本步骤:

  1. 实现 TypeHandler 接口

首先,你需要实现 org.apache.ibatis.type.TypeHandler 接口或继承 org.apache.ibatis.type.BaseTypeHandler 类。这个接口定义了一些方法,用于处理 Java 类型和 JDBC 类型之间的转换。

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(YourJavaType.class) // 指定这个 TypeHandler 处理的 Java 类型
public class YourJavaTypeTypeHandler extends BaseTypeHandler<YourJavaType> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, YourJavaType parameter, JdbcType jdbcType) throws SQLException {
        // 实现将 Java 类型转换为 JDBC 类型的逻辑
    }

    @Override
    public YourJavaType getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 实现从 ResultSet 中获取 Java 类型的逻辑
    }

    @Override
    public YourJavaType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 实现从 ResultSet 中获取 Java 类型的逻辑(通过列索引)
    }

    @Override
    public YourJavaType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 实现从 CallableStatement 中获取 Java 类型的逻辑
    }
}
  1. 在 MyBatis 配置文件中注册 TypeHandler

然后,你需要在 MyBatis 的配置文件中注册你的自定义 TypeHandler。这可以通过在 <typeHandlers> 元素中添加 <typeHandler> 子元素来完成。

<configuration>
    <!-- 其他配置 -->
    <typeHandlers>
        <typeHandler handler="com.yourpackage.YourJavaTypeTypeHandler"/>
    </typeHandlers>
</configuration>

或者,如果你使用的是注解方式配置 MyBatis,你可以在 Mapper 接口或 XML Mapper 文件中使用 @TypeHandler 注解来指定类型处理器。
3. 在 SQL 映射中使用 TypeHandler

最后,在你的 SQL 映射文件中,你可以直接使用你的自定义类型。MyBatis 会自动使用你注册的 TypeHandler 来处理这些类型的转换。

注意:如果你的自定义类型处理器处理的是常见的 Java 类型(如 String、Integer 等),你可能还需要在 MyBatis 的配置文件中覆盖默认的类型处理器。这可以通过在 <typeAliases> 元素中添加 <typeAlias> 子元素来完成。

这就是在 MyBatis 中实现自定义 TypeHandler 的基本步骤。通过自定义 TypeHandler,你可以灵活地处理各种 Java 类型和 JDBC 类型之间的转换,以满足你的特定需求。

7. MyBatis 执行流程是怎样的?

MyBatis 的执行流程相对清晰且直接,主要涉及以下步骤:

  1. 读取配置文件:MyBatis 首先会读取配置文件(通常是 mybatis-config.xml),这个配置文件包含了数据库连接信息、事务管理器、数据源以及映射文件的位置等关键信息。

  2. 初始化:根据配置文件的信息,MyBatis 会初始化一个 SqlSessionFactory 对象。这个对象是一个重量级的对象,通常在整个应用中只会有一个,因此它会被缓存起来供后续使用。

  3. 创建 SqlSession:当需要与数据库进行交互时,会调用 SqlSessionFactoryopenSession() 方法来创建一个 SqlSession 对象。SqlSession 是 MyBatis 的核心接口,它表示和数据库的一次会话,主要执行增删改查的操作。

  4. 执行映射器:通过 SqlSession,可以调用映射器(Mapper)中定义的方法。映射器是开发者定义的一个接口,里面包含了与数据库表操作对应的方法。这些方法会被 MyBatis 转换为对应的 SQL 语句并执行。

  5. 输入参数映射:MyBatis 会将方法中的参数按照配置文件中的映射关系,转换为 SQL 语句中的占位符。

  6. 发送 SQL 到数据库:MyBatis 将生成的 SQL 语句发送到数据库执行。

  7. 结果集映射:数据库返回结果后,MyBatis 会根据配置文件中的映射关系,将结果集中的数据转换为 Java 对象。

  8. 返回结果:最后,MyBatis 将转换后的 Java 对象返回给调用者。

  9. 关闭 SqlSession:当一次数据库会话结束后,需要关闭 SqlSession,释放资源。

在整个执行流程中,MyBatis 使用了大量的 XML 配置文件和注解来定义 SQL 语句、输入参数和输出结果的映射关系,这使得开发者能够更专注于业务逻辑的实现,而不需要过多关心底层的数据库操作。同时,MyBatis 也提供了丰富的 API 和插件机制,使得开发者能够灵活地扩展和定制其功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux——日志的编写与线程池

目录 前言 一、日志的编写 二、线程池 1.线程池基本原理 2.线程池作用 3.线程池的实现 前言 学了很多线程相关的知识点&#xff0c;线程控制、线程互斥、线程同步&#xff0c;今天我们将他们做一个总结&#xff0c;运用所学知识写一个较为完整的线程池&#xff0c;同时…

mac: docker安装及其Command not found: docker

已经安装了docker desktop&#xff0c;没安装的 点击安装 傻瓜式安装即可 接着打开终端&#xff1a;好一个 Comand not found:docker 看我不把你整顿&#xff0c;解决如下&#xff1a; 如果你在 macOS 上安装了 Docker Desktop&#xff0c;但是终端无法识别 docker 命令&…

目标检测——多模态人体动作数据集

一、重要性及意义 连续多模态人体动作识别检测的重要性及意义主要体现在以下几个方面&#xff1a; 首先&#xff0c;它极大地提升了人体动作识别的准确性和稳定性。由于人体动作具有复杂性和多样性&#xff0c;单一模态的数据往往难以全面、准确地描述动作的特征。而连续多模…

深度学习数据处理——对比标签文件与图像文件,把没有打标签的图像文件标记并删除

要对比目录下的jpg文件与json文件&#xff0c;并删除那些没有对应json文件的jpg文件&#xff0c;这个在深度学习或者机器学习时常会遇到。比如对一个数据集做处理时&#xff0c;往往会有些图像不用标注&#xff0c;那么这张图像是没有对应的标签文件的&#xff0c;这个时候又不…

python-django企业设备配件检修系统flask+vue

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 前端&#xff1a;vue.jselementui 框架&#…

玄子Share-LVM与磁盘配额

玄子Share-LVM与磁盘配额 LVM概述 Logical Volume Manager&#xff0c;逻辑卷管理 Linux系统中对磁盘分区进行管理的一种逻辑机制&#xff0c;是建立在硬盘和分区之上的一个逻辑层动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot分区用于存放引导文件&#xff…

服务器中查看CPU/GPU使用情况的常用命令

1、查看显卡 nvidia-smi2、间隔查看GPU使用情况 间隔5s刷新信息 watch -n 5 nvidia-smiCtrlC退出 参考博文&#xff1a;https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?productsmartapp&tk6ff15196d305c4dd3daab94b4abb81a4&share_urlhttps%3A%2F%2Fyebd1h…

JavaSE备忘录(未完)

文章目录 基本数据类型println 小知识除法( / ) 和 Infinity(无穷) 小知识除法InfinityInfinity 在除法中正负判断 求余(%) 小知识 基本数据类型 除 int、char 的包装类分别为 Integer、Character 外&#xff0c;其余基本数据类型的第一个字母大写就是它的包装类。 println 小…

vscode自动生成返回值的快捷键

vscode中类似idea的altenter功能&#xff0c;可以添加返回值 idea中是Introduce local variable&#xff0c; vscode中按下command.(句号) 然后选extract to local variable或者 Assign statement to new local variable都行&#xff0c; 光标在分号前如图&#xff1a; 光标在…

Redis快速入门操作

启动Redis 进入命令行客户端 字符串命令常用操作&#xff08;redis默认使用字符串来存储数据&#xff09; 列表&#xff08;Lists&#xff09;常用操作 集合&#xff08;Sets&#xff09;常用操作 &#xff08;无序集合且元素不可重复&#xff09; 有序集合&#xff08;So…

云原生虚拟数仓 PieCloudDB Database 4月更新盘点

第一部分 PieCloudDB Database 最新动态 增强本地缓存文件生命周期管理 PieCloudDB 在最新版本中增强了本地缓存文件生命周期管理&#xff0c;执行器节点重启之后可以继续使用之前缓存在本地的数据文件&#xff0c;从而节约重新从远端下载数据文件的带宽资源&#xff0c;提升…

DFS之剪枝(上交考研题目--正方形数组的数目)

题目 给定一个非负整数数组 A A A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A A A 的正方形排列的数目。 两个排列 A 1 A1 A1 和 A 2 A2 A2 不同的充要条件是存在某个索引 i i i&#xff0c;使得 A 1 [ i …

C语言简单的数据结构:双向链表的实现

目录&#xff1a; 1.双向链表的结构和初始化1.1双向链表的结构1.2双向链表的初始化 2.双向链表的相关操作2.1双向链表的尾插、打印和头插2.11双向链表的尾插2.12双向链表的打印2.13双向链表的头插 2.2双向链表的尾删和头删2.21双向链表的尾删2.22双向链表的头删 2.3双向链表查找…

实力认证!亚数产品入选《中国网络安全行业全景图(第十一版)》

2024年4月12日&#xff0c;安全牛第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;正式发布。 亚数信息科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“亚数”&#xff09;成功入选数字证书、加解密、密钥管理三项细分领域。 此…

开发同城O2O跑腿系统源码:构建高效便捷的本地服务平台教程

为了满足用户对便捷的需求&#xff0c;今天我们将一同探讨如何开发一个高效便捷的同城O2O跑腿系统&#xff0c;以构建一个功能全面、操作简单的本地服务平台。 一、确定需求和功能 在开发同城O2O跑腿系统之前&#xff0c;首先需要明确系统的需求和功能。用户可以通过该系统发布…

使用LangChain和Llama-Index实现多重检索RAG

大家好&#xff0c;在信息检索的世界里&#xff0c;查询扩展技术正引领着一场效率革命。本文将介绍这一技术的核心多查询检索&#xff0c;以及其是如何在LangChain和Llama-Index中得到应用的。 1.查询扩展 查询扩展是一种信息检索技术&#xff0c;通过在原始查询的基础上增加…

python辅助QQ登入

python辅助QQ登入 import pyautogui import time import random from pyautogui import ImageNotFoundException# 生成随机等待时间&#xff0c;范围在1到3秒之间 random_time random.uniform(1, 3)def find_and_click(image_path, moveFalse, execute_nextTrue):try:image_l…

达梦数据库:安装达梦数据库客户端并配置python调用

前言 本文主要介绍了达梦数据库的客户端安装方案、python调用方案。本文使用的达梦数据库版本为 V8&#xff0c;如果使用的是其他版本&#xff0c;操作可能会有些许差异。 下载 前往官网安装&#xff1a;产品下载 | 达梦数据库 根据自己的系统版本进行选择&#xff0c;而后点击…

基于SpringBoot的“论坛管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“论坛管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 论坛管理系统结构图 前台首页功能界面图 用户登录…

高速公路信息化大会 | 云轴科技ZStack分享云原生超融合在高速公路行业的应用

近日&#xff0c;作为第二十六届高速公路信息化大会分论坛之一&#xff0c;由中国公路学会邀请、英特尔支持和协办《第四届英特尔智慧化方案助力高速新基建升级论坛》在合肥顺利召开。来自智慧交通建设领域的创新企业和技术专家共聚一堂&#xff0c;围绕改扩建高速公路提升和数…