Mybatis面试题(2)

24 篇文章 0 订阅

5.说一说Mybatis的一级缓存和二级缓存

缓存只针对查询功能

一级缓存:是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同数据时, 就会从缓存中直接获取,不会从数据库重新访问。默认打开一级缓存

二级缓存:是SqlSessionFactory级别,通过一个SqlSessionFactory创建的SqlSession查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。默认不开启二级缓存,如果要开启的 话,需要对应实体类实现序列化接口。

(1)一级缓存和二级缓存的失效情况

一级缓存

1. 不同的SqlSession对应不同的一级缓存

2. 同一个SqlSession但是查询条件不同

3. 同一个SqlSession两次查询期间执行了任何一次增删改操作

4. 同一个SqlSession两次查询期间手动清除了缓存

二级缓存

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

(2)mybatis缓存查询的顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。 如果二级缓存没有命中,再查询一级缓存 如果一级缓存也没有命中,则查询数据库 SqlSession关闭之后,一级缓存中的数据会写入二级缓存

6.mybatis与hibernate有什么区别

mybatis不完全是一个ORM框架,将sql和代码分开,功能更加清晰,mybatis需要程序员自己编写sql 语句。

mybatis能直接编写原生sql,可以严格控制sql执行性能,灵活度高,适合对关系数据模型要求不高的 软件开发,但是工作量会大很多。 Hibernate是一个ORM框架,提供了非常多的数据库操作方法,节省了很多sql编写,提高了效率

(1)什么是ORM(对象关系映射)

对象:java的实体类对象---数据库的表的一行记录 关系:关系型数据库 映射:对象与数据库之间的关系

(2)mybatis面向接口编程要保持两个一致

1. xml文件的命名空间要与接口的全类名保持一致

2. xml文件的sql标签的id要与接口的方法名保持一致

7.mybatis有哪些执行器

Mybatis 有三种基本的执行器(Executor):

SimpleExecutor:每执行一次 update 或 select,就开启 一个 Statement 对象,用完立刻关闭 Statement 对 象。

ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使用,不存在 就创 建,用完后,不关闭 Statement 对象,而是放置于 Map 内,供下一次使用。简言之,就是重复使 用 Statement 对象。

BatchExecutor:执行 update(没有 select,JDBC 批处理不支持 select),将所有 sql 都添加到批处 理 中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理。与 JDBC 批处理相 同。

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

分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执 行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

举例: select _ from student ,拦截 sql 后重写为: select t._ from (select \* from student)t limit 0,10

9.Mybatis核心配置文件中,标签的顺序

10.mybatis怎么处理多个参数的sql

若mapper接口中的方法和参数为多个的字面量类型,

1. 此时mybatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;

2. 以param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取 相对应的值,注意${}需要手动添加单引号

3. 使用@Param注解命名参数:理解为 以注解的值为键 以参数为值 在xml中直接用键访问

11.mybatis实现模糊查询有哪几种方式

字符串拼接:select * from t_user where username like '%${username}%'

字符串替换:select * from t_user where username like "%"#{username}"%"

concat函数拼接(常用):select * from t_user where username like concat('%',# {username},'%'

12.说一说动态sql都有哪些标签

if:可以通过test属性的表达式进行判断是否执行标签内容

where:可以生成where关键字,还能去掉内容前多余的and、or(不能去除内容后的)

trim:可以添加或删除内容后的指定的多余内容,比如最后一个条件后的and、or

choose、when、otherwise:相当于if-elseif-else,并且至少有一个when,至多有一个otherwise

foreach:循环标签 collection:循环的集合名|数组名 item:集合|数组内的每一个元素 separator:每循环一次添加的内容(分隔符) open:foreach标签前的内容(开始符) close:foreach标签后的内容(结束符)

  • 31
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

射手座的程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值