您的位置:首页 > 汽车 > 新车 > 策划公司经营范围有哪些_西双版纳傣族自治州景洪市_汕头seo管理_域名查询访问

策划公司经营范围有哪些_西双版纳傣族自治州景洪市_汕头seo管理_域名查询访问

2025/5/10 14:58:53 来源:https://blog.csdn.net/2401_84910501/article/details/146408252  浏览:    关键词:策划公司经营范围有哪些_西双版纳傣族自治州景洪市_汕头seo管理_域名查询访问
策划公司经营范围有哪些_西双版纳傣族自治州景洪市_汕头seo管理_域名查询访问

MyBatis 是一个优秀的持久层框架,它不仅简化了数据库操作,还提供了强大的缓存机制来提升查询性能。本文将深入探讨 MyBatis 的执行流程,并重点分析一级缓存和二级缓存的实现原理及其使用场景。

1. MyBatis 执行流程

MyBatis 的执行流程可以分为以下几个步骤:

1.1 加载配置文件

MyBatis 首先加载 SqlMapConfig.xml 配置文件,该文件包含了数据库连接信息、事务管理器配置、映射文件路径等。SqlMapConfig.xml 是 MyBatis 的核心配置文件,所有的全局配置都在这里定义。

<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/qcby/dao/UserMapper.xml"/></mappers>
</configuration>

1.2 创建 SqlSessionFactory

通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory 对象,该对象是 MyBatis 的核心对象,用于创建 SqlSession

InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

1.3 创建 SqlSession

SqlSession 是 MyBatis 与数据库交互的会话对象,它提供了执行 SQL 语句、管理事务、获取映射器等方法。

SqlSession sqlSession = sqlSessionFactory.openSession();

1.4 执行 SQL 语句

通过 SqlSession 执行 SQL 语句,MyBatis 会根据映射文件(XXXMapper.xml)中的配置,将 SQL 语句与 Java 对象进行映射。

UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.findById(1);

1.5 提交或回滚事务

根据业务逻辑,决定是否提交或回滚事务。

sqlSession.commit(); // 提交事务
sqlSession.rollback(); // 回滚事务

1.6 关闭 SqlSession

操作完成后,关闭 SqlSession 以释放资源。

sqlSession.close();

2. MyBatis 缓存机制

MyBatis 提供了两级缓存机制:一级缓存二级缓存,用于提高数据库查询的性能。

2.1 一级缓存

一级缓存是 SqlSession 级别的缓存,默认开启。当 SqlSession 执行查询操作时,查询结果会被缓存到一级缓存中。如果再次执行相同的查询,MyBatis 会直接从缓存中获取结果,而不需要再次访问数据库。

一级缓存的生命周期与 SqlSession 相同,当 SqlSession 关闭时,一级缓存也会被清空。

SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user1 = userDao.findById(1);
User user2 = userDao.findById(1);
System.out.println(user1 == user2); // true,因为第二次查询从一级缓存中获取
sqlSession.close();
一级缓存失效的情况
  • SqlSession 不同:不同的 SqlSession 无法共享一级缓存。

  • 查询条件不同:即使 SqlSession 相同,查询条件不同也会导致缓存失效。

  • 执行了增删改操作:在两次查询之间执行了增删改操作,会导致一级缓存失效。

  • 手动清除缓存:调用 sqlSession.clearCache() 方法可以手动清除一级缓存。

2.2 二级缓存

二级缓存是 Mapper 级别的缓存,多个 SqlSession 可以共享同一个二级缓存。二级缓存默认关闭,需要在映射文件中手动开启。

开启二级缓存的条件
  1. 在核心配置文件中开启二级缓存

<settings><setting name="cacheEnabled" value="true"/>
</settings>
  1. 在映射文件中声明使用二级缓存

<mapper namespace="com.qcby.dao.UserDao"><cache/>
</mapper>
  1. 实体类实现序列化接口

public class User implements Serializable {private Integer id;private String username;// getter 和 setter 方法
}
  1. SqlSession 关闭或提交后生效:二级缓存的数据在 SqlSession 关闭或提交后才会写入缓存。

二级缓存失效的情况
  • 执行了增删改操作:在两次查询之间执行了增删改操作,会导致二级缓存失效。

二级缓存的配置

二级缓存可以通过 <cache> 标签进行配置,常用的配置参数包括:

  • eviction:缓存回收策略,默认是 LRU(最近最少使用)。

  • flushInterval:缓存刷新间隔,单位为毫秒。

  • size:缓存对象的最大数量。

  • readOnly:缓存是否只读,默认为 false

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

2.3 缓存查询顺序

MyBatis 的缓存查询顺序如下:

  1. 先查询二级缓存:因为二级缓存中可能会有其他 SqlSession 查询出来的数据,可以直接拿来使用。

  2. 如果二级缓存未命中,再查询一级缓存

  3. 如果一级缓存也没有命中,则查询数据库

当 SqlSession 关闭时,一级缓存的数据会写入二级缓存。

3. 总结

MyBatis 提供了强大的缓存机制,能够有效提高数据库查询的性能。一级缓存是 SqlSession 级别的缓存,适用于单次会话中的重复查询;二级缓存是 Mapper 级别的缓存,适用于多个会话之间的共享数据。通过合理使用缓存,可以减少数据库的访问压力,提升系统的整体性能。

通过本文,你应该对 MyBatis 的执行流程、一级缓存和二级缓存有了更深入的理解。希望这些内容能帮助你在实际项目中更好地使用 MyBatis。


 

 

 

参考文献:

  • MyBatis 官方文档

  • MyBatis 缓存机制详解

相关推荐:

  • 深入理解 MyBatis 源码

  • MyBatis 高级用法

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com