Mybatis面试常见题

版权声明:转载标明来源! https://blog.csdn.net/qq_39213969/article/details/89040587

什么是Mybatis?

Mybatis常见面试题总结

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

125.Mybatis 中 #{}和 ${}的区别是什么?

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

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

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

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

126.Mybatis 有几种分页方式?

1.数组分页:查询出所有数据,根据返回的list截取 分页2.sql分页:在sql语句后面添加limit分页语句。3.拦截器分页:自定义拦截器实现了拦截所有以ByPage结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句,一劳永逸。不再需要在每个语句中单独去配置分页相关的参数了。4.RowBounds实现分页:类似于数组分页

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

为什么?是的!MyBatis提供了RowBounds类,用于实现分页查询。RowBounds中有两个数字,offset和limit。

128.Mybatis 逻辑分页和物理分页的区别是什么?

逻辑分页是查出全部结果,利用下标分页, 内存开销大,数据量大时效率低,容易内存溢出;物理分页是利用sql直接在数据库中分页,内存开销小,数据量小时比逻辑分页效率低

129.Mybatis 是否支持延迟加载?延迟加载的原理是什么?

在Mybatis中,通常会进行多表联合查询,但是有的时候并不会立即用到所有的联合查询结果,此时需要一种机制,当需要的时候再查询,这种“按需查询”的机制,就可以使用延迟加载来实现。延迟加载可以做到,先从单表查询,需要时再从关联表关联查询,这样可以大大提高数据库的性能,因为查询单表要比关联查询多张表速度快。

130.说一下 Mybatis 的一级缓存和二级缓存?

mybatis提供了缓存机制减轻数据库压力,提高数据库性能
mybatis的缓存分为两级:一级缓存、二级缓存
一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效
 具体流程: 1.第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来
      2.第二次执行select会从缓存中查数据,如果select相同切传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率
  注意事项:1.如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读2.当一个SqlSession结束后那么他里面的一级缓存也就不存在了,mybatis默认是开启一级缓存,不需要配置。二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的.。二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。二级缓存默认是没有开启的。需要在setting全局参数中配置开启二级缓存

1、MyBatis和Hibernate有什么异同

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

132.Mybatis 有哪些执行器(Executor)?

缓存执行器与非缓存执行器
非缓存执行器
ExecutorType.SIMPLE:这个执行器类型不做特殊的事情。它为每个语句的每次执行创建一个新的预处理语句。
ExecutorType.REUSE:这个执行器类型会复用预处理语句。
ExecutorType.BATCH:这个执行器会批量执行所有更新语句,也就是jdbc addBatch API的facade模式。
缓存执行器不是真正功能上独立的执行器,而是非缓存执行器的装饰器模式。
缓存执行器CachingExecutor:缓存执行器相对于其他执行器的差别在于,首先是在query()方法中判断是否使用二级缓存(也就是mapper级别的缓存)。虽然mybatis默认启用了CachingExecutor,但是如果在mapper层面没有明确设置二级缓存的话,就退化为SimpleExecutor了

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

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

134.Mybatis 如何编写一个自定义插件?

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

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

猜你喜欢

转载自blog.csdn.net/qq_39213969/article/details/89040587