MyBatis想必大家都比较熟悉了吧,它底层封装了JDBC,用来与数据库进行连接。

这里我主要想讲一下MyBatis和MyBatis-plus,主要是想表达一下,据我的了解,这两个在公司中都有所使用,我只简略的学过MyBatis-plus。最直观的就是通用Mapper,为你省略了dao层的添加。当然,一些复杂的逻辑仍然需要你自定义Mapper。但我感觉plus对数据的操作的api相对以前更加复杂。整体而已,推荐大家深度学习MyBatis,在源码级别的学习中更加直白,简易。对于 MyBatis-plus大家只需要熟练使用常用方法。当然这只是我的一点意见。

1.什么是MyBatis

MyBatis是一款半自动化的ORM(对象关系映射)的软件。内部封装了JDBC,使得程序员在开发过程中省略了创建连接,加载驱动等操作,开发人员只需要关注sql语句本身。 MyBatis通过配置文件或者注解即可将数据库数据与pojo实体类联系起来

解释一下什么是对象关系映射

是一种为了解决关系型数据库数据与简单java对象的映射关系的技术

2.#{}和${}有什么区别

首先,他俩都是为了动态传递参数而存在的,是MyBatis实现动态sql的基础

#{}是预编译处理,将这部分先用?代替,调用PreparedStatement的set方法来赋值
${}是字符串替换,直接将这部分用括号内的实际内容代替

3.请说说MyBatis的工作原理

我们在实际开发过程中,都写过MyBatis的配置文件,对于 MyBatis的底层具体实现,就是从这里开始的。
1)读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,包含了MyBatis行为的设置和属性信息,例如数据库连接信息和映射文件

2)加载mapper.xml(SQL映射文件):该文件配置了操作数据库的SQL语句

3)构建会话工厂:创建会话工厂SqlSessionFactory

4)创建会话对象:由会话工厂生产sqlSession对象,该对象包含了执行sql语句的所有方法

5)Executor执行器:它将跟据sqlSession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护

6)MappedStatement对象:该对象是对映射信息的封装,用于存储要映射的SQL语句的id,参数等信息

7)输入参数映射:类似于JDBC对preparedStatement对象设置参数的过程

8)输出结果映射:类似于JDBC对结果集的解析过程

4.MyBatis是如何进行分页的?分页原理是什么

通过RowBounds进行逻辑分页。

物理分页:通过数据库limit

逻辑分页:通过代码实现。先查询出所有的数据,再跟据代码块的所需进行分页

还可以通过插件,例如Pagehepler

5. MyBatis是否支持延迟加载?如果支持,实现原理是什么

支持。

这个举例子再生活形象不过,就像用户与订单的关系,我们在用户中包含了订单的集合,但在显示时不会直接显示出来,但当用户点击订单时,再去查询,显示出来订单。这样可以减少数据库的压力。

实现原理:使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,把关联对象查询出来赋值。

6. MyBatis一二级缓存

一级缓存:sqlSession级别的缓存,sqlSession里的HashMap对查询过一次的数据进行存储,如果发出数据库增上改查的操作则取消存储
二级缓存:Mapper级别的,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存
重要:其实解释到这里,对一些没看过源码的人来说并不友好,下面我对这些东西尽量给大家通俗的讲出来:

首先,session大家应该都了解,我们在Java Web的学习过程中接触过,它代表的是一次浏览器和服务器的交互的会话

sqlSession也是一个会话,每次连接一个数据库就会产生一个sqlSession会话。

下面截取了sqlSession的部分源码,sqlSession里封装了操作数据库的所有操作,还包括了Mapper代理对象

一级缓存:sqlSession级别的,也就是参数和sql语句完全一样的情况下,不需要再次查询数据库,那具体该如何判断呢

如果sqlSession调用了close()方法,会释放掉一级缓存

二级缓存:多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域

下面我们以开启二级缓存进行测试

public class TestStudent extends BaseTest {

public static void selectAllStudent() {SqlSessionFactory sqlSessionFactory = getSession();SqlSession session = sqlSessionFactory.openSession();StudentMapper mapper = session.getMapper(StudentMapper.class);List<Student> list = mapper.selectAllStudents();System.out.println(list);//一级缓存测试List<Student> list2 = mapper.selectAllStudents();System.out.println(list2);session.commit();//创建了第二个sqlSession//二级缓存测试SqlSession session2 = sqlSessionFactory.openSession();StudentMapper mapper2 = session2.getMapper(StudentMapper.class);List<Student> list3 = mapper2.selectAllStudents();System.out.println(list3);System.out.println("第二次执行");List<Student> list4 = mapper2.selectAllStudents();System.out.println(list4);session2.commit();}public static void main(String[] args) {selectAllStudent();
}

}
我们调用了4次 selectAllStudents() ,但sql语句只执行了一次,两次为一级缓存,一次为二级缓存

7. MyBatis编程步骤

1)创建sqlSessionFactory对象

2)生产sqlSession对象

3)获取Mapper代理对象

4)执行数据库操作

5)执行成功,提交事务

6)执行失败,回滚事务

7)关闭会话

8.模糊查询like语句怎么写

9.在mapper中如何传递多个参数

10. MyBatis如何进行批量操作

11. MyBatis实现一对一,一对多有几种方式,怎么操作的

联合查询和嵌套查询

联合查询:几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类可以完成

嵌套查询:先查一个表,跟据这个表里面的结果的外键id,再去另一个表里面查询数据,也是通过配置association,collection,但另外一个表的查询通过select节点配置

12. MyBatis动态sql是做什么的,都有哪些动态sql,能简述一下动态sql的原理吗

MyBatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能

实现原理:使用OGNL从sql参数对象中的计算表达式的值,跟据表达式的值动态拼接sql,以此来完成动态sql的功能

下面是我动态SQL的一些练习,方便大家理解

//1.if
//跟据username和sex来查询数据。如果username为空,则按sex查询,反之相同

我们先按原版写

select * from user where username = #{username} and sex = #{sex}

这样的话如果出现空值就没法搞了

select * from user where username=#{username}

 <if test="sex != null">and sex=#{sex}</if>

//2.where
//如果出现以and或or开头的他会剔除掉

select * from user

username=#{username}

 <if test="sex != null">and sex=#{sex}</if></where>

//3.choose
//choose标签,挺猛的,类似于java的switch,总能利用到一个搜索条件

select * from user

id=#{id}

and username=#{username}

and sex=#{sex}

按照顺序:
如果id不为空,sql语句为:select * from user where id=?
如果id为空,username不为空:select * from user where username=?;

//4.trim
//trim是一个格式化的标记,可以完成set或where标记的功能

select * from user

and username=#{username}

and sex=#{sex}

prefix:前缀
prefixOverrides:去掉第一个and或or

//5.foreach

select * from user

#{id}

13. MyBatis的架构设计是怎样的

1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理

2)数据处理层:负责具体的SQL查找,SQL解析,SQL执行和执行结果映射处理。它主要的目的是跟据调用的请求完成一次数据库操作

3)基础支撑层:负责最基础的功能支撑,包括连接管理,事务管理,配置加载和缓存处理,这些都是公用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

4)引导层:加载xml配置和java配置

14.如何获取生成的主键

insert into user( user_name, user_password, create_time) values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})

15.当实体类中的属性名和表中的字段名不一样时,怎么办

select * from orders where order_id=#{id} <!–用id属性来映射主键字段–>

<!–用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性–>

16.Dao接口的工作原理

Dao接口就是映射文件中的namespace的值,接口的方法名,就射映射文件MappedStatement的id值,接口方法内的参数,就是传递给sql的参数

Dao接口的工作原理就是JDK动态代理,MyBatis运行时会使用JDK动态代理为Dao接口生成代理对象proxy,代理对象会拦截接口方法调用,转而执行方法对应的sql语句,然后将sql执行结果返回

17.简述 MyBatis的插件运行原理,以及如何编写一个插件

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

实现Mybatis的Interceptor接口并重写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。

另外,我自定义实现过一个简单的MyBatis,现在太忙了,过段时间给大家详细的讲解如何自定义实现简单的MyBatis。还有就是,我认为MyBatis是最好入门源码阅读的技术栈。我读过不少源码,但大多都理解的不清不楚。相对而言,MyBatis是结构划分最清晰的,整体难度也偏低的。十分推荐通过MyBatis入门阅读源码。后期我应该会上传MyBatis阅读源码的方法,帮助大家入门。

欢迎访问我的个人博客:gaoyuehao.vip。里面有大量的面试题内容哦~

【面试题】MyBatis面试题相关推荐

  1. mysql和mybatis面试题_2020年,MyBatis常见面试题总结

    Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,所以,一些参数使用细节略掉了,我们的目标 ...

  2. 面试官都会问的Mybatis面试题,你会这样回答吗?

    一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:"面试 ...

  3. MyBatis面试题库

    这里写目录标题 Mybatis面试题库 1.Mybatis是什么? 2.Mybaits的优点: 3.Mybatis框架的缺点 4.MyBatis框架的适用场合 5.当实体类中的属性名和表中的字段名不一 ...

  4. MyBatis面试题1

    MyBatis面试题(1) 众所周知,MyBatis是ssm三大框架之一,也是在以后的开发过程中的一个重要的框架,相对其他的两个框架而言,MyBatis框架更容易理解一些:在开发工程师的面试中,面试官 ...

  5. 5.MyBatis源码解析-MyBatis面试题--阿呆中二

    MyBatis面试题 MyBatis MyBatis面试题 MyBatis一级缓存和二级缓存? MyBatis 有几种执行器和区别? Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能 ...

  6. 2021年MyBatis面试题30道

    文章目录 前言 面试题系列文章传送门 MyBatis面试题内容 1. 模糊查询like语句该怎么写? 2. MyBatis 框架适用场合? 3. MyBatis是如何进行分页的?分页插件的原理是什么? ...

  7. 【2021最新版】MyBatis面试题总结(38道题含答案解析)

    文章目录 1.什么是Mybatis? 2.Mybaits的优点? 3.MyBatis框架的缺点? 4.MyBatis框架适用场合 5.MyBatis与Hibernate有哪些不同? 6.#{} 和${ ...

  8. Mybatis面试题整理

    文章目录 Mybatis面试题 1. 谈谈 MyBatis 2. Mybatis 的优点 3. Mybatis 的缺点 4. 什么是 ORM 5. 为什么说 Mybatis 是半自动 ORM 映射工具 ...

  9. matlab考试试题,matlab-考试试题-

    matlab-考试试题- MATLAB 考试试题 (1) 产生一个1x10的随机矩阵,大小位于( -5 5),并且按照从大到小的顺序排列好!(注:要程序和运行结果的截屏)答案:a=10*rand(1, ...

  10. 新疆卫生系统计算机考试题库,2014新疆维吾尔自治区计算机等级考试试题 二级C试题最新考试试题库...

    2014新疆维吾尔自治区计算机等级考试试题 二级C试题最新考试试题库 1.化工厂中用计算机系统控制物料配比.温度调节.阀门开关的应用属于( A ) A.过程控制 B.数据处理 C.科学计算 D.CAD ...

最新文章

  1. matlab 二重积分
  2. 汽车和山羊问题matlab_关于博弈的山羊与汽车问题
  3. 数据库中插入英文数字正常,插入中文错误解决方案
  4. php js获取元素id,javascript通过中文id和class获取元素的方法
  5. 【HTML+CSS网页设计与布局 从入门到精通】第4章
  6. 【数据结构笔记14】微软面试经典 - 逆转链表问题(Reversing Linked List)
  7. 4.串口操作之API篇 CreateFile
  8. 一个项目需求文档怎么写?
  9. Java 判断中文及标点符号
  10. 如何在window和mac共用一个移动硬盘
  11. 【第二周】吴恩达团队AI for Medical Diagnosis大作业
  12. html excel导出的路径,html 导出多个excel表格数据-如何将html页面中的表格导出到excel表格...
  13. 光纤熔接机的光纤对准方式
  14. Centos7文本处理工具
  15. 隐藏文件去掉隐藏属性
  16. 多元回归函数regress的用法
  17. maya2018放大字体及窗口
  18. android和MTKP60区别,联发科P60和骁龙625哪个好 骁龙625与联发科P60区别对比 (全文)...
  19. Your PHP version does not satisfy that requirement
  20. 手把手教学:使用油猴脚本对CCTV央视网启用HTML5播放器

热门文章

  1. php 中输出字符串时怎么换行?
  2. linux日志查看/项目日志查看/监控日志
  3. Oracle 报错 28000原因和解决方法
  4. Android.bp入门教程
  5. 2021年焊工(初级)考试报名及焊工(初级)模拟试题
  6. Android 几个ApplicationInfo Info系列类的总结
  7. 【VMware vRealize Suite 2019 部署系列】- 「2」 – 部署 vRealize Operations 8.1
  8. u8系统清理异常咋进服务器,用友u8怎么清除异常
  9. Linux入门---基本指令(下)
  10. cv.waitkey()参数详解