参考链接:深入理解Mybatis插件开发

1.plugins:与其称为Mybatis插件,不如叫Mybatis拦截器,更加符合其功能定位,实际上它就是一个拦截器,应用代理模式,在方法级别上进行拦截。

  1):支持拦截的方法

      执行器Executor(update、query、commit、rollback等方法);

      参数处理器ParameterHandler(getParameterObject、setParameters方法);

      结果集处理器ResultSetHandler(handleResultSets、handleOutputParameters等方法);

      SQL语法构建器StatementHandler(prepare、parameterize、batch、update、query等方法);

  2):作用场景

      分页功能:mybatis的分页默认是基于内存分页的(查出所有,再截取),数据量大的情况下效率较低,不过使用mybatis插件可以改变该行为,只需要拦截StatementHandler类的prepare方法,改变要执行的SQL语句为分页语句即可;

      公共字段统一赋值:一般业务系统都会有创建者,创建时间,修改者,修改时间四个字段,对于这四个字段的赋值,实际上可以在DAO层统一拦截处理,可以用mybatis插件拦截Executor类的update方法,对相关参数进行统一赋值即可;

      性能监控:对于SQL语句执行的性能监控,可以通过拦截Executor类的update, query等方法,用日志记录每个方法执行的时间;

      其它:其实mybatis扩展性还是很强的,基于插件机制,基本上可以控制SQL执行的各个阶段,如执行阶段,参数处理阶段,语法构建阶段,结果集处理阶段,具体可以根据项目业务来实现对应业务逻辑。

  3):小例子

      A:创建一个自定义插件类MyPlugins,实现接口org.apache.ibatis.plugin.Interceptor,在类上使用注解@Intercepts设置拦截的类,类里面的方法,以及方法里面的参数

@Intercepts({
@Signature(
type = Executor.class,
method = "query",
args = {
MappedStatement.class,
Object.class,
RowBounds.class,
ResultHandler.class
})
})
public class MyPlugins implements Interceptor { /**
* 在此实现自己的拦截逻辑
* @param invocation Invocation参数中拿到执行方法的对象,方法,方法参数
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget(); //被代理对象
System.out.println(target);
Method method = invocation.getMethod(); //代理方法
System.out.println(method);
Object[] args = invocation.getArgs(); //方法参数
System.out.println(Arrays.toString(args));
System.out.println("我在拦截前");
// do something ...... 方法拦截前执行代码块
Object result = invocation.proceed();
System.out.println("我在拦截后");
// do something .......方法拦截后执行代码块
return result;
} /**
* 生成代理对象
* @param target
* @return
*/
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
} /**
* 设置一些属性变量
* @param properties
*/
@Override
public void setProperties(Properties properties) {
//输出设置的配置参数
Iterator iterator = properties.keySet().iterator();
while (iterator.hasNext()){
String keyValue = String.valueOf(iterator.next());
System.out.println(properties.getProperty(keyValue));
}
}
}

      B:在mybatis配置文件mybatis-config.xml注册,并设置一些参数

 <plugins>
<plugin interceptor="com.james.mybatis.plugins.MyPlugins">
<property name="name" value="zhangsan"/>
</plugin>
</plugins>

      C:在测试类中测试:

public class Main {
public static void main(String[] args) throws IOException { //1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory,在配置文件中设置的plugins标签参数在执行这个是被使用
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IBookDao bookDao = session.getMapper(IBookDao.class);
//6.使用代理对象执行查询所有方法,执行这个方法是会被自己实现的插件类进行拦截
Book book = bookDao.selectById(1);
System.out.println(book);
//7.释放资源
session.close();
in.close();
}
}

    

Mybatis---06Mybatis配置文件浅析(四)的更多相关文章

  1. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  2. 四、MyBatis主配置文件

    //备注:该博客引自:http://limingnihao.iteye.com/blog/1060764 在定义sqlSessionFactory时需要指定MyBatis主配置文件: Xml代码 收藏 ...

  3. Java数据持久层框架 MyBatis之API学习四(xml配置文件详解)

    摘录网址: http://blog.csdn.net/u010107350/article/details/51292500 对于MyBatis的学习而言,最好去MyBatis的官方文档:http:/ ...

  4. Mybatis配置信息浅析 MyBatis简介(二)

    官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...

  5. Mybatis主配置文件常见使用讲解

    在开发中我们通常将Mybatis中配置文件分两种,主配置文件与和dao对应的映射文件. 其实最后mybatis解析的还是一个主配置文件. 而映射文件会通过我们配置<mappers>属性,或 ...

  6. 详解mybatis映射配置文件

    一  mybatis 映射文件结构 mybatis映射配置文件存在如下顶级元素,且这些元素按照如下顺序被定义. cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的 ...

  7. MyBatis学习总结(四)——MyBatis缓存与代码生成

    一.MyBatis缓存 缓存可以提高系统性能,可以加快访问速度,减轻服务器压力,带来更好的用户体验.缓存用空间换时间,好的缓存是缓存命中率高的且数据量小的.缓存是一种非常重要的技术. 1.0.再次封装 ...

  8. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...

  9. Mybatis学习(3)关于mybatis全局配置文件SqlMapConfig.xml

    比如针对我这个项目的mybatis全局配置文件SqlMapConfig.xml做一些说明: <?xml version="1.0" encoding="UTF-8& ...

  10. MyBatis核心配置文件详解

    ------------------------siwuxie095                                     MyBatis 核心配置文件详解         1.核心 ...

随机推荐

  1. dubbo学习(六)dubbo管理控制台

    管理控制台的安装与使用 下载地址:https://github.com/apache/dubbo-admin/tree/master(包含管理控制台和监控中心) PS:  下载前要选择master分支 ...

  2. 请求转发和重定向实现与Ajax实现表单登陆

    private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException ...

  3. Linux系统编程—条件变量

    条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用.条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等 ...

  4. 记一次select2赋值动态数组的坑

    var roles = $td.eq(3).text().split(","); var arr = []; //循环去除每个值前后的空格,否则下拉框赋值回显出错for(var i ...

  5. Linux里面的压缩和解压类指令

    gzip/gunzip 指令 ( .gz  不能压缩目录) gzip 用于压缩文件, gunzip 用于解压的 . gzip gzip命令用来压缩文件.gzip是个使用广泛的压缩程序,文件经它压缩过后 ...

  6. 使用C#创建WebService实例

    新增WebService专案 更改服务程式名称 重命名程式名称 Service1.asmx 修改为 TestService.asmx 此时下面的cs代表文件也会跟着修改,但可发现,代码中的类名并没有跟 ...

  7. 分页查询对象Page

    1 public class Page { 2 //当前页码 3 private Integer pageNo = 1; 4 //每页显示条数 5 private Integer pageSize = ...

  8. safari 浏览器版本升级后提示“此网页出现问题,已重新载入网页” 解决办法

    safari回退条件 版本回退的前提是关闭电脑的SIP机制,命令行 csrutil status 检测状态.Mac os 10.14以下版本回退Safari后插件还是可以用的,升了新系统退了也没法用了 ...

  9. AA.Dapper升级了

    AA.Dapper基于dapper进一步封装而成的orm框架,提供增删改查.分页.事务.原生sql的功能,以满足日常的业务开发. 1.Repository层: DapperRepository类包含大 ...

  10. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...