Mybatis 面试题

Mybatis 面试题

MyBatis-Plus 优点

Mybatis-Plus是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。

1、依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。

2、损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 。

3、预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击 。

4、通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 。

5、多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可*配置,完美解决主键问题 。

6、支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动

7、支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作

8、支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码(生成自定义文件,避免开发重复代码),支持模板引擎、有超多自定义配置等。

9、支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )。

10、支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词 。

11、内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。

12、内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询 。

13、内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作。

14、默认将实体类的类名查找数据库中的表,使用@TableName(value="table1")注解指定表名,@TableId指定表主键,若字段与表中字段名保持一致可不加注解。

#{}与${}的区别

井{}实现了预编译,预防了SQL注入的问题,${}是字符串的替换。

Mybatis的传值方式

单个传值
顺序传值
对象传值
Map传值
列表传值

Mybatis中的标签

【cache】:给定命名空间的缓存配置。
【cache-ref】:引用其他命名空间的缓存配置。
【resultMap】:描述如何从数据库结果集中来加载对象。
【sql】:定制SQL片段。id为唯一标识,使用“引入sql片段。”
【insert】:映射插入语句。
【update】:映射更新语句。
【delete】:映射删除语句。
【select】:映射查询语句。
【动态sql,主要由if、where、foreach、set等动态标签组成】

Mybatis的三级缓存

Mybatis缓存可以大大提升系统的性能,Mybatis提供一级缓存和二级缓存。

MyBatis的缓存分为一级缓存和二级缓存,两种缓存的缓存粒度是一样的,都是对应一条sql查询语句,但是二者的生命周期是不一样的,一级缓存的生命周期是SqlSession对象的使用期间,随着SqlSession对象的死亡而消失;二级缓存的生命周期是同MyBatis应用一样长。

一级缓存

MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。

但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。

一级缓存失效

  1. sqlSession不同

  2. 当sqlSession对象相同的时候,查询的条件不同,原因是第一次查询时候一级缓存中没有第二次查询所需要的数据

  3. 当sqlSession对象相同,两次查询之间进行了插入的操作

  4. 当sqlSession对象相同,手动清除了一级缓存中的数据

二级缓存

为了克服这个问题,需要开启二级缓存,是的缓存zaiSqlSessionFactory层面给各个SqlSession 对象共享。默认二级缓存是不开启的,需要手动进行配置。

一级缓存可能存在脏读情况,默认的二级缓存毕竟也是存储在本地缓存,所以对于微服务下是可能出现脏读的情况的,所以这时候我们可能会需要自定义缓存,比如利用redis来存储缓存,而不是存储在本地内存当中。

自定义缓存

MyBatis官方也提供了一些第三方缓存的支持,如:encache和redis。

如果要实现一个自己的缓存的话,那么我们只需要新建一个类实现Cache接口就好了 。

参考资料

上一篇:Spring+Mybatis批量提交(batchUpdate)


下一篇:Mybatis复杂查询动态sql及缓存详解