<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拦截器类似于Java的AOP(面向...
总结来说,MyBatis拦截器实现分页功能需要定义一个分页对象来存储分页参数,然后通过实现Interceptor接口并重写intercept方法来修改原始SQL语句,最后在MyBatis配置中正确注册拦截器。这样就可以在不侵入原有业务...
在这个主题中,我们将深入探讨如何利用MyBatis拦截器实现分页以及动态地修改SQL语句和参数值。 首先,我们关注的是"PaginationInterceptor.java",这是一个常见的分页拦截器实现。在MyBatis中,我们可以创建自定义...
【Mybatis拦截器实现分页】 在Mybatis框架中,拦截器是一种强大的工具,它允许我们在执行SQL之前或之后进行额外的操作,如日志记录、权限检查等。本篇文章将探讨如何使用Mybatis拦截器来实现高效且方便的分页功能。 ...
本文将详细介绍如何在SSM框架中结合拦截器实现分页功能。 首先,让我们理解SSM框架的组成部分: 1. **Spring**:负责管理应用的Bean,提供依赖注入(DI)以及面向切面编程(AOP)等功能。 2. **SpringMVC**:...
使用拦截器实现分页功能是一种常见的应用场景。下面是一个简单的分页插件示例: 假设我们想要实现一个基于`Executor`的分页拦截器,可以在`intercept`方法中修改SQL语句来添加分页条件。为了简化演示,我们将只关注...
通过上述步骤,我们就完成了Spring Boot和MyBatis环境下利用拦截器实现自动分页的功能。需要注意的是,这里的示例代码仅为简化版,实际应用中可能需要处理更复杂的情况,例如处理不同数据库的分页语法差异,以及优化...
Mybatis分页拦截器的核心工作原理是:在执行SQL查询时,拦截SQL语句,动态添加分页相关的SQL片段,如LIMIT或OFFSET等,然后执行改写后的SQL,从而实现分页效果。这种方式的好处在于保持了SQL的简洁性和可读性,同时...
在分页拦截器中,它会在执行查询之前对SQL进行修改,自动添加LIMIT和OFFSET子句,从而实现分页查询。 首先,我们要引入一个分页插件,例如PageHelper或者MyBatis-Plus。这两个都是广受欢迎的MyBatis分页插件,它们...
MyBatis拦截器及分页插件 ...例如,在查询数据库时,可以使用拦截器来实现分页的逻辑,从而提高查询效率。 MyBatis拦截器是一个非常强大的功能,它可以极大地扩展MyBatis的功能,使其更加灵活和强大。
MyBatis 分页拦截器是一种优化数据库操作的技术,它的主要目的是在不修改大量现有业务代码的情况下,实现对数据库查询结果的自动分页。在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会...
MyBatis拦截器分页是实现...通过这样的方式,我们就可以利用MyBatis拦截器实现动态的分页查询,而无需在每个Mapper接口或DAO层的实现中手动添加分页语句。这种解耦的设计使得代码更加简洁,同时也便于维护和扩展。
其中,`com.example.MyInterceptor`是你自定义的拦截器实现类,`logLevel`是传递给`setProperties`方法的属性名,`DEBUG`是其对应的值。 #### 1.5 Mybatis可拦截的方法 Mybatis提供了多种类型的对象可以被拦截,...
分页拦截器就是在执行SQL之前或之后,对SQL语句进行修改,添加必要的分页条件,从而实现分页查询。 下面我们将详细探讨MyBatis分页拦截器的实现原理: 1. **拦截器接口**:在MyBatis中,所有的拦截器都需要实现`...
综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...
如果使用MyBatis,可以自定义插件或使用第三方分页插件如PageHelper,通过拦截器实现分页功能。在Mapper接口中,定义一个返回Page对象的方法,并在XML配置文件中编写对应的SQL。 6. 分页优化 - 分页缓存:对于不...