mybatis核心面试题

请尊重个人总结成果,如果有误还请指出。

1、Mybatis里用到了那些设计模式?

1、构建者模式: 
解释:由多个简单的对象创建成复杂的对象 
作用:sqlSessionFactoryBuilder调用XmlCongigBuilder解析XML文件 
2、工厂模式:
 解释:定义一个创建对象的接口,由子类实例化。 
 作用:Mybatis中执行sql语句、获取Mappers、SqlSession的创建过程中使用了工厂类。 
3、代理模式: 
解释:给某一个对象提供一个代理,并由代理对象控制对元对象的引用。 
作用:在使用Configuration调用getMapper方法时,使用动态代理模式生成新的对象,代理对象进行了crud的方法。

2、Mybatis架构设计

1、接口层:提供对数据库的crud和配置信息维护接口,与数据库交互分为两种模式,一种是传统的mybatis提供的api,一种是mapper代理。
2、数据处理层:负责具体的SQL查找、SQL解析、SQL执⾏和执⾏结果映射处理等。它主要的⽬的是根据调用的请求完成⼀次数据库操作。
3、框架支持层:负责最基础的功能⽀撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是 共用的东⻄,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的⽀撑。

3、mybatis的主要构件及其相互关系

1、SqlSession:作为MyBatis⼯作的主要顶层API,表示和数据库交互的会话,完成必要数 据库增删改查功能
2、Executor:MyBatis执⾏器,是MyBatis调度的核⼼,负责SQL语句的⽣成和查询缓 存的维护
3、StatementHandler:封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参 数、将Statement结果集转换成List集合。
4、ParameterHandler:负责对⽤户传递的参数转换成JDBC Statement所需要的参数
5、ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
6、TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换
7、MappedStatement:MappedStatement维护了⼀条<select | update | delete | insert>节点 的封 装
8、SqlSource:动态地⽣成SQL语句,将信息封 装到BoundSql对象中,并返回
9、BoundSql:表示动态⽣成的SQL语句以及相应的参数信息

4、mybatis总体流程

加载conf.xml和mapper.xml文件,将文件的配置内容解析封装到configuration,将sql的配置加载成为一个mappedstatement对象,存储在内存之内,并把它作为参数传入到build()方法中,并返回一个defaultSQLSessionFactory。我们再调用openSession()方法,来获取SqlSession,在构建SqlSession的同时还需要transaction和executor用于后续执行操作。

5、二级缓存和一级缓存谁先执行?

二级缓存构建在⼀级缓存之上,在收到查询请求时,MyBatis ⾸先会查询二级缓存,若二级缓存未命 中,再去查询⼀级缓存,⼀级缓存没有,再查询数据库。

6、什么是延迟加载?基于什么实现?

就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。
延迟加载是基于嵌套查询来实现的

7、什么时候会采用延迟加载和立即加载?延迟加载优缺点是什么?

⼀对多,多对多:通常情况下采⽤延迟加载 
⼀对⼀(多对⼀):通常情况下采⽤⽴即加载
优点:先从单表查询,在需要其他数据时,才会去关联查询,大大提升数据库性能。
缺点:因为只有在需要数据时才会去查询,如果大批量数据操作,会造成查询时间过长,降低用户体验。

8、延迟加载原理:

基于动态代理,通过代理拦截到指定方法,执行数据加载。

9、mybatis常用的注解

@Insert:实现新增 
@Update:实现更新 
@Delete:实现删除 
@Select:实现查询 
@Result:实现结果集封装 
@Results:可以与
@Result ⼀起使⽤,封装多个结果集 
@One:实现⼀对⼀结果集封装 
@Many:实现⼀对多结果集封装

10、什么是Mybatis?

1、它是一个框架,他封装了jdbc的加载驱动连接数据库等复杂过程
2、可以用xml或者注解来配置和映射原生信息
3、可以方便在执行sql并返回对象

11、工作原理?

先封装sql,接着调用jdbc操作数据库,最后将数据封装成Java类返回

12、#{}和${}有什么区别?

#{}是预处理,比如sql语句进行预处理时,会将sql中的#{}替换为?号。${}是字符串替换

13、通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

mapper工作原理是jdk动态代理,mybatis运行时会调用jdk动态代理为mapper接口生成代理对象,代理对象会拦截接口方法,然后找到MapperStatement并执行sql,然后返回sql结果。
mapper接口不可重载,因为使用的是 全限名+方法名的保存和寻找策略

14、使用MyBatis的mapper接口调用时有哪些要求?

1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
2、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
3、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
4、Mapper.xml文件中的namespace即是mapper接口的类路径。

15、什么是MyBatis的接口绑定?有哪些实现方式?

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;

16、MyBatis与Hibernate有哪些不同?

1、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
2、Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。 
3、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

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

    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
   分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值