面试题—mybatis

1.什么是MyBatis

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

2.mybatis 和 hibernate 的区别有哪些?

相同点
都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

不同点

  • hibernate对sql语句做了封装,提供了HQL语句操作数据库,数据库无关性支持好,在项目需要支持多种数据库的情况下,代码开发量较少,sql语句优化困难。mybaits是直接使用sql语句操作数据库,不支持数据库无关性,在项目需要支持多种数据库的情况下,代码开发量较多,sql语句优化容易。
  • hibernate配置java对象与数据库表的对应关系,多表关联关系配置复杂。mybatis是配置java对象与sql语句的对应关系,多表关联关系配置简单。hibernate是一个重量级的框架,学习使用门槛高,适合于
  • 需求相对稳定,中小型的项目,比如:办公自动化系统(OA)。mybatis是一个轻量级的框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网项目。目前企业项目中,mybatis框架使用更多。

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

  • #{}是预编译处理,${}是值替换;
  • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
  • Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值;
  • 使用#{}可以有效的防止SQL注入,提高系统安全性。

备注:
MyBatis的预编译功能,在SQL执行前,会先将SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,再用值替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。

比如这个sql
在这里插入图片描述

4.MyBatis编程步骤是什么样的?

① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过sqlsession执行数据库操作
④ 调用sqlsession.commit()提交事务
⑤ 调用sqlsession.close()关闭会话
<mybatis框架学习(完整)>
但是当Mybatis与一些依赖注入框架(如Spring或者Guice)同时使用时,SqlSessions将被依赖注入框架所创建,所以你不需要使用SqlSessionFactoryBuilder或者SqlSessionFactory
依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器(mapper)并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。

5.使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。

6.简单的说一下MyBatis的一级缓存和二级缓存?

在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

Mybatis内部存储缓存使用一个HashMap,keyhashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

二级缓存默认是不开启的,二级缓存的开席需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了
<mybatis一级缓存二级缓存>

7.Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

还有很多其他的标签,<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,
加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,
其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持
自增的主键生成策略标签。

8.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,
对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,
智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
 
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋
值并返回,那些找不到映射关系的属性,是无法完成赋值的。

9.Mybatis中如何批量处理?

当 Mybatis + Spring集成,且由Spring控制事务时,Mybatis批处理方式是不能使用的。
因为sessionFactory.openSession(ExecutorTypetype);方法会创建一个新的数据库连接,该连接不受Spring控制,将导致Spring的事务控制失效,它无法利用与当前线程绑定的session。<参照>
<Mybatis 批量操作总结>

10.动态sql

<MyBatis 动态SQL>

11.mybatis框架的原理

在这里插入图片描述

12.mybatis分页

答:Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,

public List<UserBean> queryUsersByPage(String userName, RowBounds rowBounds);

可以在sql内直接书写带有物理分页的参数来完成物理分页功能,
也可以使用分页插件来完成物理分页。
<Mybatis分页插件PageHelper的配置和使用方法>

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

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

13.简述Mybatis的插件运行原理,以及如何编写一个插件。

答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。
<Mybatis 插件原理1>
<Mybatis 插件原理2>

14.为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

15.mybatis和spring的整合(关于配置文件)

<Spring与MyBatis的整合>

16.mybatis与Spring三种开发方式

其实是两种,一种直接使用SqlSession提供的方法,通过传递statementId和params来操作数据库 ,一种是Mapper接口代理方式
<mybatis与Spring三种开发方式(一)>
<mybatis与Spring三种开发方式详解(二&三)>

17.mybatis 关联关系映射

<mybatis 关联关系映射>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值