专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

面试题:mybatis一级缓存、二级缓存?

ins518 2025-09-08 22:02:52 技术文章 4 ℃ 0 评论

1、一级缓存:指的是mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出,当sqlSession消失时,mybatis的一级缓存也就消失了,当调用sqlSession的修改、添加、删除、commit()、close()等方法时,会清空一级缓存。

2、二级缓存:指的是mybatis中的sqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession共享其缓存,但是其中缓存的是数据而不是对象。当命中二级缓存时,通过存储的数据构造成对象返回。查询数据的时候,查询的流程是二级缓存 > 一级缓存 > 数据库。

3、如果开启了二级缓存,sqlSession进行close()后,才会把sqlSession一级缓存中的数据添加到二级缓存中,为了将缓存数据取出执行反序列化,还需要将要缓存的pojo实现Serializable接口,因为二级缓存数据存储介质多种多样,不一定只存在内存中,也可能存在硬盘中。

4、mybatis框架主要是围绕sqlSessionFactory进行的,具体的步骤:

定义一个configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings。

通过配置对象,则可以创建一个sqlSessionFactoryBuilder对象。

通过sqlSessionFactoryBuilder获得sqlSessionFactory实例。

通过sqlSessionFactory实例创建qlSession实例,通过sqlSession对数据库进行操作。

5、代码实例

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>

<!-- 加载类路径下的属性文件 -->

<properties resource="db.properties"/>


<!-- 设置类型别名 -->

<typeAliases>

<typeAlias type="cn.itcast.javaee.mybatis.app04.Student" alias="student"/>

</typeAliases>


<!-- 设置一个默认的连接环境信息 -->

<environments default="mysql_developer">


<!-- 连接环境信息,取一个任意唯一的名字 -->

<environment id="mysql_developer">

<!-- mybatis使用jdbc事务管理方式 -->

<transactionManager type="jdbc"/>

<!-- mybatis使用连接池方式来获取连接 -->

<dataSource type="pooled">

<!-- 配置与数据库交互的4个必要属性 -->

<property name="driver" value="${mysql.driver}"/>

<property name="url" value="${mysql.url}"/>

<property name="username" value="${mysql.username}"/>

<property name="password" value="${mysql.password}"/>

</dataSource>

</environment>


<!-- 连接环境信息,取一个任意唯一的名字 -->

<environment id="oracle_developer">

<!-- mybatis使用jdbc事务管理方式 -->

<transactionManager type="jdbc"/>

<!-- mybatis使用连接池方式来获取连接 -->

<dataSource type="pooled">

<!-- 配置与数据库交互的4个必要属性 -->

<property name="driver" value="${oracle.driver}"/>

<property name="url" value="${oracle.url}"/>

<property name="username" value="${oracle.username}"/>

<property name="password" value="${oracle.password}"/>

</dataSource>

</environment>

</environments>


<!-- 加载映射文件-->

<mappers>

<mapper resource="cn/itcast/javaee/mybatis/app14/StudentMapper.xml"/>

</mappers>


</configuration>

public class MyBatisTest {


public static void main(String[] args) {

try {

//读取mybatis-config.xml文件

InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");

//初始化mybatis,创建SqlSessionFactory类的实例

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

//创建session实例

SqlSession session = sqlSessionFactory.openSession();

/*

* 接下来在这里做很多事情,到目前为止,目的已经达到得到了SqlSession对象.通过调用SqlSession里面的方法,

* 可以测试MyBatis和Dao层接口方法之间的正确性,当然也可以做别的很多事情,在这里就不列举了

*/

//插入数据

User user = new User();

user.setC_password("123");

user.setC_username("123");

user.setC_salt("123");

//第一个参数为方法的完全限定名:位置信息+映射文件当中的id

session.insert("com.cn.dao.UserMapping.insertUserInformation", user);

//提交事务

session.commit();

//关闭session

session.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表