1,MyBatis的工作原理(执行过程):

  1. 读取Mybatis的配置文件:在Mybatis-config.xml里面有Mybatis的全局配置文件,包括数据库连接信息,属性,类型名称等信息;
  2. 加载映射文件:这个映射文件其实就是SQL的映射文件,这个文件是在配置文件中进行加载;有两种加载方式:1,package包扫描;2,mapper找到配置文件的位置;
  3. 构建会话工厂获取SqlSessionFactory:这个工厂是为了下一步去创建Session对象;
  4. 创建Session对象:这个对象包括了执行SQL语句的所有方法;(线程不安全)
  5. Executor执行器:这个执行器是最核心的部分,这里负责SQL语句的生成和缓存的维护,会根据Session对象传来的方法来执行需要的SQL语句;
  6. mappedStatement对象:这个对象是对解析的SQL语句进行封装;
  7. 参数映射:这里对要封装的结果类型进行映射,为封装结果集做准备,在mapper中的parameterType设置类型;
  8. 封装结果集:将查询出来的结果根据类型封装到结果集中,常用的属性是resultType和resultMap;

    2,Mybatis的一级缓存和二级缓存的区别:

    区别
  • 一级缓存的作用域是一个sqlsession内;
  • 二级缓存作用域是针对mapper进行缓存;

一级缓存
在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)

二级缓存:
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。