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> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, YourJavaType parameter, JdbcType jdbcType) throws SQLException {// 实现将 Java 类型转换为 JDBC 类型的逻辑}@Overridepublic YourJavaType getNullableResult(ResultSet rs, String columnName) throws SQLException {// 实现从 ResultSet 中获取 Java 类型的逻辑}@Overridepublic YourJavaType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 实现从 ResultSet 中获取 Java 类型的逻辑(通过列索引)}@Overridepublic 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.mzph.cn/news/826267.shtml

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

相关文章

【Flutter】多语言方案二:GetX 版

介绍 多语言方案&#xff1a;GetX版&#xff0c;需要手动自定义字符串引用常量&#xff0c;优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹&#xff0c;文件夹下创建一个local.dart文件2.language文件夹下创…

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32&#xff1a;新产品构思 新作品 我时常把自己看做一位木匠&#xff0c;有点手艺&#xff0c;能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时&#xff0c;要开启下一个作品的创造了。 其实早在2022的1…

进程间通信(1)管道

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

【C语言】内存函数-memcpy-memmove-memset...用法及实现,沉淀自己!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. memcpy函数使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy函数使用和模拟实现 <string.h>-------…

Buildroot系统构建学习笔记(以百问网imx6ullPro开发板为例)

一、Builroot是什么&#xff1f; Buildroot是一组Makefile和补丁&#xff0c;可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloader、Linux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台&#xff0c;可以使用交叉编译工具为多个目标板构建嵌…

沉思录 (梁实秋)

链接&#xff1a;https://pan.quark.cn/s/8e27564b02f5

Python 检测当前系统的内存及硬盘资源,发送邮件告警通知(告警内容包含告警语句及网卡和系统版本时间)

颜色块 rootbogon:~ 2024-04-18 16:16:40# cat DefaultColor.py ######################################################################### # File Name: DefaultColor.py # Author: eight # Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 10:…

H3C之GRE VPN

华子目录 GRE实验测试 MGRE实验 GRE实验 第一步&#xff1a;接口配置IP地址 <H3C>sys System View: return to User View with CtrlZ. [H3C]sysname r1 [r1]int g0/0 [r1-GigabitEthernet0/0]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0]int g0/1 [r1-GigabitEtherne…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源&#xff0c;会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站&#xff0c;以拓宽你的创作视野&#xff0c;帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府&#xff08;中国&#xff09; 提供各种类别的优质高清视频素…

视频监控平台的web客户端看到的视频画面是黑屏时的处理方法

目录 一、问题描述 二、问题分析 &#xff08;一&#xff09;总体分析 &#xff08;二&#xff09;视频流传输问题的原因分析 1、网络问题 2、设备问题 3、配置和设置问题 4、兼容性问题 三、诊断和排查步骤 &#xff08;一&#xff09;编码方式问题的处理办法 &…

Redis中的订阅发布(一)

订阅发布 概述 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBER命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者(subscribe)&#xff1a; 每当有其他客户端向被订阅的频道发送消息(message)时&…

同旺科技 USB TO SPI / I2C适配器读写24LC256--页写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版&#xff1b; 从00地址开始写入64个字节&#xff0c;然后再将64个字节读回&#xff1b; 页写时序&#xff1a; 读时序&#xff1a…

iOS开发 刻度盘 仪表盘,圆点按钮滑动控制,渐变色

最近项目需要&#xff0c;想做一个渐变色的刻度盘&#xff0c;圆形按钮滑动控制&#xff0c;所以 用oc写了一下&#xff0c;代码没附上&#xff0c;想看代码可以私信联系&#xff0c;效果如下图。 部分代码 self.drawCenter CGPointMake(self.frame.size.width / 2.0, self.f…

姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。

春日已至&#xff0c;姑苏古城迎来了一场编程的盛宴——开放原子开源大赛OpenTiny前端Web应用开发挑战赛。历时三个月的激烈角逐&#xff0c;OpenTiny与众多开发者携手共赴这场智慧的较量。决赛路演于4月14日在苏州&#xff08;太湖&#xff09;产业软件园圆满落下帷幕~ 开放原…

rabbitmq 使用SAC队列实现顺序消息

rabbitmq 使用SAC队列实现顺序消息 前提 SAC: single active consumer, 是指如果有多个实例&#xff0c;只允许其中一个实例消费&#xff0c;其他实例为空闲 目的 实现消息顺序消费&#xff0c;操作&#xff1a; 创建4个SAC队列,消息的路由key 取队列个数模&#xff0c;这…

Python可视化数据分析-柱状图/折线图

一、前言 使用python编写一个图表生成器&#xff0c;输入各公司的不良品数量&#xff0c;可以在一张图中同时展示数据的柱状图和折线图。 效果如下&#xff1a; 二、基础知识 绘制折线图和柱状图主要使用到了 pyecharts.charts 模块中的 Line 和 Bar 类。它们允许用户通过简…

完整、免费的把pdf转word文档

在线工具网 https://www.orcc.online/pdf 支持pdf转word&#xff0c;免费、完整、快捷 登录网站 https://orcc.online/pdf 选择需要转换的pdf文件&#xff1a; 等待转换完成 点击蓝色文件即可下载 无限制&#xff0c;完整转换。

动态IP与静态IP的区别,你选对了吗?

在互联网世界中&#xff0c;IP地址是每台设备在网络上的唯一标识。这些地址可以是动态的&#xff0c;也可以是静态的。对于非专业人士来说&#xff0c;理解这两者之间的区别可能会有些困难。本文旨在深入探讨动态IP和静态IP的主要差异&#xff0c;帮助读者根据自己的需求做出明…

Golang | Leetcode Golang题解之第37题解数独

题目&#xff1a; 题解&#xff1a; func solveSudoku(board [][]byte) {var line, column [9][9]boolvar block [3][3][9]boolvar spaces [][2]intfor i, row : range board {for j, b : range row {if b . {spaces append(spaces, [2]int{i, j})} else {digit : b - 1line…

docker网路和主机通讯问题

#注 1&#xff0c;安装docker和启动容器服务的时候如果防火墙处于开启状态&#xff0c;那么重启docker里面的容器的时候必须开启防火墙&#xff0c;否则会出现iptable错误&#xff1b; 2&#xff0c;linux开启防火墙会导致主机和docker网络之间单向通讯&#xff0c;主机可以访…