pagehelper联表分页查询_pagehelper如何指定子表-程序员宅基地

技术标签: spring boot  

(springboot2.0.1、pagehelper5.1.4)

pagehelper联表分页,会默认在sql语句的后面添加 limit ?,进行分页。如果是复杂的sql联表查询结果远远不能满足我们,添加 limit在我们想要的位置进行分页,下面的代码中“AS limitable”,为分页标识的sql. 末尾带有 AS limitable 的子查询会拼接上limit进行先分页.然后再外联查询

import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
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.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import com.github.pagehelper.Dialect;
import com.github.pagehelper.PageException;
import com.github.pagehelper.cache.Cache;
import com.github.pagehelper.cache.CacheFactory;
import com.github.pagehelper.util.MSUtils;
import com.github.pagehelper.util.StringUtil;


@SuppressWarnings({ "rawtypes", "unchecked" })
@Intercepts({
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class }),
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class }), })
public class MumuPageInterceptor implements Interceptor {
	//private static final Logger logger = LoggerFactory.getLogger(MumuPageInterceptor.class);

	// 缓存count查询的ms
	protected Cache<String, MappedStatement> msCountMap = null;
	private Dialect dialect;
	private String default_dialect_class = "com.github.pagehelper.PageHelper";
	private Field additionalParametersField;
	private String countSuffix = "_COUNT";

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		try {
			Object[] args = invocation.getArgs();
			MappedStatement ms = (MappedStatement) args[0];
			Object parameter = args[1];
			RowBounds rowBounds = (RowBounds) args[2];
			ResultHandler resultHandler = (ResultHandler) args[3];
			Executor executor = (Executor) invocation.getTarget();
			CacheKey cacheKey;
			BoundSql boundSql;
			// 由于逻辑关系,只会进入一次
			if (args.length == 4) {
				// 4 个参数时
				boundSql = ms.getBoundSql(parameter);
				cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
			} else {
				// 6 个参数时
				cacheKey = (CacheKey) args[4];
				boundSql = (BoundSql) args[5];
			}
			List resultList;
			// 调用方法判断是否需要进行分页&#
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianghaigui/article/details/104671316

智能推荐

C++使用CreateProcess执行cmd命令(实例演示)_c++ createprocess执行命令行语句-程序员宅基地

文章浏览阅读6.6k次。使用CreateProcess可以执行cmd命令,也可以执行一些可执行程序。//摘自msdn的示例代码#include #include #include void _tmain( int argc, TCHAR *argv[] ){ STARTUPINFO si; PROCESS_INFORMATION pi;_c++ createprocess执行命令行语句

解决 remote Support for password authentication was removed on August 13, 2021._remote: support for password authentication was re-程序员宅基地

文章浏览阅读2.2w次,点赞61次,收藏171次。解决 remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead._remote: support for password authentication was removed on august 13, 2021.

HDS拥抱HCI——注意,这指的可不是超融合基础设施-程序员宅基地

文章浏览阅读112次。HDS公司已经公布了日立内容智能方案(Hitachi Content Intelligence,简称HCI),这款软件专门负责立足于多种结构化与非结构化数据孤岛进行搜索与内容读取,随后对其加以分析。HDS公司指出,其可利用内容智能化方案解决输入数据井喷的问题HCI能够从各孤岛当中提取数据并将其引入工作流,从而通过多种方式加以处理。HCI的用户亦需..._hds hci

Keil C 里面Lib库文件的生成与调用-程序员宅基地

文章浏览阅读661次。源:Keil C 里面Lib库文件的生成与调用_keil 引用c lib

Install mysql-noinstall-5.1.32-win32.zip-程序员宅基地

文章浏览阅读250次。1.File: mysql-noinstall-5.1.32-win32.zip2.Add mysql service:%Mysql_HOME%\bin>mysqld --install mysql5.13.%Mysql_HOME%\bin>net start mysql 本文转自danni505 51CTO博客,原..._mysql-noinstall-5.1.55-win32

tp5.0安装-程序员宅基地

文章浏览阅读61次。2019独角兽企业重金招聘Python工程师标准>>> ..._tp5 topthink/framework

随便推点

java 导出excel接口,Angularjs,post请求后台poi导出excel的接口,excel中显示[Object object]...-程序员宅基地

文章浏览阅读1.5k次。Angularjs1.6对接后台导出Excel的接口,代码:$http({url: 'http://localhost:8083/console/devices/poi',method: "POST",data: {"email": "官方邮箱"},headers: {'Content-type': 'application/json'},responseType: 'arraybuffer'})..._excelwriter [object object]

python测试3_Python小测试_3-程序员宅基地

文章浏览阅读6k次。第二周A......1.用simpleguitk创建的应用程序框架是由哪三部分组成的?标题·控制区域鼠标边框·画布键盘·状态区域背景区域选择区域2.假设在程序中已经导入simpleguitk,下列哪项对create_frame()函数的调用是正确的?(如果不肯定你的答案,先在PyCharm中测试,然后再作答)·frame=simpleguitk.create_frame(100,100,1..._导入simpleguitk图形界面开发包的语句是?_____(小写)

java数据签名几种_java接口签名(Signature)实现方案续-程序员宅基地

文章浏览阅读1.4k次。v一、前言由于之前写过的一片文章 (java接口签名(Signature)实现方案)收获了很多好评,此次来说一下另一种简单粗暴的签名方案。相对于之前的签名方案,对body、paramenter、path variable的获取都做了简化的处理。也就是说这种方式针所有数据进行了签名,并不能指定某些数据进行签名。v二、签名规则1、线下分配appid和appsecret,针对不同的调用方分配不同的ap..._signature签名的方式

python 获取线程id_python多线程——获取子线程中的值-程序员宅基地

文章浏览阅读1.2k次。点击上方蓝色文字一键关注 点击上方“python学习专栏”,选择“置顶公众号”干货、福利第一时间送达!如何开启多线程?1、定义自己的函数2、加入线程3、启动线程4、等待线程结束看下面的代码from threading import Threadimporttime#定义一个函数,等待5秒后输出datadeffun():data = "123"time.sleep(5)print(data)..._python 获取子线程的变量值

RxJava + Retrofit + MVP(看完还不明白,吐槽我。适合初学者,VIP版MVP框架!!)_mvp+retrofit+rxjava-程序员宅基地

文章浏览阅读1.7k次。前言:还是因为公司特别闲,把基础总结总结。如果对相关知识含糊不清,会导致你无法随意扩展你想要的框架和功能。但是觉得作为程序员这行业,只要踏进来了,不是在学习的路上就是在被淘汰的路上,加油!!本文章将针对所有用户,大家根据自己的所需自行跳过一些章节。首先还是说说这个框架支持干一些什么事:支持所有网络请求类型,get,post,put…(废话了!!Retrofit已经干了所有事情)支持上传文件..._mvp+retrofit+rxjava

最简单的matlab程序,[求助]想利用MATLAB做一个最简单的杂波仿真程序,不知道有哪些专用函数啊?...-程序员宅基地

文章浏览阅读215次。回复: [求助]想利用MATLAB做一个最简单的杂波仿真程序,不知道有哪些专用函数啊? clear all;close all;clcazi_num=2000;fr=1000;lamda0=0.05;sigmav=0.7;sigmaf=2*sigmav/lamda0;% rand(‘state’,sum(100*clock));d1=rand(1,azi_num);% rand(‘stat..._matlab 对整流器加杂波

推荐文章

热门文章

相关标签