这段时间不怎么忙,又回过头来想了想mybatis分页的情况。在网上看了几位师兄的博客,回过头自己又整理了一下。大家都是知道了,mybatis可以通过自定义插件实现分页功能,很多博客中都说过了,这是拦截器的形式。既然是拦截器实现的分页,那么拦截器拦截的是什么呢?拦截以后我们应该做什么呢?搞懂这两个问题就明白这个分页的拦截器是怎么回事儿了。其实拦截器不仅仅这点作用。进入正题。
mybatis官网中说明了,mybatis plugin可以拦截四个类系的对象:Executor,ParameterHandler, ResultSetHandler ,StatementHandler ;而我们要拦截的无非也就是Dao中的方法。不要急往下读
Executor:这个相当于就是mybatis调用jdbc的执行器,这里的功能就多了,大致包含查询、更新,提交事务,回滚等等;
ParameterHandler:这个相当于是专门处理被拦截方法中的参数,比如要将拦截的方法的参数中加一个值、或是验证一下什么的、或是修一下值;
ResultSetHandler :这个就简单了寒,很明显就是拦截方法返回的结果,对结果集进行再加工;
StatementHandler :这个一个是不是很熟悉,JDBC和它就相关了。分页就可以使用它也来处理了,获得原来的sql,再进行处理加工成分页的sql,最终就可以实现。
-------------------------------------
我们回过头来看看,定义一个拦截器,当然是实现mybatis的Interceptor,如下:
public class PageInterceptor implements Interceptor {
,这里要实现他的三个方法,分别是
@Intercepts({ @Signature(args = { Connection.class }, method = "prepare", type = StatementHandler.class) })
public class PageInterceptor implements Interceptor {
/*
* 这个方法很很明显就是算是,拦截器要做什么的地方,大家看到invocation这个就应该熟悉了,
* 反射,不多说。通过反射就可以获取到目标对象,参数,和方法名。注意这里的方法名不是dao的中方法名。
方法中的代码很简单了吧。
*/
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statement = (StatementHandler) invocation.getTarget();
BoundSql boundSql = statement.getBoundSql();
Object parameterObject = boundSql.getParameterObject();
//此处的parameterObject为被拦截DAO方法的参数,比如这个Dao的参数可以为一个page对象,对象属性包含当前面,每页显示的行数,总页数,总行数,当前页的结果集(一般为一个List),以及一个集合(前端传递过来的,查询条件集合)
System.err.println(parameterObject);
String sql = boundSql.getSql();
//这里获得原来sql后,就可以进行改造了,处理为查询总数据的即可。
System.err.println(sql);
Connection connectin = (Connection) invocation.getArgs()[0];
//此处获取到的就是prepare方法。
return invocation.proceed();
}
/*
* 这里多说一下,这是就是包装前面所说的mybait提供中的四个类系对象,这个方法会被执行四次。具体被包装的是哪个看具体的配置。当前被包装就是StatementHandler类系的对象(类的注解上面标识出来了),没有被包装的对象,原样返回,被装的就返回代理对象。
*/
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/*这个方法就是获取外部xml中配置property的key,如下
<plugins>
<plugin interceptor="com.liuhao.stu.PageInterceptor">
<property name="dialect" value="mysql" />
<property name="pageSqlId" value=".*ListPage.*" />
</plugin>
</plugins>
这里有一点很重要,就是<plugins>这组标签在配置拦截器时,要放到最前面,不然XML报错,很无解。这个属性配置就很有用了哈,比如当前拦截的是什么数据库,就可以通过这里来区分了;拦截什么样了DAO方法也可以在这里实现了,比如以ListPage、paging,page结尾的。当拦截的就是包含ListPage的DAO方法都会被拦截
*/
public void setProperties(Properties p) {
String dialect = p.getProperty("dialect");
String pageSqlId = p.getProperty("pageSqlId");
}
}
-----------------------------------------
通过以上说明,大家应该发现一点,就是DAO方法被拦截后,会先加载xml中的属性配置,也就是先执行setProperties这个方法,然后对这四个类型的实例对象进行包装,也就是执行plugin方法(注解配置谁,就包装谁,并返回代理对象,未包装的直接返回原对象),最后执行intercept方法,完成具体的执行。
------------------------------------------
最后总结一下就是:通过xml的plugin配置,拦截对应的DAO方法;然后在自定义拦截器中,配置注释,我们具体要做的事(是加工SQL、是处理结果集、是处理参数、还是处理执行器,以及他们对应的方法和参数);明确后,就是调用到wrap方法了,对具体的对象进行包装,并返回;最后执行intercept方法。
-----------------------------------------
文笔不好,欢迎留言,忘老鸟指正。
分享到:
相关推荐
标题 "mybatisPlugin" 暗示我们讨论的是一个针对IntelliJ IDEA的MyBatis插件,这个插件旨在提升开发人员在IDEA中使用MyBatis框架的效率和便利性。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...
标题 "SpringBoot+JSP+Mybatis用户管理员工项目源码" 涉及到的是一个基于Java技术栈的Web应用程序开发,主要使用了Spring Boot、MyBatis和JSP这三个核心组件。以下是对这些技术及其在项目中的应用进行的详细解释: ...
以下是对MyBatis-Plus以及相关插件的详细讲解: 1. MyBatis-Plus简介: MyBatis-Plus(简称MP)是一个为MyBatis做拓展的工具,它简化了常见的数据操作,如插入、删除、更新和查询。MP提供了CRUD操作的便捷方法,...
MyBatis 是一款深受开发者喜爱的持久层框架,它提供了灵活的 SQL 执行以及映射机制,极大地简化了 Java 应用程序与数据库之间的交互。在这个名为 "mybatis2020.zip" 的压缩包中,我们可以期待找到一系列关于 MyBatis...
本教程将详细讲解如何使用Mybatis Generator针对Mysql和Oracle数据库自动生成相关代码。 首先,我们需要了解Mybatis Generator的基本配置。在项目中创建一个`generatorConfig.xml`配置文件,这是Mybatis Generator...
- **MyBatis底层基础和拦截器 - 第二部分.zip**:这部分可能深入讲解了拦截器的实现原理,如何创建自定义拦截器,以及在实际项目中如何应用拦截器优化性能。 通过这两个部分的学习,你将能够全面了解MyBatis的运作...
MyBatis是一个流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL与Java代码直接集成,提供了灵活的映射机制,使数据访问更为高效。这个资源集合包含的是一系列关于MyBatis源码分析的课件,以及相关的DTD...
下面将详细讲解如何实现MyBatis Generator的自定义插件,以实现自定义Mapper。 首先,我们需要了解MyBatis Generator插件的基本结构。一个自定义插件通常需要继承`org.mybatis.generator.api.PluginAdapter`类,并...
- "7.IDEA-File-Settings-Plugins-Marketplace-安装lombok和Free Mybatis plugin插件.png":IDEA是常用的Java开发工具,Lombok是一个用于简化JavaBean的库,Free Mybatis Plugin则是帮助管理和生成MyBatis相关代码的...
下面我们将详细讲解如何设置和使用MyBatis Generator: 1. **配置文件**:在项目中创建一个名为`mybatis-generator-config.xml`的文件,这是MBG的主要配置文件。在这个文件中,你需要指定数据库连接信息(如URL、...
为了深入理解,你可以查看这些文件的内容,结合本文的讲解,进一步了解 MyBatis 拦截器的工作原理和具体实现。 总结来说,MyBatis 的动态代理实现的拦截器机制,通过 Proxy 和 InvocationHandler,使得我们可以在不...
本篇文章将详细讲解MyBatis如何实现分页配置,以及物理分页的概念。 首先,我们需要了解分页的基本概念。分页是数据库查询的一种策略,它将大量的数据分割成小块,每次只加载一部分数据到内存,以减轻服务器压力并...
下面我们将详细讲解如何开发一个MyBatis插件: 1. **创建插件类** 创建一个类,实现Interceptor接口,并实现intercept方法。intercept方法接收Invocation对象,这个对象包含了被拦截方法的所有信息,包括方法名、...
SpringBoot以其简洁的配置和快速的启动能力,成为现代Java开发中的热门选择,而Mybatis作为轻量级的持久层框架,提供灵活的SQL映射,使得数据操作更为直观。下面我们将详细讲解这个项目中的关键知识点。 1. **...
本篇文章将详细讲解如何在该版本中以注解的形式整合Mybatis与PageHelper实现分页功能。 首先,我们需要引入必要的依赖。在`pom.xml`文件中,添加SpringBoot对Mybatis和PageHelper的支持: ```xml <groupId>org....
Struts2、MyBatis和Spring3是Java开发中常用的三大框架,它们的整合能够构建出高效、灵活的企业级应用。下面将详细讲解这三者整合的核心知识点。 **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的Web...
本篇文章将详细讲解两种在MyBatis中实现SQL打印的方法:通过log4j配置和使用MyBatis拦截器。 1. **log4j配置SQL打印** Log4j是一款广泛使用的日志记录工具,它可以方便地记录程序运行过程中的各类信息,包括SQL...
MyBatis的代码生成器是通过`mybatis-generator-plugin`实现的,它允许开发者定义模板和配置,自动生成与数据库表相关的Java源代码。配置文件通常为`generatorConfig.xml`,其中包含了数据库连接信息、生成的目标...
下面将详细讲解这三者如何整合以及在Java 8和Tomcat 8环境下配置与运行。 **Spring MVC 框架** Spring MVC 是 Spring 框架的一部分,专门用于构建Web应用程序。它采用模型-视图-控制器(MVC)设计模式,分离了业务...
标题 "小项目框架改造二:spring3.2.4+struts2.1.8+mybatis3.2.6整合修改" 提供了一个关于整合老旧但仍然广泛使用的Java Web开发框架的场景。这个项目涉及了Spring、Struts2和MyBatis三个核心组件的集成与优化。下面...