zoukankan      html  css  js  c++  java
  • 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<String, Object> params = (Map<String, Object>)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<Map<String,Object>> findByPager(Map<String, Object> params);
        public long count();
    }

    TestMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.grand.p1upgrade.mapper.test.TestMapper">
    
        <select id="findByPager" resultType="java.util.HashMap">
            select * from p1project.sys_user
        </select>
        <select id="count" resultType="long">
            select count(1) from p1project.sys_user
        </select>
    
       
    </mapper>

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

  • 相关阅读:
    SQL SERVER列转换行及UNPIVOT
    25.元素,元素内容和元素属性 Walker
    16.开发工具介绍 Walker
    13.前后端程序浅解 Walker
    21.创建标准的html文件 Walker
    15.html和html5 Walker
    24.代码注释 Walker
    22.文档的基本结构 Walker
    23.单标签和双标签 Walker
    26.代码书写规范 Walker
  • 原文地址:https://www.cnblogs.com/TheoryDance/p/12363935.html
Copyright © 2011-2022 走看看