框架建设收集

关于Mybatis的几件小事(二)

2019-06-03  本文已影响29人  一条路上的咸鱼

一、MyBatis缓存机制

1.简介

2.一级缓存

3.一级缓存失效情况

4.二级缓存

4.缓存相关属性

5.缓存设置

6.使用第三方缓存之后的查询流程

  1. 查询二级缓存。
  2. 如果二级缓存没有,查询一级缓存。
  3. 一级缓存也没有,查询数据库。
image.png

二、MyBatis工作原理示意图

image.png

三、MyBatis插件开发

1.MyBatis插件

2.插件开发步骤

  1. 编写插件实现Interceptor接口,并使用@Intercepts注解完成插件签名。
@Intercepts({
    @Signature(type=StatementHandler.class,method="prepare",
              args={Connection.class})
})
public class MyPlugin implements Interceptor{}
  1. 在全局配置文件中注册插件
<plugins>
    <plugin interceptor="com.desperado.plugin.MyPlugin">
          <property  name="username" value="tomcat"/>
     </plugin>
</plugins>

3.插件原理

  1. 按照插件注册声明,按照插件配置顺序调用插件plugin方法,生成被拦截对象的动态代理。
  2. 多个插件依次生成目标对象的代理对象,层层包裹,先声明的先包裹,形成代理链。
  3. 目标想法执行时依次从外到内执行intercept方法。
  4. 多个情况下,我们往往需要在某个插件中分离出来目标对象,可以借助MyBatis提供的SystemMateObject类来进行获取最后一层的h以及target属性的值。

4.Interceptor接口

5. 常用代码

//1.分离代理对象。由于会形成多次代理,所以需要通过while循环分离出最终被代理的对象,从而方便提取信息。
MetaObject metaObject = SystemMetaObject.forObject(target);
while(metaObject.hasGetter("h")){
      Object h = metaObject.getValue("h");
      metaObject = SystemMetaObject.forObject(h);
}
//2.获取到代理对象中包含的被代理的真实对象
Object obj = metaObject.getValue("target");
//3.获取被代理对象的MetaObject方便进行信息提取
metaObject forObject  = SystemMetaObject.forObject(obj);

四、其他操作

1.分页操作

2.批量操作

3.存储过程

  1. select标签中statementType="CALLABLE".
  2. 标签体中调用语法
<select id="callProcedure" statementType="CALLABLE">
    call procedure_name(#{param1},#{param2})
</select>

4.自定义TypeHandler处理枚举

上一篇下一篇

猜你喜欢

热点阅读