当前位置: 首页 > news >正文

sql2java-pagehelper:参照Mybatis-PageHelper实现分页查询

sql2java是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供分页查询功能,于是我参照Mybatis-PageHelper并借用其外部数据格式为sql2java实现的分页功能,将其封装为一个sql2java子项目sqlj2ava-pagehelper。使用方式与Mybatis-Pagehelper基本一致。

基本原理

PageHelper的基本原理是应用层通过调用PageHelper.startPage方法在一个静态全局的线程局部变量(ThreadLocal)中保存分页查询的标志及相关的数据(参见gu.sql2java.pagehelper.Page,参见gu.sql2java.pagehelper.PageHelper 的getLocalPage,setLocalPage方法),这样就激活了分页查询功能,

sql2java底层在执行SELECT查询语句时会根据保存在ThreadLocal中的Page对象为应用层提供的SELECT语句自动拼接分页查询语法。如果当前线程的ThreadLocal变量中没有Page对象或Page.enable字段为false那么就是普通的SQL查询。

引入依赖

maven下引入sql2java-pagehelper项目依赖

		<dependency>
			<groupId>com.gitee.com</groupId>
			<artifactId>sql2java-pagehelper</artifactId>
			<version>3.11.1</version>
		</dependency>

调用示例

调用示例如下:

import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;

import gu.sql2java.Managers;
import gu.sql2java.Managers.Module;
import gu.sql2java.pagehelper.Page;
import gu.sql2java.pagehelper.PageHelper;
import gu.sql2java.pagehelper.PageInfo;
import net.facelib.eam.devicecenter.db.DeviceBean;
import static net.facelib.eam.devicecenter.DaoManagement.DM;
import static net.gdface.utils.SimpleLog.log;

public class PageHelperTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
        // 输出调试信息
		Managers.setDebug(true, Module.BASETABLEMANAGER);
	}
	@SuppressWarnings({ "rawtypes", "resource" })
	@Test
	public void test1LoadByWhere() {
		try {
			// 启动分页查询
			PageHelper.startPage(1, 2);
			 // 正常执行sql2java的SQL查询
			List<DeviceBean> devices = DM.daoLoadDeviceByWhere("WHERE id>0 order by id", 1, -1);
			PageInfo<DeviceBean> pageInfo = PageInfo.of(devices);
			log("pageInfo {}",pageInfo);			
		} finally {
			// 删除ThreadLocal变量
			PageHelper.clearPage();
		} 
	}
}

暂时禁用PageHelper

根据《基本原理》一节中的说明我们知道,PageHelper是依赖线程局部变量(ThreadLocal)来标记是否启动分页查询的。ThreadLocal变量作用于当前线程。当分页查询启动时,在当前线程中调用sql2java的任何SELECT查询都会被视为分页查询。

而在现实的场景中,我们实现一个提供分页查询的服务方法时,有可能往往不会只执行一次SELECT查询就能返回需要的需要数据,有可能在执行主要的分页查询获取数据后还要执行其他的正常查询,在多次查询的结果基础组装用户需要的数据。所以这里就存在分页查询激活的状态下,分页查询和普通查询混合调用。

如果在调用时不加以区分,sql2java会将所有我们希望执行的普通查询都以分页查询对待,那么返回的结果肯定是不对的。

为了能在分页查询激活的状态下,实现执行普通查询。从3.11.1版本起,gu.sql2java.SqlRunner接口(TableManager继承了此接口)增加了runWithNoPage(Callable),runWithNoPage(Runnable)方法,为应用层提供了在分页查询激活的状态下,临时禁用分页查询,执行普通查询的简单方式.

示例如下:

/** 暂时禁用分页查询执行 loadUsingTemplateAsList */        
List<B> beans = deviceManager.runWithNoPage(()->deviceManager.loadUsingTemplateAsList(bean));

@Sql2javaEnablePage注解

gu.sql2java.pagehelper.annotations.Sql2javaEnablePage 是用于服务方法上启动分页查询的注解类。

注解类字段说明如下

字段名默认值默认字段定义值说明
valuetruetrue启用分页查询
pageNumKey"pageNum"1HTTP请求中定义pageNum(页码参数,1-based)的属性名
pageSizeKey"pageSize"10HTTP请求中定义pageSize(每页数量)的属性名
countKey"count"HTTP请求中定义count(是否进行count查询,默认true)的属性名
countColumnKey“countColumn”“0”HTTP请求中定义count查询的字段名的属性名,如果不定义则默认字段名为"0"

相关文章:

  • 质量平台-sonarlint-idea本地配置及使用技巧
  • ansible入门
  • 表单的语法及属性(form)
  • Vue中的方法和事件绑定
  • 阿里首席架构师谈微服务:入门到实战架构
  • 一幅长文细学算法(一)——C++STL
  • 键盘切换不出中文输入法的解决方法
  • 集合的父亲之collection----(单列集合顶级接口)和遍历方式
  • Harbor安装(待补充)
  • python基础(二、基础语法)
  • YOLO系列之yolov2解读(2)
  • 【一生一芯】Chap.0 IC常用网站论坛门户 如何提出一个技术问题 并尝试解决 | 提问的智慧
  • 攻防世界WEB练习-fileclude
  • Mybatis实战练习四【单个条件(动态SQL)添加数据】
  • 国赛高教杯使用python/matlab必会基础数学建模-数据处理模块(课程4)
  • [case10]使用RSQL实现端到端的动态查询
  • angular2开源库收集
  • echarts的各种常用效果展示
  • ECS应用管理最佳实践
  • Flex布局到底解决了什么问题
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript对象详解
  • JWT究竟是什么呢?
  • Linux CTF 逆向入门
  • mockjs让前端开发独立于后端
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP面试之三:MySQL数据库
  • scala基础语法(二)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring security oauth2 password授权模式
  • vagrant 添加本地 box 安装 laravel homestead
  • vue 个人积累(使用工具,组件)
  • Webpack 4x 之路 ( 四 )
  • 初探 Vue 生命周期和钩子函数
  • 从零开始的无人驾驶 1
  • 大数据与云计算学习:数据分析(二)
  • 订阅Forge Viewer所有的事件
  • 多线程 start 和 run 方法到底有什么区别?
  • 使用API自动生成工具优化前端工作流
  • 小程序开发之路(一)
  • 学习ES6 变量的解构赋值
  • 因为阿里,他们成了“杭漂”
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • (力扣题库)跳跃游戏II(c++)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)【Hibernate总结系列】使用举例
  • (转)C#调用WebService 基础
  • (转)fock函数详解
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)OpenStack Hacker养成指南