自定义持久层框架
本质是对JDBC代码封装
- 加載配置文件
- 创建 javaBean
○ Configuration 类:
○ MappedStatement 类 - 解析配置文件
- 创建SqlSessionFactory 接口及实现类 DefaultSqlSessionFactory
a. openSession(): 生成 SqlSession - 创建 SqlSession接口及实现类 DefaultSession
a. 定义数据库操作 - 创建Executor接口及实现类 SimpleExecutor实现类
Mybatis基础
Properties标签
<properties resource="jdbc.properties"></properties>
加载外部数据源配置信息
Package标签
使用 package 标签,mapper.xml和 mapper接口 同包同名
mapper标签
-
使⽤相对于类路径的资源引⽤,例如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/> -
使⽤完全限定资源定位符(URL),例如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/> -
使⽤映射器接⼝实现类的完全限定类名,例如:
<mapper class="org.mybatis.builder.AuthorMapper"/> -
将包内的映射器接⼝实现全部注册为映射器(常用):
<package name="org.mybatis.builder"/>
mybaits缓存
一级缓存
- 做增删改操作,提交事务,会刷新一级缓存,原有缓存失效。
- sqlSession.clearCache() 手动刷新缓存。
二级缓存
跨多个SqlSession缓存,mapper级别
开启二级缓存 mapper接口 @CacheNamespace
禁用二级缓存,方法加@Options(useCache=false)
二级缓存缓存数据,不缓存对象,会返回一个新的对象
查询顺序:二级缓存 --》 一级缓存 --》 数据库
mybatis插件
本质是底层的动态代理
Mybatis 插件接⼝-Interceptor
调用顺序 plugin --> intercept. Plugin方法内部调用 Proxy.newProxyInstance(...)
InterceptorChain 类中保存插件调用链,pluginAll(Object target)内部调用interceptor.plugin(target)方法
InterceptorChain.java
public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
MyPlugin.java
- plugin⽅法,⽣成target的代理对象
- setProperties⽅法,传递插件所需参数
@Intercepts({
@Signature(
type = Executor.class,
method = "query",
args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}
)
})
public class MyPlugin implements Interceptor {
/*
拦截方法:只要被拦截的目标对象的目标方法被执行时,每次都会执行intercept方法
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("对方法进行了增强....");
return invocation.proceed(); //原方法执行
}
/*
主要为了把当前的拦截器生成代理存到拦截器链中
*/
@Override
public Object plugin(Object target) {
Object wrap = Plugin.wrap(target, this);
return wrap;
}
/*
获取配置文件的参数
*/
@Override
public void setProperties(Properties properties) {
System.out.println("获取到的配置文件的参数是:"+properties);
}
}
sqlMapConfig.xml
<plugins>
<plugin interceptor="com.lagou.plugin.ExamplePlugin">
</plugin>
</plugins>
Mybatis 源码剖析
总体流程
- 加载配置文件并初始化
- 接收调用请求
- 处理操作请求
- 返回处理结果
延迟加载
前提:多表查询满足嵌套查询
网友评论