自己实现了一个比较简单的MyBatis分页插件。在讲解如何实现分页插件之前,我们先简单介绍一下Mybatis中的一些重要的对象。我们通过映射器Mapper对数据库进行增删改操作时,Mapper执行的过程是通过Executor、StatementHandler、ParameterHandler和ResultHandler来完成对数据库的操作和返回结果的。
- Executor代表执行器,由它来调度StatementHandler、ParameterHandler、ResultHandler等来执行对应的SQL。
- StatementHandler的作用是使用数据库的Statement(PreparedStatement)执行操作,是上面提到的四个对象的核心。
- ParameterHandler用于SQL对参数的处理。
- ResultHandler是进行最后数据集(ResultSet)的封装返回处理的。
前提条件
要编写Mybatis插件,我们就必须要实现Interceptor接口,下面先来看看这个接口里面的方法:
1 |
|
- intercept方法是插件的核心方法,它有个Invocation类型的参数,通过这个参数可以反射调度原来对象的方法。
- plugin方法的作用是给被拦截的对象生成一个代理对象并返回。
- setProperties方法允许在plugin元素中配置所需参数。
分页拦截器
拦截器签名
1 |
|
实现自己的拦截器
这里我要拦截的是Executor的query方法,先判断有没有PageParam类型的分页参数,如果有的话先查询符合条件的数据条数count,再获取具体的数据list,将count和list封装在Page类型的对象里面返回。
1 |
|
获取数据总数方法
1 |
|
根据数据库类型设置BoundSql
1 |
|
访问 http://127.0.0.1:8080/user/getAll?index=1&rows=10 ,就可以获取到分页后的结果了。
上面只是几个比较重要的方法,完整的代码在 github 。