mybatis官方中文文档
https://mybatis.org/mybatis-3/zh/configuration.html
mybaits解析mapper有四种方式, 1、<package name ="" ; 2、 class; 3、 url ; 4、resource
mybatis 默认是没有事务的,集成spring后会使用spring的声明式事务,mybatis事务没有太多作用
sqlSession:在一个方法内存活(也就是一个请求内存活)
TypeHandlerRegistry.java实现了java对象类型与数据库类型间的转换。
自定义自己的Typehandler()
public class MyTypeHandler extends BaseTypeHandler<Java类型> {
}
DefaultObjectFactory通过反射机制帮开发者创建java对象(可自定义)
mybaits-config.xml中<environments>配置带连接池的数据源信息(可配置多个进行切换),集成spring之后配置信息会交给spring去管理
show VARIABLES like '%max_allowed_packet%';(mysql一次通信数据包的阈值,默认是1M),在使用mybaits做批量操作时有可能导致数据包过大,可以使用多线程去操作数据,也可以通过mysql配置文件修改max_allowed_packet默认值
mybaits主要工作流程
一、解析配置文件
首先在MyBatis启动的时候要去解析配置文件,包括全局配置文件和映射器解,析成一个Configuration对象
二、 提供操作接口
通过一个 Builder来创建工厂类SqISessionFactory,由SqISessionFactory工厂生产sqlSession对象(代表应用和数据库之间的一次连接)‘
三、 执行SQL操作
SqISession持有了一个Executor对象,用来封装对数据库的操作。
mybaits缓存:
(缓存的实现使用了装饰器模式,对Executor执行器进行装饰)
一级缓存(本地缓存)(Local Cache), MyBatis的一级缓存是在会话(SqISession)
层面进行缓存的。MyBatis的一级缓存是默认开启的,不需要任何的配置
在同一个会话里面,多次执行相同的SQL语句,会直接从内存取到缓存的结果,不 会再发送SQL到数据库。但是不同的会话里面,即使执行的SQL一模一样(通过一个 Mapper的同一个方法的相同参数调用),也不能使用到一级缓存。
二级缓存(适用于以查询为主的系统并且在单个mapper中操作单表的情况下开启,例如历史交易,历史订单,因为增删改会flushCache刷新缓存)
二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是namespace级别 的,可以被多个SqISession共享(只要是同一个接口里面的相同方法,都可以共享), 生命周期和应用同步。
二级缓存的总开关是默认开启的。但是每个Mapper的二级缓存开关是默认关闭的。
可以在单个Statement ID上显式关闭二级缓存(默认是true):useCache="false"
为什么增删改操作会清空缓存?
在 CachingExecutor 的 updateQ方法里面会调用 flushCachelfRequired(ms),
isFlushCacheRequired就是从标签里面渠道的flushCache的值。而增删改操作的 flushCache属性默认为true。
二级缓存可以自定义使用第三方缓存ehcache或者redis
网友评论