• 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.PageHelpergetLocalPage,setLocalPage方法),这样就激活了分页查询功能,

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

    引入依赖

    maven下引入sql2java-pagehelper项目依赖

    		<dependency>
    			<groupId>com.gitee.comgroupId>
    			<artifactId>sql2java-pagehelperartifactId>
    			<version>3.11.1version>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    调用示例

    调用示例如下:

    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();
    		} 
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    暂时禁用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));
    
    • 1
    • 2

    @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"
  • 相关阅读:
    什么专业最适合学网络安全?一篇文章告诉你
    “errcode“:40164,“errmsg“:“invalid ip ...微信公众号开发调用失败的解决办法
    javaweb电脑销售管理系统的设计
    IDEA搭建SSM框架【配置类、新手向】
    中秋学习Qt6
    计算机毕业设计微信小程序开发项目源代码ssm超市购物系统小程序+后台管理系统|前后分离VUE[包运行成功]
    网络安全(黑客技术)自学笔记
    神经网络系列---独热编码(One-Hot Encoding)
    EDU实战-SQL注入漏洞
    [项目管理-13]:项目经理的困惑:为什么有些项目亏钱,项目还要做?
  • 原文地址:https://blog.csdn.net/10km/article/details/126606587