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

 更新时间:2019年04月04日 09:16:42   作者:五头牛  
Mybatis拦截器常常会被用来进行分页处理。所以下面这篇文章主要给大家介绍了关于mybatis拦截器与分页插件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用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 (本地下载

总结

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

相关文章

  • Spring Cloud Gateway入门解读

    Spring Cloud Gateway入门解读

    本篇文章主要介绍了Spring Cloud Gateway入门解读,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 全面解析Java中的HashMap类

    全面解析Java中的HashMap类

    HashMap类为Java提供了键值对应的map类型,本文将从源码角度全面解析Java中的HashMap类,同时包括其各种常用操作方法等,欢迎参考与借鉴
    2016-05-05
  • sharding-jdbc中的事务详细解读

    sharding-jdbc中的事务详细解读

    这篇文章主要介绍了sharding-jdbc中的事务详细解读,sharding-jdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来,需要的朋友可以参考下
    2023-12-12
  • 解决mybatis-plus自动配置的mapper.xml与java接口映射问题

    解决mybatis-plus自动配置的mapper.xml与java接口映射问题

    这篇文章主要介绍了解决mybatis-plus自动配置的mapper.xml与java接口映射问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Maven离线模式打包全过程

    Maven离线模式打包全过程

    这篇文章主要介绍了Maven离线模式打包全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 金三银四复工高频面试题java算法LeetCode396旋转函数

    金三银四复工高频面试题java算法LeetCode396旋转函数

    这篇文章主要为大家介绍了金三银四复工高频面试题之java算法题解LeetCode396旋转函数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 简单理解Java的垃圾回收机制与finalize方法的作用

    简单理解Java的垃圾回收机制与finalize方法的作用

    这篇文章主要介绍了简单理解Java的垃圾回收机制与finalize方法的作用,着重讲解了Java的GC销毁对象的过程,需要的朋友可以参考下
    2015-11-11
  • Java Lambda表达式详解和实例

    Java Lambda表达式详解和实例

    这篇文章主要介绍了Java Lambda表达式详细介绍,从简单的到复杂的实例讲解,需要的朋友可以参考下
    2014-05-05
  • java字符串中${}或者{}等的占位符替换工具类

    java字符串中${}或者{}等的占位符替换工具类

    今天小编就为大家分享一篇关于java字符串中${}或者{}等的占位符替换工具类,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java正则匹配中文的方法实例分析

    Java正则匹配中文的方法实例分析

    这篇文章主要介绍了Java正则匹配中文的方法,结合实例形式分析了Java针对中文、标点及引号等匹配操作相关技巧,需要的朋友可以参考下
    2017-03-03

最新评论