一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Springboot使用mybatis实现拦截SQL分页代码示例

时间:2020-06-18 编辑:袖梨 来源:一聚教程网

本篇文章小编给大家分享一下Springboot使用mybatis实现拦截SQL分页代码示例,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

新建一个类MyPageInterceptor.java(注意在springboot中要添加注解@Component)

package com.grand.p1upgrade.mapper.test;

import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

@Component
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
public class MyPageInterceptor implements Interceptor {
  
  private int page;
  private int size;
  @SuppressWarnings("unused")
  private String dbType;
 
  @SuppressWarnings("unchecked")
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    System.out.println("plugin is running...");
    StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
    MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
    while(metaObject.hasGetter("h")){
      Object object = metaObject.getValue("h");
      metaObject = SystemMetaObject.forObject(object);
    }
    while(metaObject.hasGetter("target")){
      Object object = metaObject.getValue("target");
      metaObject = SystemMetaObject.forObject(object);
    }
    MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
    String mapId = mappedStatement.getId();
    if(mapId.matches(".+ByPager$")){
      ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
      Map params = (Map)parameterHandler.getParameterObject();
      page = (int)params.get("page");
      size = (int)params.get("size");
      String sql = (String) metaObject.getValue("delegate.boundSql.sql");
      sql += " limit "+(page-1)*size +","+size;
      metaObject.setValue("delegate.boundSql.sql", sql);
    }
    return invocation.proceed();
  }
 
  @Override
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
 
  @Override
  public void setProperties(Properties properties) {
    String limit = properties.getProperty("limit","10");
    this.page = Integer.parseInt(limit);
    this.dbType = properties.getProperty("dbType", "mysql");
  }
 
}

添加测试TestMapper.java

package com.grand.p1upgrade.mapper.test;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TestMapper {
  public List> findByPager(Map params);
  public long count();
}

TestMapper.xml





  
  

在调用TestMapper.findByPager传递参数的时候将page和size传入即可

热门栏目