mybatis相关面试题

1.什么是mybatis

​ mybatis是持久层半自动ORM框架,底层封装了JDBC,我们做开发的可以直接使用原生sql,可以灵活地控制sql语句的执行性能。我们的项目持久层使用mybatis框架,在DAO层,我们只需创建接口和mapper文件,通过mapper中的namespace进行绑定,接口中写抽象方法,mapper中在标签中写sql语句,动态参数通过#{}进行传参。

2.为什么说mybatis是半自动ORM框架?

​ 相比springDataJpa、hibernate等全自动框架,我们使用Mybatis的时候需要手写sql,而加载驱动、创建关闭连接、创建statement等过程,mybatis替我们做了。

3.mybatis的优点

​ 相比使用原生JBDC操作数据库,使用Mybatis减少了大量的代码。相比全自动框架,mybatis可以更灵活编写sql。并且mybatis可以很好地兼容各种数据库,很便捷地与spring集成。

4.mybatis缺点

​ mybatis对开发人员的sql功底有一定要求。因为sql依赖数据库,导致数据库移植性差,不能随意切换数据库。

5.mybatis适用的场景

​ 适用于对性能要求较高,需求灵活多变的项目。

6.Mybatis动态sql有什么用?执行原理?有哪些动态sql?

​ Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能

Mybatis提供了9种动态sql标签:

trim | where | set | foreach | if | choose | when | otherwise | bind

7.Mybatis的一级、二级缓存 ?

1)一级缓存: 存储作用域为 Session,自动开启。

2)二级缓存其存储作用域为 Mapper(Namespace)。默认不打开二级缓存;

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

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

​ 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

​ PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。

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

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。

10.如何获取自动生成的(主)键值?

​ insert 方法总是返回一个int值 ,这个值代表的是插入的行数。如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

示例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
	insert into names (name) values (#{name})
</insert>

11.为什么mybatis的mapper没有实现类?底层是怎么实现的?

​ Mybatis 提供了 Mapper接口的代理对象,在执行 Mapper接口方法时,实际执行的是Mybatis的代理对象,代理对象在 invoke 方法内获取 Mapper接口类全名+方法全名 作为statement的ID,然后通过ID去Statement匹配注册的SQL,然后使用 SqlSession 执行这个 SQL。

​ 所以,这也解释了为什么Mybatis映射文件需要 namespace 和 id , 前者是类全名,后者是方法名。

12.通用mapper

我们项目使用的是通用mapper,因为使用mybatis需要编写大量sql,工作量比较大,为了简化开发,我们项目使用了通用mapper,它提供的API基本上可以满足单表增删改查,对于多表查询,可以通过编写sql的方式来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是 MyBatisMyBatis 是一种持久化框架,它可以帮助开发人员使用 Java 语言轻松地与关系数据库进行交互。MyBatis 的主要目标是提供与 SQL 映射的简单性和灵活性。 2. MyBatis 的优点是什么? MyBatis 具有以下优点: - 灵活性:MyBatis 允许开发人员使用 SQL 映射自定义 SQL 查询,从而提高了应用程序的灵活性。 - 易于使用:MyBatis 易于使用,因为它不需要开发人员执行任何复杂的 ORM 映射。 - 易于调试:MyBatis 可以轻松地启用日志记录,从而使开发人员更容易理解和调试其应用程序。 - 性能较好:MyBatis 的性能很好,因为它可以直接使用 SQL 查询数据库,而不需要通过 ORM 映射进行转换。 3. MyBatis 中的 Mapper 是什么? MapperMyBatis 中用于定义 SQL 映射的接口。它包含了数据访问方法的定义,以及这些方法使用的 SQL 语句。Mapper 接口可以使用注解或 XML 文件来定义 SQL 映射。 4. MyBatis 中的动态 SQL 是什么? 动态 SQL 是指根据条件动态生成 SQL 查询语句。MyBatis 中的动态 SQL 支持 if/else 条件判断、foreach 循环、choose/when/otherwise 选择语句等。 5. MyBatis 中的一级缓存和二级缓存是什么? 一级缓存是指在同一个 SqlSession 中,对于同一个查询语句,MyBatis 只查询一次,并将结果缓存起来。二级缓存是指在多个 SqlSession 中,对于同一个查询语句,MyBatis 只查询一次,并将结果缓存到多个 SqlSession 中共享。二级缓存需要在配置文件中进行配置。 6. MyBatis 中的插件是什么? 插件是 MyBatis 中的一种机制,可以在执行 SQL 语句之前或之后,对其进行拦截、修改或扩展。MyBatis 插件需要实现 Interceptor 接口,并在配置文件中进行配置。 7. MyBatis 中的 #{} 和 ${} 有什么区别? #{} 是 MyBatis 中的占位符,用于防止 SQL 注入攻击,同时也可以防止 SQL 语句中的特殊字符被转义。#{} 会将传入的参数解析为一个占位符,并将其替换为一个 ? 。 ${} 是 MyBatis 中的字符拼接符号,会将传入的参数直接拼接到 SQL 语句中。使用 ${} 可能会导致 SQL 注入攻击,因此不建议使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值