MyBatis相关面试题

提示:MyBatis相关面试题,持续更新中

文章目录


1、MyBatis框架是如何实现分页的?

java 复制代码
分页分为两种:
	逻辑分页:将所有数据查询出来,再在内存中进行分页处理;
	物理分页:直接在数据库中进行分页;
	
具体实现:
	1、自己写SQL进行分页;(物理分页)
	2、使用拦截器进行分页;(物理分页)
	3、使用PageHelper进行分页;(物理分页)
	4、使用RowBounds进行分页;(逻辑分页)
	

2、说一说MyBatis框架里面的缓存机制是怎么回事?

MyBatis中有两级缓存:一级缓存 和 二级缓存;

(1)一级缓存

java 复制代码
1、一级缓存是SqlSession级别的缓存, 通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,
	不会再从数据库查询;
	
2、一级缓存是默认开启的,是不能关闭的,但可以调用SqlSession的clearCache()方法清理缓存;

3、不同SqlSession之间的缓存数据是隔离的,即一个SqlSession中的缓存数据在另一个SqlSession中是读取不到的;

4、一级缓存的作用范围可以配置两种:
	local-cache-scope: statement(配置后,会清理缓存,相当于缓存失效)
	local-cache-scope: session(默认)

--------------------------------------------------------------------------------------------------------------------

一级缓存失效的几种情况
	1、不同的SqlSession对应不同的一级缓存;
	2、同一个SqlSession但是查询条件不同;
	3、同一个SqlSession两次查询期间执行了任何一次增删改操作;
	4、同一个SqlSession两次查询期间手动清空了缓存;

--------------------------------------------------------------------------------------------------------------------

注:以下代码,若不开启事务,每一次的goodsDao.queryByPage()都是新的sqlsession不会存在一级缓存,只有开启事务后,才会有一级缓存
    @Resource
    private GoodsDao goodsDao;

    //@Transactional
    @Override
    public List<Goods> queryByPage(Integer startRow, Integer pageSize) {
        List<Goods> list1 = goodsDao.queryByPage(startRow, pageSize);
        System.out.println("查詢1:" + list1 + "\n");

        List<Goods> list2 = goodsDao.queryByPage(startRow, pageSize);
        System.out.println("查詢2:" + list2 + "\n");
        return list2;
    }

(2)二级缓存

二级缓存在SqlSession提交或关闭后才生效;

java 复制代码
二级缓存默认是关闭的,开启二级缓存,需要同时有如下两项:
	application.yml  
		mybatis:
		  configuration:
		    cache-enabled: true
		    
	Mapper.xml
	<cache/>
	
二级缓存是跨SqlSession的,多个SqlSession可以共用同一个二级缓存;

二级缓存是mapper级别的缓存,根据mapper的namespace区分,两个mapper的namespace相同,
	则这两个mapper执行sql查询到的数据将缓存到相同的二级缓存区域中;
	
使用二级缓存的POJO类要实现Serializable接口;
相关推荐
头发还在的女程序员1 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats1 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123452 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友3 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华3 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.4 小时前
C++:语句和作用域
开发语言·c++
都叫我大帅哥4 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.4 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰5 小时前
PHP上传文件
android·开发语言·php
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程