MyBatis简单总结

2021/7/5 6:21:37

本文主要是介绍MyBatis简单总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、工作流程

  1. 加载配置并初始化

    加载配置文件,将SQL的配置信息加载成一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

  2. 接受调用请求

    调用MyBatis提供的API,传入SQL的id和传入参数对象,将请求传递给下层的请求处理层进行处理。

  3. 处理操作请求

    • 根据SQL的id查找对应的MappedStatement对象
    • 根据传入参数对象解析MappedStatement对象,得到最重要执行的SQL和执行传入参数。
    • 获取数据库连接,执行SQL。
    • 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,得到最终的处理结果。
    • 释放数据库连接。
    • 返回处理结果。

二、基本要素

  • SqlMapConfig.xml:全局配置文件
  • Mapper.xml:核心配置文件
  • SqlSessionFactory、SqlSession接口

三、事务管理

  • JDBC:直接使用JDBC的提交和回滚功能。依靠连接的数据源来管理事务。
  • MANAGED:不做任何操作,让窗口(如Spring或者JavaEE服务器)来管理事务

四、数据源配置类型

  • UNPOOLED:这个数据源实现只在每次请求的时候简单的打开和关闭一个链接。
  • POOLED:缓存JBDC连接对象,用于避免每次都要连接。
  • JNDI:为了和Spring或者应用服务器一起使用的。

五、查询缓存

MyBatis支持一级缓存和二级缓存

5.1、一级缓存

默认开启,不需要额外配置。

基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session flush或close之后,该session的所有缓存被清空

一级缓存的生命周期

MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用。

怎么判断某两次查询是完全相同的查询

mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。

传入的statementId。

查询时要求的结果集中的结果范围。

这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )。

传递给java.sql.Statement要设置的参数值。

5.2、二级缓存

需要在SQLMapConfig.xml中设置总开关开启外,还需要在具体的Mapper.xml中开启。同时,resultType的类必须实现Serializable接口

<setting name="cacheEnabled" value="true" />
<mapper namespace="org.silence.mapper.EmpMapper">
	<!--开启二级缓存-->
    <cache></cache>
</mapper>
public class EMP implements Serializable {
    ...
}

与一级缓存机制相同,默认采用PerpetualCache的HashMap本地存储,其作用域为Mapper(namespace),并且可以自定义存储源,如Ehcache等。

映射语句文件中的所有select语句将会被缓存。

映射语句文件中的所有insert、update和delete语句会刷新缓存。

缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回。

根据时间表,比如No Flush Interval,(CNFI没有刷新间隔),缓存不会以任何时间顺序来刷新。

缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。

缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。

在Mapper.xml的具体SQL语句中通过 useCahe="false"可以关闭当前语句的缓存

<select id="findById" useCahe="false" ... /></select>


这篇关于MyBatis简单总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程