MyBatis面试题

1. 什么是MyBatis

MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或者注解用于配制和原始映射,将接口和Java的POJOS映射成数据库中的记录。

2. MyBatis工作原理

  1. 读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件:映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载,mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂:通过mybatis环境配置信息构建会话工厂sqlSessionFactory。
  4. 创建会话对象:由会话工厂创建sqlSession对象,该对象中包含了执行sql语句的所有方法
  5. Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,他将根据sqlsession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护。
  6. MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的sql语句的Id、参数等信息。
  7. 输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO、输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对于结果集的解析过程。

3. Mybatyis和hibernate的区别有哪些

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

4. 什么是DAO模式

DAO是一个为数据库或者其他持久化机制提供了抽象接口的对象。在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是抽象一个接口,接口中定义了此应用程序将会用到的所有事务方法。DAO模式,实际包含了两个模式,一个是Data Accessor(数据访问起),另一个是Data Object(数据对象)。前者解决如何访问数据的问题,后者解决如何用对象封装数据。

5. MyBatis中#{}和${}区别

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

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

预编译是提前对SQL语句进行预编译,而其后注入的参数将不会在进行SQL编译。SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入,预编译完成后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

6. MyBatis有几种分页方式

  1. 数组分页
  2. SQL分页
  3. 拦截器分页
  4. RowBounds分页

7. MyBatis逻辑分页和物理分页的区别是什么

逻辑分页 是一次性查询很多数据,然后在结果中检索分页的数据。这样做的弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。
物理分页 是从数据库查询指定条数的数据,弥补了一次性全部查出所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。
物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端,就算速度上存在优势,然而其他性能上的优点足以弥补这个缺点。

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

MyBatis使用RowBounds对象进行分页,他是针对ResultSet结果集执行的内存分页,而非物理分页。分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在 插件的拦截方法内拦截待执行的SQL,然后重写SQL,添加对应的物理分页语句和物理分页参数。
例如:select * from student;拦截后,sql重写为:select t.* from ( select * from student) t limit 0,10

9. RowBounds是一次性查询全部结果吗

RowBounds表面上是在【所有】数据中检索数据,其实并非一次性查询出所有数据,因为MyBatis是对JDBC的封装,在JDBC的驱动中有一个fetch size的配置,他规定了每次最多从数据库查询多少条数据。假如,要查询更多的数据,会在你执行next的时候,去查询更多的数据。

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

  1. MyBatis可以编写针对ParameterHandler、ResultSethandler、StatementHandler、Executor这4种接口的插件,MyBatis通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke方法,当然,只会拦截那些指定需要拦截的方法。
  2. 实现MyBatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值