mybatis常见面试问题

news2024/9/21 10:36:03

0.原生JDBC样例:

public class MainClass { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 String url = "jdbc:mysql://localhost:3306/mqzy"; String user = "root"; String password = "root"; conn = DriverManager.getConnection(url, user, password); // 创建Statement stmt = conn.createStatement(); // 执行SQL查询 String sql = "SELECT * FROM sys_user"; rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { System.out.println(rs.getString("username") + " -- " + rs.getString("realname")); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }

原始的JDBC操作数据库主要有以下几个步骤:

Java数据库连接,(Java Database Connectivity,简称JDBC)

1.加载JDBC驱动

使用 Class.forName() 方法加载数据库驱动程序类。

2.获取连接对象

JDBC的底层其实是使用Socket进行连接数据库的。打开Connection .

3.执行SQL语句,返回执行结果

通过获取Statement实例执行SQL语句。

4.处理执行结果

最后返回的结果集是ResultSet。

5.释放资源

在完成数据库操作后,‌需要关闭ResultSet、‌Statement和Connection对象,‌以释放数据库资源。‌这一步非常重要,‌因为如果不关闭这些资源,‌可能会导致数据库连接泄露,‌影响系统性能。‌

1.什么是Mybatis或mybatis原理?

mybatis是一款优秀的持久层框架,用于简化JDBC开发。

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

mybatis是 apache的开源框架,其前身是ibatis。

Mybatis是一种流行的Java对象关系映射(ORM:Object Relational Mapping)框架,它将Java对象映射到关系型数据库中的表格。它提供了一种简单的方式来编写SQL语句并将其映射到Java对象,同时避免了很多传统JDBC的冗长代码。在使用Mybatis时,开发人员可以编写简洁的SQL语句,并且可以使用动态SQL和参数映射来进行高效和灵活的数据操作。

除了ORM之外,Mybatis还提供了许多高级功能,如缓存机制、批量操作、分页等等。它可以与多种数据库(如MySQL、Oracle、SQL Server等)和Web框架(如Spring、Spring Boot等)无缝集成,并被广泛应用于各种规模的应用程序中。

mybatis工作原理:

2.Mybatis的优缺点?

Mybatis的优点:

灵活性强:Mybatis允许开发人员编写自定义SQL语句,能够根据项目需求进行灵活配置和扩展,同时可以避免框架的约束和限制。

可读性好:Mybatis使用简洁的XML或注解配置方式,可以清晰地表达SQL语句和数据映射关系,提高代码的可读性和可维护性。

性能高:Mybatis提供了高效的缓存机制,能够有效地减少数据库操作的次数,并支持批量操作和分页查询等功能,能够提高应用程序的性能。

易于集成:Mybatis可以与多种数据库和Web框架无缝集成,能够适应不同的应用场景,同时也有完善的文档和社区支持。

Mybatis的缺点:

学习成本较高:相比于其他ORM框架,Mybatis需要开发人员熟悉SQL语句的编写和调优,需要一定的学习成本。

配置较为繁琐:Mybatis的配置文件较多,需要开发人员仔细配置,否则容易出现错误。

SQL语句调试困难:Mybatis将SQL语句和Java代码分离,当SQL语句出现问题时,调试起来相对困难。

不适合小型项目:对于小型项目而言,Mybatis的优势可能不够明显,反而会增加项目的开发成本和复杂度。

3.#{} 和 ${} 的区别是什么?

#{}使用预编译的方式来处理SQL语句中的参数,将传入的参数值以安全的方式替换掉占位符。在SQL语句执行前,会先将#{}替换为一个问号占位符,然后使用PreparedStatement进行预编译,最后将实际的参数值设置到预编译语句中。使用#{}可以有效地防止SQL注入等安全问题,同时也可以避免一些数据类型转换的问题。

${}则是直接将参数值替换到SQL语句中。在SQL语句执行前,会直接将${}替换为对应的参数值,这种方式的好处是可以直接拼接字符串,但也带来了一些安全问题。使用${}时需要开发人员自行保证参数的合法性,否则可能会出现SQL注入等安全问题。一般在表名或列名不固定的情况下使用${}。

SQL注入demo:

Statement statement = connection.createStatement(); String sql = "Select * from users where `usename`= '" + name + "' and password = '" + password + "';";

当入参

name = 'dqwdqw’ or 1 = 1;#'

password = '123456'时,最终打印出来的sql如下:

Select * from users where usename= ‘dqwdqw’ or 1 = 1; # and password = ‘" + password + "’;

此时#后面的就变成了注释。

使用PreparedStatemen避免sql注入。

String sql = "Select * from users where `usename`= ? and password = ?;"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,“ 'dqwdqw’ or 1 = 1;#' ”); preparedStatement.setString(2,“ 123456 ”);

preparedStatement在将输入或者你给定的参数传入sql语句前会将所有的sql关键字转义成非关键字的字符,这样即使你使用关键字也没办法起到关键字的作用。

SQL语句中特殊字符处理:

1)转义字符;

2)

4.xml 映射文件中有哪些标签?

CRUD操作标签:包括select、insert、update、delete等标签,用于定义对数据库的增、删、改、查操作。这些标签都包括id、parameterType、resultType等属性,用于指定SQL语句的ID、参数类型和返回结果类型等信息。

结果集映射标签:包括和标签,用于定义Java对象和数据库表之间的映射关系,可以将查询结果集映射为Java对象的属性。标签用于定义映射规则,标签用于定义单个属性的映射关系。

SQL片段标签:包括和标签,用于定义可重用的SQL代码片段。标签用于定义SQL语句的代码片段,可以在其他SQL语句中使用,标签用于将其他XML片段引入到当前XML文件中,可以用于复用其他XML片段中定义的SQL语句。

动态SQL标签:包括、、、、、、和等标签,用于动态生成SQL语句中的条件判断、循环、赋值等操作。这些标签可以根据参数值动态生成SQL语句,提高SQL语句的复用性和可维护性。

 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”, 元素也会将它们去除。

 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号。

5.模糊查询 like 语句该怎么写?

下面是两种常见的模糊查询方式:

1)使用占位符(%)进行模糊查询。SQL语句示例:

SELECT * FROM table WHERE column LIKE '%keyword%';

2)XML映射文件示例:

SELECT * FROM table WHERE column LIKE CONCAT('%',#{keyword},'%')

6.Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?

Mapper接口是Mybatis提供的一种编写SQL映射的方式,可以将SQL语句与Java方法进行关联,使得Java开发人员可以使用面向对象的方式来编写数据访问代码。Mapper接口的工作原理是:

  • 定义Mapper接口:首先,开发人员需要定义一个Java接口,其中每个方法代表一条SQL语句,方法名与SQL语句的ID一致,方法的参数和返回值类型与SQL语句的参数和返回值类型一致。
  • 映射Mapper接口:然后,将Mapper接口与SQL语句进行映射,可以使用XML文件或注解的方式进行映射。映射的方式包括指定SQL语句的ID、参数类型、返回值类型等信息。
  • 使用Mapper接口:最后,在Java代码中使用Mapper接口来进行数据访问,通过Mybatis框架将Mapper接口中的方法与SQL语句进行绑定,实现对数据库的访问操作。

至于Mapper接口中的方法重载问题,答案是:不可以。在Mapper接口中,每个方法名对应着一个唯一的SQL语句ID,方法名相同会造成冲突,因此Mapper接口中的方法不允许重载。如果需要执行不同的SQL语句,可以使用不同的方法名来实现。

7.MyBatis 是如何进行分页的?分页插件的原理是什么?

1.MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;

2.MyBatis可以使用SQL语句中的LIMIT关键字实现简单的分页,但是对于大数据量的分页查询,需要使用更高效的方法。

3.MyBatis提供了一种基于拦截器的分页插件来优化分页查询。

分页插件的原理是在MyB

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

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

相关文章

视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库

ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台…

重磅官宣!追光少年【彭禹锦】荣担任中国美育促进网amp;IPA美育中国行代言人

在美育事业蓬勃发展的今天,一位年仅15岁的少年以其非凡的艺术才华和积极向上的精神风貌,成为了万众瞩目的焦点。中国美育促进网与IPA美育中国行正式宣布,才华横溢、正能量满满的追光少年彭禹锦受邀担任“中国美育促进网&IPA美育中国行”代…

c++中__int128的使用

需要10^30才可以存&#xff0c;我们可以用__int128来算 #include<bits/stdc.h>using namespace std;bool is_sqr(__int128 x) {__int128 l -1, r 1e16;while (r - l > 1) {__int128 m (l r) / 2;__int128 m2 m * m;if (m2 < x) {l m;} else {r m;}}if (l *…

【机器学习】RNN循环神经网络的基本概念、工作原理(含python代码)和应用领域

引言 递归神经网络&#xff08;RNN&#xff09;是一类用于处理序列数据的神经网络。它们在处理如时间序列数据、语音、文本和其他序列格式数据时特别有用 文章目录 引言一、RNN的基本概念1.1 RNN的定义组成1.1.1 单个神经元1.1.2 网络结构 1.2 RNN的工作原理及代码示例1.2.1 循…

8月7日-8日学习

首先是昨天看到的gemma 2 中训练2B模型用了知识蒸馏&#xff0c;找了一下技术报告 结果先找到了一代的半天没有看到知识蒸馏的部分 然后在二代里面找到了 只有很小的一部分 就是用小模型学习大模型的概率预测分布 然后这里的话又找到了华为发布的小模型论文 Rethinking Optim…

Centos7安装Redis(采用docker安装方式)

文章目录 1 拉取Redis镜像2 上传并修改配置文件3 启动Docker容器4 查看Docker是否正常启动 linux系统安装redis可以自己上传程序&#xff0c;手动启动&#xff0c;也可以用docker以容器形式启动。 redis建议可采用docker安装&#xff0c;如果是例如mysql这种追求稳定的关系型数…

mmdeployv0.6 mmdetectionv2.4、mmcv-full1.6安装及环境搭建

一、安装条件 Step 1.创建conda虚拟环境并激活 conda create -n mmdeploy python3.8 -y #创建环境 conda activate mmdeploy #激活环境Step 2.安装 PyTorch #如果网不好&#xff0c;可以这样安装 pip3 install torch1.8.1cu111 torchvision0.9.1cu111 -…

基于python的百度迁徙迁入、迁出数据分析(十)

副标题&#xff1a;从百度迁徙数据看——迁徙数据特征分析 书接上文&#xff0c;我们先回顾一下我们统计的时间口径&#xff1a;2024年2月1日——2024年8月1日&#xff0c;这里包含了春运、清明、五一、端午、四个中大型国定假日&#xff0c;我们详细分析一下在当下的统计周期…

GOIP语音网关对接VOS3000技巧 落地于呼叫配置

GOIP语音网关对接VOS3000技巧 落地和呼叫以鼎信GOIP网关为例 首先登录vos端&#xff0c;添加落地网关和账户 账户添加&#xff1a; 账户管理&#xff0c;先添加账户然后应用&#xff0c;在过滤看看是否添加成功 给账户添加一个费率 双击费率数量添加费率的地区前缀&#xff0…

关于宠物浮毛对身体是否有害?宠物空气净化器选对告别浮毛困扰

说到宠物掉毛&#xff0c;大家是不是都会心里咯噔一下&#xff0c;担心这会不会对身体有啥不好&#xff1f;这确实是很多养宠人&#xff0c;还有那些正打算养宠的朋友心里的一块大石头。而且啊&#xff0c;这浮毛问题还常常成了家庭纷争的源头&#xff0c;特别是那些怀孕了的、…

【约数之和】

题目 TLE代码 #include<bits/stdc.h> using namespace std; typedef long long LL; #define x first #define y secondconst int N 5e710; const int MOD 9901; LL a, b; unordered_map<int, int> cnt; LL res 1; LL fast(int base, int expo) {LL result 1;…

TreeSet的排序方式

一.TreeSet的特点&#xff1a; 二.TreeSet对象排序练习题&#xff1a; 需求&#xff1a;利用TreeSet存储整数并进行排序 package com.itheima.a06mySet; ​ import java.util.TreeSet; ​ public class A05_TreeSetDemo1 {public static void main(String[] args) {//1.创建T…

链表算法题一

​ 旋转链表 旋转链表 首先考虑特殊情况 若给定链表为空表或者单个节点,则直接返回head,不需要旋转操作.题目给定条件范围: 0 < k < 2 ∗ 1 0 9 0 < k < 2 * 10^9 0<k<2∗109,但是受给定链表长度的限制,比如示例2中,k4与k1的效果等价. 那么可以得出kk%l…

QLabel设置图像的方法+绘制文本换行显示

1、QLabel设置图像有两种方法 (1) void setPicture(const QPicture &); (2) void setPixmap(const QPixmap &); QPicture和QPixmap都是继承于QPaintDevice&#xff0c;它们都可以通过加载图片的方式获取&#xff1a;bool load(QIODevice *dev, const char *format …

8.8网络编程

笔记 网络基础 一.网络通信的引入 IPC通信方式&#xff0c;只能完成同一台主机之间多个进程间的通信&#xff0c;在实现跨主机的多个进程间通信时&#xff0c;就显得力不从心了。所以我们引入了网络通信&#xff0c;基于套接字socket的通信方式&#xff0c;能够完成同一主机…

AI Agent工程师认证-学习笔记(2)——【多Agent】AgentScope

基础学习链接&#xff1a;【多Agent】AgentScope学习指南 速通攻略&#xff1a;零基础做个多智能体游戏 Agentscope入门文档&#xff1a;AgentScope 初探 应用开发进阶&#xff1a;AgentScope应用开发入门 AgentScope官方文档&#xff1a;AgentScope官方文档 AgentScope开…

Ghidra:开源软件逆向工程框架

Ghidra 是一个软件逆向工程 (SRE) 框架 Ghidra 是一种尖端的开源软件逆向工程 (SRE) 框架&#xff0c;是美国国家安全局 (NSA) 研究局的产品。 Ghidra 该框架具有高端软件分析工具&#xff0c;使用户能够分析跨各种平台&#xff08;包括 Windows、macOS 和 Linux&#xff09…

【区块链+金融服务】港融区域股权服务平台 | FISCO BCOS应用案例

中国证监会在 2020 年启动了区块链建设试点工作&#xff0c;提出建设基于区块链的场外市场登记系统和交易报告库&#xff0c;利 用区块链去中心化、不易篡改、安全稳定等技术特点&#xff0c;构建区域性股权市场数字化信任机制&#xff0c;为区域性股权市场 提供基础支撑设施。…

【网编】——UDP编程

宏观操作 服务器&#xff1a;socket创套接字—bind绑定连接—recvfrom接收数据/sendto发送数据 客户端&#xff1a;socket创套接字—sendto发送数/recvfrom接收数据—close关闭套接字 函数 recv ssize_t recvfrom ( int sockfd , void * buf , size_t len , int flags , str…

【秋招笔试】8.11大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…