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

mybatis常见面试问题

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决
  • Docker最佳实践进阶(一):Dockerfile介绍使用
  • 详解贪心算法
  • CANopen 控制多台设备的支持能力与定制方案评估
  • Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
  • Java线程池练习
  • Visual Studio Code安装与C/C++语言运行(下)
  • 1章4节:数据可视化, R 语言的静态绘图和 Shiny 的交互可视化演示(更新2024/08/14)
  • 数据结构---双向循环链表
  • elementplus 二次封装 select 自定义指令上拉加载更多 完美解决 多次接口调用 重新加载数据多次调用数据!!!
  • LeetCode-字母异位词分组
  • 用R语言进行数据类型的检查和基础转换
  • 如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解
  • rk3568-linux sdk编译update.img时以当前时间进行命名
  • 前端开发有什么专业术语吗?
  • 【EOS】Cleos基础
  • Android框架之Volley
  • Asm.js的简单介绍
  • CSS 三角实现
  • pdf文件如何在线转换为jpg图片
  • SpriteKit 技巧之添加背景图片
  • 关于使用markdown的方法(引自CSDN教程)
  • 技术:超级实用的电脑小技巧
  • 盘点那些不知名却常用的 Git 操作
  • 使用parted解决大于2T的磁盘分区
  • AI算硅基生命吗,为什么?
  • linux 淘宝开源监控工具tsar
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ## 基础知识
  • $.ajax()
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (35)远程识别(又称无人机识别)(二)
  • (k8s)Kubernetes本地存储接入
  • (LeetCode) T14. Longest Common Prefix
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (十)c52学习之旅-定时器实验
  • (一)基于IDEA的JAVA基础12
  • (转)http-server应用
  • (转)程序员疫苗:代码注入
  • **CI中自动类加载的用法总结
  • .Net 6.0--通用帮助类--FileHelper
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .Net多线程总结
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @angular/cli项目构建--Dynamic.Form
  • @ConditionalOnProperty注解使用说明
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [C#学习笔记]LINQ
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CQOI 2011]动态逆序对