mybatis基础特性和sqlsession原理

主要总结一下mybaitis的基础配置,基本特性,最后简单分析一下sqlsession的原理,了解了运行过程。


        

简单配置介绍

简单来说,Mybatis的配置主要分为以下几步:

  • 编写POJO即JavaBean,最终的目的是将数据库中的查询结果映射到JavaBean上;
  • 配置与POJO对应的Mapper接口:里面有各种方法,对应mapper.xml中的查询语句;
  • 配置与POJO对应的XML映射:编写缓存,SQL查询等;
  • 配置mybatis-config.xml主要的Mybatis配置文件:配置数据源、扫描mapper.xml等。

  注意:以上的配置并没有严格的前后顺序;

借用一个比较清晰的配置流程图

1566090966352

可以看出mapper接口实现类的获得是通过mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper

生命周期

  1. SqlSessionFactoryBuilder:作用就是创建一个构建器,一旦创建了SqlSessionFactory,它的任务就算完成了,可以回收。
  2. SqlSessionFactory:作用是创建SqlSession,而SqlSession相当于JDBC的一个Connection对象,每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建一个SqlSession,所以SqlSessionFactory在Mybatis整个生命周期中存在(每个数据库对应一个SqlSessionFactory,是单例产生的)。
  3. SqlSession:生命周期是存在于请求数据库处理事务的过程中,是一个线程不安全的对象(在多线程的情况下,需要特别注意),即存活于一个应用的请求和申请,可以执行多条SQL保证事务的一致性。
  4. Mapper:是一个接口,并没有实现类。它的作用是发送SQL,返回我们需要的结果或者发送SQL修改数据库表,所以它存活于一个SqlSession内,是一个方法级别的东西。当SqlSession销毁的时候,Mapper也会销毁。

基础特性

延迟加载

即系统延迟执行查询,一般用于嵌套查询的时候,嵌套在内的SQL查询会延迟加载,等到真正需要使用该查询的时候才加载。就像懒人你说一下,他动一下,绝不会多执行半步,因此该特性也称之为懒加载。

懒加载必须配置config.xml,并且只能通过associationcollection实现,毕竟只有在存在映射关系的业务场景里你需要使用懒加载

配置语句

1
2
3
<settings>       
<setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/>
</settings>

使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。

一级缓存

  • 系统默认开启,缓存的范围为一个SqlSession
  • 只有一个SqlSession下的相同查询才会应用缓存,不同sqlSession下的即使查询相同一级缓存也不会生效

二级缓存

  • 解决SqlSession相互隔离的情况,缓存范围为一个Mapper接口

  • 二级缓存默认是不开启的,需要进行配置,Mybatis要求返回的POJO必须是可序列化的,即POJO实现Serializable接口。

  • 缓存的配置只需要在XML配置<cache/>即可,或者指定算法,刷新时间间隔,缓存状态,大小等

    例:

1566093841325

  • 映射语句文件中所有select语句将会被缓存;
  • 映射语句文件中所有insert、update和delete语句会被刷新缓存;
  • 缓存使用默认的LRU最近最少使用算法回收;
  • 根据时间表,缓存不会任何时间顺序刷新
  • 缓存会存储列表集合或对象的1024个引用
  • 缓存被视为可read/write的缓存,意味着是不可以被共享的,而可以被安全地修改。

自定义缓存

通过Mybatis实现的接口,使用redis等进行缓存

实践配置

待补充

SqlSession原理

SqlSession提供select/insert/update/delete方法

映射器(Mapper)其实就是一个动态代理对象,进入到MapperMethodexecute方法就能简单找到SqlSession的删除、更新、查询、选择方法.

从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession的接口方法(getMapper()方法等到Mapper)执行SQL查询(也就是说Mapper接口方法的实现底层还是采用SqlSession接口方法实现的)。

SqlSession重要的四个对象

  1. Execute:调度执行StatementHandlerParmmeterHandlerResultHandler执行相应的SQL语句;
  2. StatementHandler:使用数据库中Statement(PrepareStatement)执行操作,即底层是封装好了的prepareStatement
  3. ParammeterHandler:处理SQL参数
  4. ResultHandler:结果集ResultSet封装处理返回。

SqlSession的四大对象

Execute

起java和数据库交互桥梁的作用,参与整个SQL执行过程。分类

  1. SIMPLE简易执行器(默认)
  2. REUSE重用预处理执行器
  3. BATCH批量更新、批量专用处理器

源码

1
2
package org.apache.ibatis.session;
public enum ExecutorType { SIMPLE, REUSE, BATCH}

作用

调度其他对象,完成预编译、配置参数和返回结果集

StatementHanlde

分类(分别对应不同执行器)

  • SimpleStatementHandler
  • PrepareStatementHandler
  • CallableStatementHandler

作用

专门处理数据库会话。进行预编译并调用ParameterHandler配置参数。大致来讲只是对数据库的连接做了封装

工作流程

  1. 通过调用RoutingStatementHandler对象生成StatemenetHandler
  2. RoutingStatementHandler查找相应的statementHandler对象
  3. statementHandler调用数据库的方法

ParameterHandler

作用

对预编译的参数进行设置

工作流程

  1. 从parameterObject中取到参数,然后使用typeHandler(注册在Configuration中)进行参数处理

ResultSetHandler

作用

组装结果返回结果集

运行过程总结

  1. prepare预编译
  2. parameterize设置参数
  3. doUpdate/doQuery执行SQL

神人的总结

1566098446042

参考链接

Mybatis缓存(1)——–系统缓存及简单配置介绍

Mybatis的SqlSession运行原理

MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存

分享到: