mybatis拦截器与分页插件实例教程

网友投稿 254 2023-01-09


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 interfaKBmfCdce Interceptor {

Object intercept(Invocation invocation) throws Throwable;

Object plugin(Object target);

void setProperties(Properties properties);

}

demo实现

主要技术 spring boot + mybatis

pom.xml

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

mysql

mysql-connector-java

runtime

数据库 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, countBouKBmfCdndSql);

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(pagevo.page, pagevo.rows, count, (List) result);

List returnResultList = new ArrayList<>();

returnResultList.add(pageResult);

return returnResultList;

}

return invocation.proceed();

}

测试结果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化接口测试脚本(自动化测试脚本实例)
下一篇:自动化接口测试简历(自动化接口测试面试)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~