`
Noudisan
  • 浏览: 12860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

拦截器实现分页

 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 一、配置mybastis插件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <plugins>
        <plugin interceptor="com.zhiyi.common.mybatis.SearchInterceptor" />
    </plugins>

    <mappers>
    </mappers>
</configuration>

 

 

二、mybatis连接器实现

 

import com.zhiyi.common.dto.PageSearchDto;
import org.apache.ibatis.executor.statement.PreparedStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Invocation;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.Properties;


public class SearchInterceptor implements Interceptor {


    public Object intercept(Invocation invocation) throws Throwable {
        return invocation.proceed();
    }

    public Object plugin(Object target) {
        Type[] interfaces = target.getClass().getGenericInterfaces();
        for (Type i : interfaces) {
            if (i.equals(StatementHandler.class)) {
                StatementHandler statementHandler = (StatementHandler) target;
                Field statementField = ReflectionUtils.findField(statementHandler.getClass(), "delegate");
                ReflectionUtils.makeAccessible(statementField);
                Object fieldInstance = ReflectionUtils.getField(statementField, statementHandler);

                Field mappedStatementField = ReflectionUtils.findField(fieldInstance.getClass(), "mappedStatement");
                ReflectionUtils.makeAccessible(mappedStatementField);

                MappedStatement mappedStatement = (MappedStatement) ReflectionUtils.getField(mappedStatementField, fieldInstance);

                if (mappedStatement.getSqlCommandType() == SqlCommandType.SELECT && fieldInstance.getClass().equals(PreparedStatementHandler.class)) {
                    PreparedStatementHandler preparedStatementHandler = (PreparedStatementHandler) fieldInstance;
                    BoundSql boundSql = preparedStatementHandler.getBoundSql();
                    if (boundSql.getParameterObject() != null &&
                            (boundSql.getParameterObject().getClass().getSuperclass().equals(PageSearchDto.class))
                            ) {
                        String additionalSql = null;
                        if (boundSql.getParameterObject().getClass().getSuperclass().equals(PageSearchDto.class)) {
                            PageSearchDto searchDto = (PageSearchDto) boundSql.getParameterObject();
                            if (searchDto.getTotalSize() == -1) {
                                return target;
                            }
                            additionalSql = searchDto.getPageableAndSortableSqlString();
                        }
                        String originalSql = boundSql.getSql();
                        Field sqlField = ReflectionUtils.findField(BoundSql.class, "sql");
                        ReflectionUtils.makeAccessible(sqlField);
                        ReflectionUtils.setField(sqlField, boundSql, originalSql + additionalSql);
                    }
                    return target;
                }
            }
        }
        return target;
    }

    @Override
    public void setProperties(Properties properties) {

    }


}

 

 

三、通过继承类方式实现

 

/**
 * mybatis拦截器 对应分页dto
 */
public class PageSearchDto extends SearchDto {

    //每页记录数
    protected int pageSize = 20;

    //当前第几页
    protected int currentPage = 1;

    //总记录数
    protected int totalSize;

    //总页数
    protected int totalPage;

    //排序字段
    protected List<String> sortColumn = new ArrayList<String>();

    protected List<String> sortDirection = new ArrayList<String>();

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public List<String> getSortColumn() {
        return sortColumn;
    }

    public void setSortColumn(List<String> sortColumn) {
        this.sortColumn = sortColumn;
    }

    public List<String> getSortDirection() {
        return sortDirection;
    }

    public int getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }

    public void setSortDirection(List<String> sortDirection) {
        this.sortDirection = sortDirection;
    }

    public void addSortCriteria(String property, String direction) {
        getSortColumn().add(property);
        getSortDirection().add(direction);
    }

    protected String getSortableSql() {
        if (getSortColumn().size() == 0) {
            return "";
        }
        StringBuilder stringBuilder = new StringBuilder(" order by ");
        for (int i = 0; i < sortColumn.size(); i++) {
            stringBuilder.append(sortColumn.get(i)).append(" " + sortDirection.get(i) + ", ");
        }
        return stringBuilder.substring(0, stringBuilder.length() - 2);
    }

    protected String getPageableSql() {
        StringBuilder stringBuilder = new StringBuilder("");
        if (currentPage <= 1 && pageSize != -1) {
            stringBuilder.append("limit ").append("0," + pageSize);
        } else if (currentPage > 1) {
            int start = (currentPage - 1) * pageSize;
            stringBuilder.append("limit ").append(start + "," + pageSize);
        }

        return stringBuilder.toString();
    }

    public void clearSort() {
        if (null != sortColumn) {
            sortColumn.clear();
        }
        if (null != sortDirection) {
            sortDirection.clear();
        }
    }

    public void resetPagination(int currentPage, int pageSize, String property, String direction) {
        this.clearSort();
        this.setCurrentPage(currentPage);
        this.setPageSize(pageSize);
        if (StringUtils.isNotBlank(property) || StringUtils.isNotBlank(direction)) {
            this.addSortCriteria(property, direction);
        }
    }

    public String getPageableAndSortableSqlString() {
        return getSortableSql() + " " + getPageableSql();
    }

    public int calTotalPage(int totalSize) {
        this.totalSize = totalSize;
        int page = totalSize / pageSize;
        this.totalPage = (totalSize % pageSize) == 0 ? page : page + 1;
        return totalPage;
    }

    //设置不分页
    public Object disablePaging() {
        this.setTotalSize(-1);
        return this;
    }

    public Object openPaging() {
        this.setTotalSize(0);
        return this;
    }
}

 

 

四、使用demo

 List<AdminSection> adminSections = adminSectionMapper.search(sectionSearchDto);
        List<AdminSectionDto> adminSectionDtos = PropertiesUtils.copyList(AdminSectionDto.class, adminSections);
        return new PageSearchResultDto<>(this.count(sectionSearchDto), adminSectionDtos);

 

分享到:
评论

相关推荐

    mybatis使用拦截器实现分页操作

    在本案例中,我们将探讨如何利用MyBatis的拦截器功能实现分页操作,以此来提高代码的复用性和可维护性。下面将详细阐述这一过程。 首先,我们需要了解MyBatis拦截器的基本概念。MyBatis拦截器类似于Java的AOP(面向...

    MyBatis拦截器实现分页功能的实现方法

    总结来说,MyBatis拦截器实现分页功能需要定义一个分页对象来存储分页参数,然后通过实现Interceptor接口并重写intercept方法来修改原始SQL语句,最后在MyBatis配置中正确注册拦截器。这样就可以在不侵入原有业务...

    MyBatis拦截器分页与动态修改SQL及其参数值

    在这个主题中,我们将深入探讨如何利用MyBatis拦截器实现分页以及动态地修改SQL语句和参数值。 首先,我们关注的是"PaginationInterceptor.java",这是一个常见的分页拦截器实现。在MyBatis中,我们可以创建自定义...

    Mybatis拦截器实现分页

    【Mybatis拦截器实现分页】 在Mybatis框架中,拦截器是一种强大的工具,它允许我们在执行SQL之前或之后进行额外的操作,如日志记录、权限检查等。本篇文章将探讨如何使用Mybatis拦截器来实现高效且方便的分页功能。 ...

    SSM+拦截器分页

    本文将详细介绍如何在SSM框架中结合拦截器实现分页功能。 首先,让我们理解SSM框架的组成部分: 1. **Spring**:负责管理应用的Bean,提供依赖注入(DI)以及面向切面编程(AOP)等功能。 2. **SpringMVC**:...

    Mybatis拦截器介绍及分页插件示例

    使用拦截器实现分页功能是一种常见的应用场景。下面是一个简单的分页插件示例: 假设我们想要实现一个基于`Executor`的分页拦截器,可以在`intercept`方法中修改SQL语句来添加分页条件。为了简化演示,我们将只关注...

    springboot+mybatis拦截器实现自动分页

    通过上述步骤,我们就完成了Spring Boot和MyBatis环境下利用拦截器实现自动分页的功能。需要注意的是,这里的示例代码仅为简化版,实际应用中可能需要处理更复杂的情况,例如处理不同数据库的分页语法差异,以及优化...

    Mybatis分页拦截器

    Mybatis分页拦截器的核心工作原理是:在执行SQL查询时,拦截SQL语句,动态添加分页相关的SQL片段,如LIMIT或OFFSET等,然后执行改写后的SQL,从而实现分页效果。这种方式的好处在于保持了SQL的简洁性和可读性,同时...

    mybatis 分页拦截器及拦截器配置

    在分页拦截器中,它会在执行查询之前对SQL进行修改,自动添加LIMIT和OFFSET子句,从而实现分页查询。 首先,我们要引入一个分页插件,例如PageHelper或者MyBatis-Plus。这两个都是广受欢迎的MyBatis分页插件,它们...

    MyBatis拦截器及分页插件

    MyBatis拦截器及分页插件 ...例如,在查询数据库时,可以使用拦截器来实现分页的逻辑,从而提高查询效率。 MyBatis拦截器是一个非常强大的功能,它可以极大地扩展MyBatis的功能,使其更加灵活和强大。

    mybatis分页拦截器(自动封装版)剖析.pdf

    MyBatis 分页拦截器是一种优化数据库操作的技术,它的主要目的是在不修改大量现有业务代码的情况下,实现对数据库查询结果的自动分页。在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会...

    MyBatis拦截器分页

    MyBatis拦截器分页是实现...通过这样的方式,我们就可以利用MyBatis拦截器实现动态的分页查询,而无需在每个Mapper接口或DAO层的实现中手动添加分页语句。这种解耦的设计使得代码更加简洁,同时也便于维护和扩展。

    Mybatis拦截器介绍及分页插件

    其中,`com.example.MyInterceptor`是你自定义的拦截器实现类,`logLevel`是传递给`setProperties`方法的属性名,`DEBUG`是其对应的值。 #### 1.5 Mybatis可拦截的方法 Mybatis提供了多种类型的对象可以被拦截,...

    mybatis分页拦截器

    分页拦截器就是在执行SQL之前或之后,对SQL语句进行修改,添加必要的分页条件,从而实现分页查询。 下面我们将详细探讨MyBatis分页拦截器的实现原理: 1. **拦截器接口**:在MyBatis中,所有的拦截器都需要实现`...

    spring+springMVC+mybatis拦截器分页 源码

    综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...

    javaee分页实现

    如果使用MyBatis,可以自定义插件或使用第三方分页插件如PageHelper,通过拦截器实现分页功能。在Mapper接口中,定义一个返回Page对象的方法,并在XML配置文件中编写对应的SQL。 6. 分页优化 - 分页缓存:对于不...

Global site tag (gtag.js) - Google Analytics