九层之台始于垒土

千里之堤溃于蚁穴

面试简单整理之mybatis

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

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
  
3. #方式能够很大程度防止sql注入。
  
4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
  
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
View Code

126.mybatis 有几种分页方式?

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

 

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

    是的

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

  逻辑分页是查出全部结果,利用下标分页, 内存开销大,数据量大时效率低,容易内存溢出;

  物理分页是利用sql直接在数据库中分页,内存开销小,数据量小时比逻辑分页效率低

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

 在Mybatis中,通常会进行多表联合查询,但是有的时候并不会立即用到所有的联合查询结果,此时需要一种机制,当需要的时候再查询,这种“按需查询”的机制,就可以使用延迟加载来实现。

       延迟加载可以做到,先从单表查询,需要时再从关联表关联查询,这样可以大大提高数据库的性能,因为查询单表要比关联查询多张表速度快。
View Code

 

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全局参数中配置开启二级缓存
View Code

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

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

缓存执行器与非缓存执行器

非缓存执行器
ExecutorType.SIMPLE:这个执行器类型不做特殊的事情。它为每个语句的每次执行创建一个新的预处理语句。
ExecutorType.REUSE:这个执行器类型会复用预处理语句。
ExecutorType.BATCH:这个执行器会批量执行所有更新语句,也就是jdbc addBatch API的facade模式。


缓存执行器不是真正功能上独立的执行器,而是非缓存执行器的装饰器模式。

缓存执行器CachingExecutor:缓存执行器相对于其他执行器的差别在于,首先是在query()方法中判断是否使用二级缓存(也就是mapper级别的缓存)。虽然mybatis默认启用了CachingExecutor,但是如果在mapper层面没有明确设置二级缓存的话,就退化为SimpleExecutor了
View Code

 

133.mybatis 分页插件的实现原理是什么?

  通过拦截器实现的物理分页

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

posted on 2019-03-12 18:09  nzxing  阅读(659)  评论(0编辑  收藏  举报

导航