首页 > 其他分享 >PageHelper用法示例(mybatis分页查询插件)

PageHelper用法示例(mybatis分页查询插件)

时间:2023-10-08 11:00:50浏览次数:49  
标签:插件 查询 分页 示例 t2 DATABASEID PageHelper t1 pipelineVo

1.情景展示

在实际开发过程中,分页查询是最常见,也是使用频率最高的数据查询。

分页查询,如果我们进行手动在xml当中写SQL的话,起码要写两个SQL。一个是分页,一个是查询数据总数。

问题在于:这样做,会提高我们的工作量,而且这些也是很繁琐的过程。

能不能让我们只关注查询业务(查询SQL),而不用管理分页,让这部分代码进行自动化呢?

2.具体分析

我们可以通过PageHelper来解决这个问题。

pagehelper是mybatis的一个插件,其作用是更加方便地进行分页查询。

3.解决方案

准备工作

如果是springboot项目,需要引入以下jar包。

<!-- 分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.1</version>
</dependency>

非springboot项目,引入下面jar包。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.0.0</version>
</dependency>

并需:添加以下信息到xml当中

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

说明:在实际引入的时候,可以将插件版本号改成最新的。

启用PageHelper插件

#pagehelper分页插件配置
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql

Mapper.xml(mybatis+mysql)

<resultMap id="PipelineResultMap" type="com.xyhsoft.mi.link.api.domain.FlinkDataPipeline">
    <id property="pipelineid" column="PIPELINEID" jdbcType="BIGINT"/>
    <result property="pipelinename" column="PIPELINENAME" jdbcType="VARCHAR"/>
    <result property="databaseidSource" column="DATABASEID_SOURCE" jdbcType="BIGINT"/>
    <result property="readtype" column="READTYPE" jdbcType="VARCHAR"/>
    <result property="synctype" column="SYNCTYPE" jdbcType="VARCHAR"/>
    <result property="synctable" column="SYNCTABLE" jdbcType="VARCHAR"/>
    <result property="databaseidTarget" column="DATABASEID_TARGET" jdbcType="BIGINT"/>
    <result property="databasnameTarget" column="DATABASNAME_TARGET" jdbcType="VARCHAR"/>
    <result property="dataDelete" column="DATA_DELETE" jdbcType="VARCHAR"/>
    <result property="syncTimestamp" column="SYNC_TIMESTAMP" jdbcType="VARCHAR"/>
    <result property="syncTableupdate" column="SYNC_TABLEUPDATE" jdbcType="VARCHAR"/>
    <result property="dirtyDatanum" column="DIRTY_DATANUM" jdbcType="BIGINT"/>
    <result property="failTry" column="FAIL_TRY" jdbcType="VARCHAR"/>
    <result property="resuleNote" column="RESULE_NOTE" jdbcType="VARCHAR"/>
    <result property="status" column="STATUS" jdbcType="VARCHAR"/>
    <result property="createtime" column="CREATETIME" jdbcType="TIMESTAMP"/>
    <result property="databasenameSource" column="DATABASENAME" jdbcType="VARCHAR"/>
</resultMap>

<sql id="FlinkDataPipeline_Column_List">
    t1.PIPELINEID,t1.PIPELINENAME,t1.DATABASEID_SOURCE,
    t1.READTYPE,t1.SYNCTYPE,t1.SYNCTABLE,
    t1.DATABASEID_TARGET,t1.DATABASNAME_TARGET,t1.DATA_DELETE,
    t1.SYNC_TIMESTAMP,t1.SYNC_TABLEUPDATE,t1.DIRTY_DATANUM,
    t1.FAIL_TRY,t1.RESULE_NOTE,t1.STATUS,
    t1.CREATETIME
</sql>

说明:为了保持代码的完整性,才展示了上述代码。

在此,我们只需关注下面的select标签内容即可。

<select id="getFlinkDataPipeline" parameterType="com.mysoft.mi.link.api.vo.FlinkDataPipelineVo" resultMap="PipelineResultMap">
    select
        <include refid="FlinkDataPipeline_Column_List"></include>,
        t2.DATABASENAME
    from flink_data_pipeline t1, flink_database t2
    where t2.DATABASEID = t1.DATABASEID_SOURCE
    <if test="pipelineid != null and pipelineid != ''">
        and t1.pipelineid = #{pipelineid}
    </if>
    <if test="pipelinename != null and pipelinename != ''">
        and t1.pipelinename like concat('%', #{pipelinename}, '%')
    </if>
    order by t1.CREATETIME desc
</select>

这就是一个普通的两表关联查询语句。 

Mapper层(Dao层) 

List<FlinkDataPipeline> getFlinkDataPipeline(FlinkDataPipelineVo pipelineVo);

说明:方法名必须和select标签的id值保持一致。 

业务层(Bo层) 

@Override
public PageList<FlinkDataPipeline> getPageList(FlinkDataPipelineVo pipelineVo) {
    // 进行分页
    // PageHelper.startPage(null == pipelineVo.getPageIndex() ? 1 : pipelineVo.getPageIndex(), null == pipelineVo.getPageSize() ? 15 : pipelineVo.getPageSize());
    PageHelper.startPage(pipelineVo.getPageIndex(), pipelineVo.getPageSize());
    // 注意:只有紧跟着PageHelper.startPage(pageNum,pageSize)的sql语句才被pagehelper起作用
    List<FlinkDataPipeline> metaDatabaseList = pipelineMapper.getFlinkDataPipeline(pipelineVo);

    PageInfo<FlinkDataPipeline> pageInfo = new PageInfo<>(metaDatabaseList);
    return new PageList<>(pageInfo.getTotal(), pageInfo.getList());
}

说明:这一块是核心代码。

第一步:确定分页内容(第几页,每页大小)。

PageHelper.startPage(null == pipelineVo.getPageIndex() ? 1 : pipelineVo.getPageIndex(), null == pipelineVo.getPageSize() ? 15 : pipelineVo.getPageSize());

第二步:通过Mapper接口调用查询语句。

List<FlinkDataPipeline> metaDatabaseList = pipelineMapper.getFlinkDataPipeline(pipelineVo);

注意:需要分页的查询语句必须紧跟第一步的分页代码,另外,第一步和第二步顺序不能颠倒。

否则,该查询语句将不会进行分页,查询的将是所有数据。 

第三步:将返回的List塞到PageInfo对象当中。

PageInfo<FlinkDataPipeline> pageInfo = new PageInfo<>(metaDatabaseList);

第四步:拿到分页后的数据或者塞到PageList对象当中。

pageInfo.getList();

或者

return new PageList<>(pageInfo.getTotal(), pageInfo.getList());

控制层(Controller层)

@ApiOperation(value = "分页查询管道列表", notes = "分页查询管道列表", httpMethod = "GET")
@GetMapping(value = "/getPipelineList", produces = {"application/json;charset=UTF-8"})
public PageList<FlinkDataPipeline> getPipelineList(@ApiParam(value = "管道名称", required = false, example = "管道1")
                                                   @RequestParam(required = false) String pipelinename,
                                                   @ApiParam(value = "第几页", required = false, example = "1")
                                                   @Pattern(regexp = "^$|^[1-9]\\d*$", message = "pageIndex可为空或正整数")
                                                   @RequestParam(required = false) String pageIndex,
                                                   @Pattern(regexp = "^$|^[1-9]\\d*$", message = "pageIndex可为空或正整数")
                                                   @ApiParam(value = "每页展示几条", required = false, example = "15")
                                                   @RequestParam(required = false) String pageSize){

    FlinkDataPipelineVo pipelineVo = FlinkDataPipelineVo.builder().build()
            .setPipelinename(pipelinename)
            .setPageIndex(null == pageIndex ? 1 : Integer.parseInt(pageIndex)) //默认1
            .setPageSize(null == pageSize ? 15 : Integer.parseInt(pageSize)) //默认15
            ;

    return pipelineService.getPageList(pipelineVo);
}

效果展示 

控制台输出

查看代码
 Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c73fb24]
JDBC Connection [HikariProxyConnection@140049083 wrapping com.mysql.cj.jdbc.ConnectionImpl@5475ef4e] will be managed by Spring
==>  Preparing: SELECT count(0) FROM flink_data_pipeline t1, flink_database t2 WHERE t2.DATABASEID = t1.DATABASEID_SOURCE
==> Parameters: 
<==    Columns: count(0)
<==        Row: 7
<==      Total: 1
==>  Preparing: select t1.PIPELINEID,t1.PIPELINENAME,t1.DATABASEID_SOURCE, t1.READTYPE,t1.SYNCTYPE,t1.SYNCTABLE, t1.DATABASEID_TARGET,t1.DATABASNAME_TARGET,t1.DATA_DELETE, t1.SYNC_TIMESTAMP,t1.SYNC_TABLEUPDATE,t1.DIRTY_DATANUM, t1.FAIL_TRY,t1.RESULE_NOTE,t1.STATUS, t1.CREATETIME , t2.DATABASENAME from flink_data_pipeline t1, flink_database t2 where t2.DATABASEID = t1.DATABASEID_SOURCE order by t1.CREATETIME desc LIMIT ?
==> Parameters: 15(Integer)
<==    Columns: PIPELINEID, PIPELINENAME, DATABASEID_SOURCE, READTYPE, SYNCTYPE, SYNCTABLE, DATABASEID_TARGET, DATABASNAME_TARGET, DATA_DELETE, SYNC_TIMESTAMP, SYNC_TABLEUPDATE, DIRTY_DATANUM, FAIL_TRY, RESULE_NOTE, STATUS, CREATETIME, DATABASENAME
<==        Row: 46, task, 39, 1, 1, base_ac_user, 39, 数据中台, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:33:48, medi_data_cent
<==        Row: 45, quyu, 42, 1, 1, qycf_info, 42, 区域处方, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:31:56, qycf
<==        Row: 44, task, 39, 1, 1, meta_databases, 39, 数据中台, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:28:51, medi_data_cent
<==        Row: 43, aaa, 39, 1, 1, meta_theme, 39, 数据中台, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:27:21, medi_data_cent
<==        Row: 42, aa, 39, 1, 1, act_ge_bytearray, 42, qycf, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:16:28, medi_data_cent
<==        Row: 41, task, 39, 1, 1, meta_theme_copy, 39, medi_data_cent, 1, 0, 0, 1000, 0, 0, 1, 2023-10-08 10:00:59, medi_data_cent
<==        Row: 40, a, 39, 1, 1, act_evt_log, 42, qycf, 1, 0, 0, 1000, 0, 0, 1, 2023-10-07 17:43:48, medi_data_cent
<==      Total: 7
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c73fb24]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c73fb24]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c73fb24]

最终返回的PageList的数据格式,示例:

{
    "total": 7,
    "list": [
      {
        "pipelineid": 46,
        "pipelinename": "task",
        "databaseidSource": 39,
        "readtype": "1",
        "synctype": "1",
        "synctable": "base_ac_user",
        "databaseidTarget": 39,
        "databasnameTarget": "数据中台",
        "dataDelete": "1",
        "syncTimestamp": "0",
        "syncTableupdate": "0",
        "dirtyDatanum": 1000,
        "failTry": "0",
        "resuleNote": "0",
        "status": "1",
        "createtime": 1696732428000,
        "databasenameSource": "medi_data_cent"
      },
      {
        "pipelineid": 45,
        "pipelinename": "quyu",
        "databaseidSource": 42,
        "readtype": "1",
        "synctype": "1",
        "synctable": "qycf_info",
        "databaseidTarget": 42,
        "databasnameTarget": "区域处方",
        "dataDelete": "1",
        "syncTimestamp": "0",
        "syncTableupdate": "0",
        "dirtyDatanum": 1000,
        "failTry": "0",
        "resuleNote": "0",
        "status": "1",
        "createtime": 1696732316000,
        "databasenameSource": "qycf"
      }
    ]
}

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

标签:插件,查询,分页,示例,t2,DATABASEID,PageHelper,t1,pipelineVo
From: https://www.cnblogs.com/Marydon20170307/p/17748387.html

相关文章

  • FreeRTOS入门教程(队列详细使用示例)
    (文章目录)前言上篇文章我们已经讲解了队列的概念和队列相关的API函数,那么本篇文章的话就开始带大家来学习使用队列。一、队列基本使用这个例子将会创建三个任务,其中两个任务用来发送数据到队列中,另一个任务用来从队列中读取数据。voidTask1Function(void*param){ intv......
  • golang实现一个简单的文件浏览下载功能代码示例
    想省事用Claude(一个依托chatgpt的AI)生成一段golang的文件浏览下载示例,结果给生成的代码大概是这样的(省去了无关部分,主要部分如下):http.HandleFunc("/*",downloadFile)http.HandleFunc("/",showFileList)测试之后,结果发现每次都会走到“/”下去,无论如何都不会......
  • wordpress 编写插件实现自动汇总超链接
    背景写长篇文章时,文章内容可能会引用了很多外站的超链接。事后我再来翻阅文章,找到想要的超链很吃力。尝试过在插件商城寻找现有的插件,都不太令人满意。因为需求其实很简单:将文章内容中出现过的超链接,汇总展示在文章的末尾,类似论文的引用文献。‍实施将如下代码,放在wordpres......
  • Jmeter之plugins插件安装
    1.下载配置下载插件JMeterPluginsManager:https://jmeter-plugins.org/wiki/PluginsManager/下载JAR包并放至apache-jmeter-5.4.1\lib\ext路径下:2.PluginsManager查看已安装或可安装的插件信息(1)打开jmeter选项下增加PluginsManager选项:(在该选项下增加插件需要联网)(2)打......
  • 20款VS Code实用插件推荐
    思维导航前言VSCode相关链接地址VSCode拓展插件安装适用于VSCode的中文(简体)语言包VSCodeC#开发工具包VisualStudio代码的图标TabNine代码补全工具CopilotAI辅助编程工具自动添加关闭标签VsCode最好的代码注释扩展插查找并修复JavaScript代码中的问题Vs......
  • [知识管理] Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云)的同步方案
    0序言在几经选择、对比之后,我选择:Obsidian+RemotelySave插件+第三方存储/OSS(七牛云)的方案来搭建自己的【知识管理系统】。对比分析知识管理工具的过程,详情参见:[知识管理]个人知识管理之知识管理工具的全面分析-博客园/千千寰宇【推荐】知识管理与数据管理系......
  • 【HBuilderX】解决黑色主题中的注释颜色太浅的问题(代码示例)
    "foreground":"#a6a085"打开后,搜索Comment,修改,一个是//的颜色,一个是注释内容的颜色{ "name":"Comment", "scope":"comment", "settings":{ "foreground":"#a6a085" } }, {......
  • 为什么我建议你趁早试试这款项目代码统计 IDEA 插件—— Statistic
    前言编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面。很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长、一个方法的代码有多长。因此,我们经常会碰到让自己想要骂街的项目,不过,说真的,你自己写的代码也有极大可能被......
  • 安卓开发组件开发示例
    系统原生下拉刷新<androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh_layout"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://sc......
  • 微软写了份GPT-4V说明书:166页详细讲解,提示词demo示例全都有
    克雷西萧箫发自凹非寺量子位公众号QbitAI多模态王炸大模型GPT-4V,166页“说明书”重磅发布!而且还是微软团队出品。什么样的论文,能写出166页?不仅详细测评了GPT-4V在十大任务上的表现,从基础的图像识别、到复杂的逻辑推理都有展示;还传授了一整套......