mybatis拦截器与分页插件实例教程
mybatis介绍
拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis架构图

我们这个demo实现就是基于mybatis的插件模块(主要实现mybatis的Interceptor接口)
Interceptor接口
package org.apache.ibatis.plugin;
import java.util.Properties;
/**
* @author Clinton Begin
*/
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}
demo实现
主要技术 spring boot + mybatis
pom.xml
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
数据库 DDL
create table user ( id int auto_increment primary key, username varchar(20) null );
核心代码
@Override
public Object intercept(Invocation invocation) throws Throwable {
logger.info("进入拦截器");
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
//获取参数
Object param = invocation.getArgs()[1];
BoundSql boundSql = mappedStatement.getBoundSql(param);
Object parameterObject = boundSql.getParameterObject();
/**
* 判断是否是继承PageVo来判断是否需要进行分页
*/
if (parameterObject instanceof PageVo) {
//强转 为了拿到分页数据
PageVo pagevo = (PageVo) param;
String sql = boundSql.getSql();
//获取相关配置
Configuration config = mappedStatement.getConfiguration();
Connection connection = config.getEnvironment().getDataSource().getConnection();
//拼接查询当前条件的sql的总条数
String countSql = "select count(*) from (" + sql + ") a";
PreparedStatement preparedStatement = connection.prepareStatement(countSql);
BoundSql countBoundSql = new BoundSql(config, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBoundSql);
parameterHandler.setParameters(preparedStatement);
//执行获得总条数
ResultSet rs = preparedStatement.executeQuery();
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
//拼接分页sql
String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset();
//重新执行新的sql
doNewSql(invocation, pageSql);
Object result = invocation.proceed();
connection.close();
//处理新的结构
PageResult<?> pageResult = new PageResult<List>(pagevo.page, pagevo.rows, count, (List) result);
List<PageResult> returnResultList = new ArrayList<>();
returnResultList.add(pageResult);
return returnResultList;
}
return invocation.proceed();
}
测试结果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下载)
总结
上一篇:Java中父类怎么调用子类的方法
栏 目:JAVA代码
下一篇:深入理解Maven环境搭建和介绍
本文标题:mybatis拦截器与分页插件实例教程
本文地址:http://www.codeinn.net/misctech/117344.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




