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提供了一种基于拦截器的分页插件来优化分页查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值