15. 说一下Mybatis的一级缓存和二级缓存?【重点】
考核点:Mybatis缓存。
答:
Mybatis的一级缓存是指SqlSession,一级缓存的作用域是SqlSession,Mybaits默认开启一级缓存;
在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取;
SqlSession执行insert、update、delete等操作commit后会清空该SqlSession缓存。
二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的;
第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放该mapper对应的二级缓存区域;
第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果;
如果调用相同namespace下的mapepr映射文件中增删改sql,并执行了commit操作,此时该缓存会清空。
总结:
一级缓存同会话,很少会重复查询,实用场景少;
二级缓存同namespace下(表级别缓存),执行更新操作,即清空缓存,所以实际应用场景一般使用三级缓存。
16. Mybatis动态SQL标签有哪些?分别是做什么的?【掌握】
考核点:动态SQL
答:
if 标签:
if标签通常用于WHERE语句、UPDATE语句、INSERT语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。
foreach标签:
foreach标签主要用于在sql中对集合进行迭代。也常用到批量删除、添加等操作中。
choose标签:
MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。
当choose中所有when的条件都不满则时,则执行 otherwise中的sql。
类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
where标签:
如果where标签包含的标签中有返回值的话,它就插入一个"where"。
此外,如果标签返回的内容是以AND或OR开头的,则它会剔除掉。
set标签:
使用set标签可以将动态的配置set关键字,和剔除追加到条件末尾的任何不相关的逗号。
trim标签:
格式化输出,也可以通过trim标签设定或忽略前后缀来实现格式化输出。
sql标签:
当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为SQL片段,方便调用。
include标签:
用于引用定义的SQL片段。
17. 动态SQL中使用<where>标签与直接写where关键字有什么区别?【掌握】
考核点:动态SQL
答:
where关键字是SQL语句中的where子句,在Mybatis动态SQL中,若直接用where子句的话可能会导致SQL语法错误,查询失败;
where标签为MyBatis的动态语句,系统自动生成where子句,并且会自动去掉生成语句前面多出的"and|or"子串。
18. 循环标签有哪些属性?各自的作用是什么?【掌握】
考核点:动态SQL
答:
foreach:循环标记;
collection:设置循环的集合、注意接口方法参数需要使用@Param()指定取值的key,如果不设置,默认key="list";
item:设置循环中取值一个元素的变量名称;
separator:设置语句的分割符号;
open:设置语句开始部分的子串;
close:设置语句结束部分的子串;
index:取出元素的索引。
19. Hibernate和Mybatis的区别?【重点】
相同点:
都属于ORM 框架;
都是对JDBC 的封装;
都属于持久层的框架。
不同点:
Hibernate 是面向对象的,Mybatis是面向SQL的;
Hibernate全自动的ORM,Mybatis是半自动的ORM;
Hibernate查询映射实体对象必须全字段查询,Mybatis可以不用;
Hibernate有级联操作,Mybatis则没有;
Hibernate编写HQL查询数据库大大降低了对象和数据库的耦合性,Mybatis提供动态SQL,需要手写SQL,与数据库之间的耦合度取决于程序员所写的SQL的方法,所以Hibernate的移植性要远大于Mybatis;
Hibernate有方言跨数据库,Mybatis 依赖于具体的数据库;
Hibernate拥有完整的日志系统,Mybatis 则相对比较欠缺;
20. MyBatis的优点?【重点】
答:
基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用;
与JDBC相比,减少了50%以上的代码量,消除了JDBC 大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容(因为MyBatis 使用JDBC 来连接数据库,所以只要JDBC支持的数据库MyBatis都支持);
能够与Spring很好的集成;
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系。
21. MyBatis框架的缺点?【重点】
答:
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求;
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。