Mybatis分页查询案例

news2024/11/25 6:59:34

前言

今天再写项目时刚好碰到Mybatis分页查询展示数据,现将实现过程整理出来以便后续再碰到类似需求回来瞅一眼。

数据准备

1、数据库表(user_info)

在这里插入图片描述

在这里插入图片描述

2、前端页面

在这里插入图片描述

代码实现

1、User实体类

package com.liming.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import java.util.Date;

/**
 * user_info表的实体类:
 */
@Data
@ToString
public class User {

	private int userId;//用户id

	private String userCode;//账号

	private String userName;//用户名

	private String userPwd;//用户密码

	private String userType;//用户类型

	private String userState;//用户状态

	private String isDelete;//删除状态

	private int createBy;//创建人

	//返回前端时,自动将Date转换成指定格式的json字符串
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
	private Date createTime;//创建时间

	private int updateBy;//修改人

	private Date updateTime;//修改时间

	// 自定义属性,数据库没有该字段
	private String getCode;

	public User() {

	}

	public User(int userId, String userCode, String userName, String userPwd,
			String userType, String userState, String isDelete, int createBy,
			Date createTime, int updateBy, Date updateTime) {
		this.userId = userId;
		this.userCode = userCode;
		this.userName = userName;
		this.userPwd = userPwd;
		this.userType = userType;
		this.userState = userState;
		this.isDelete = isDelete;
		this.createBy = createBy;
		this.createTime = createTime;
		this.updateBy = updateBy;
		this.updateTime = updateTime;
	}
}

page实体类

package com.liming.page;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.List;

/**
 * 分页信息实体类
 *
 * @author 黎明
 * @version 1.0
 * @date 2023/8/7 16:02
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Page {

    //当前页码
    private Integer pageNum;

    //每页显示行数
    private Integer pageSize;

    //总行数
    private Integer totalNum;

    //总页数
    private Integer pageCount;

    //limit函数参数一每页起始行(起始索引)
    private Integer limitIndex;

    //存储当前页查询到的数据的List<?>集合
    private List<?> resultList;

    //计算总页数
    public Integer getPageCount() {
        return totalNum % pageSize == 0 ? totalNum / pageSize : totalNum / pageSize + 1;
    }

    //计算limit函数参数一每页起始行
    public Integer getLimitIndex() {
        return pageSize * (pageNum - 1);
    }
}

2、UserMapper

package com.liming.mapper;

import com.liming.page.Page;
import com.liming.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * user_info mapper接口
 *
 * @author 黎明
 * @version 1.0
 * @date 2023/7/23 21:04
 */
public interface UserMapper {

    /**
     * 查询用户总行数的方法
     *
     * @param user 分页的选择条件
     * @return 总记录数
     */
    public Integer selectUserCount(User user);

    /**
     * 分页查询用户的方法
     *
     * @param page 分页对象
     * @param user 分页的选择条件
     * @return 当前页用户信息
     */
    public List<User> selectUserPage(@Param("page") Page page,@Param("user") User user);
}

3、UserMapper映射文件

<!--查询用户总行数的方法-->
<select id="selectUserCount" resultType="integer">
     select count(*)
     from user_info
     <where>
         <if test="userCode != null and userCode != ''">
             and user_code like "%"#{userCode}"%"
         </if>
         <if test="userType != null and userType != ''">
             and user_type = #{userType}
         </if>
         <if test="userState != null and userState != ''">
            and user_state = #{userState}
         </if>
         and is_delete = 0
     </where>
 </select>
 <!--分页查询用户的方法-->
 <select id="selectUserPage" resultType="user">
     select t1.*,t2.user_code as getCode
     from user_info t1,
          user_info t2
     <where>
         and t1.create_by = t2.user_id
         <if test="user.userCode != null and user.userCode != ''">
             and  t1.user_code like "%"#{userCode}"%"
         </if>
         <if test="user.userType != null and user.userType != ''">
	and t1.user_type = #{user.userType}
		</if>
		<if test="user.userState != null and user.userState != ''">
			and t1.user_state = #{user.userState}
		</if>
		and t1.is_delete = 0
     </where>
     limit #{page.limitIndex},#{page.pageSize}
 </select>

4、UserService

package com.liming.service;

import com.liming.page.Page;
import com.liming.pojo.User;

/**
 * user_info的service接口
 * @author 黎明
 * @date 2023/8/7 17:06
 * @version 1.0
 */
public interface UserService {

    // 分页查询用户的业务方法
    public abstract Page queryUserPage(Page page,User user);
}

5、UserServiceImpl

/**
 * 分页查询用户的业务方法
 *
 * @param page page对象
 * @param user 条件
 * @return page对象
 */
@Override
public Page queryUserPage(Page page, User user) {
    // 查询用户总行数
    Integer userCount = userMapper.selectUserCount(user);
    // 分页查询用户
    List<User> users = userMapper.selectUserPage(page, user);
    //将查询到的总行数和当前页数据组装到Page对象
    page.setPageCount(userCount);
    page.setResultList(users);
    return page;
}

6、UserController

package com.liming.controller;

import com.liming.page.Page;
import com.liming.pojo.Result;
import com.liming.pojo.User;
import com.liming.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 黎明
 * @version 1.0
 * @date 2023/8/7 16:16
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 分页查询用户的url接口/user/user-list
     *
     * 参数Page对象用于接收请求参数页码pageNum、每页行数pageSize;
     * 参数User对象用于接收请求参数用户名userCode、用户类型userType、用户状态userState;
     *
     * 返回值Result对象向客户端响应组装了所有分页信息的Page对象;
     */
    @RequestMapping("/user-list")
    public Result userListPage(Page page, User user){
        //执行业务
        page = userService.queryUserPage(page, user);
        //响应
        return Result.ok(page);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【积水成渊】CSS磨砂玻璃效果和渐变主题色文字

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcyllqj/category_12346639.html?spm1…

ts给第3方库写类型声明文件

在vue3项目中&#xff0c;用到了jsencrypt这个第3方加密库 通过yarn add 后 在社区发现没有types/jsencrypt类型声明文件 但是node_module文件夹的jsencrypt文件夹中的lib文件夹中是有.d.ts文件的&#xff0c;这说明是有类型声明文件的 既然这个第3方库有类型声明文件&…

大数据指标体系-笔记

指标体系 1 总体流程图 1.1 2 模型‘ 2.1 OSM OSM(Object,Strategy,Measure) 「业务度量」涉及到以下两个概念:一个是KPI ,用来直 接衡量策略的有效性;一个是Target,是预先给出的值,用来判断是否达到预期 2.2 UJM User, Journey, Map 2.3 AARRR-海盗 AARRR(Acquisitio…

内网安全-隧道技术SSH实现通信DNS上线与通信CS上线Linux主机

内网安全-隧道技术&SSH实现通信&DNS上线与通信&CS上线Linux主机 一、DNS隧道技术 DNS简介&#xff1a;DNS协议为应用层协议&#xff0c;区域传输时用tcp协议&#xff0c;域名解析时用udp协议 ###通过DNS隧道绕过防火墙&#xff0c;实现CS上线 实验背景&#xff…

uniapp创建项目入门【详细】

大家在学习vue和微信小程序之后&#xff0c;就可以开始来学习uniapp了&#xff0c;在uniapp中&#xff0c;一套代码可以跨越所有的平台&#xff0c;可以很方便的维护。接下来我们先来学习如何创建uinapp的项目 一、uniapp的创建需求 大家只要会vue和微信小程序的基础来学习unia…

自定义类型——结构体

结构体 1. 结构体的基本知识 结构是一些值的集合&#xff0c;这些值被称之为成员变量。并且结构体的每个成员变量可以是不同类型的。 2.结构体的声明 声明模板&#xff1a; struct tag { member-list;(成员变量) }variable-list(结构体变量列表);假定我们声明一个学生类对象…

【代码解读】RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 1. train.py2. DistributedWrapper类2.1 init函数2.2 train函数2.3 dist_training_process函数 3. RRNetOperator类3.1 init函数3.1.1 make_dataloader函数 3.2 training_process函数3.2.1 criterion函数 4. RRNet类&#xff08;网络模型类&#xff09;4.1 init函数4.…

安卓:MMKV——键值存储库

目录 一、MMKV介绍 1.特点和优势&#xff1a; 2.使用指南&#xff1a; 3.依赖包&#xff1a; 二、MMKV的常用方法 1、初始化和获取实例&#xff1a; 2、存储数据&#xff1a; 3、读取数据 4、删除数据 5、其他操作&#xff1a; 三、MMKV的使用例子 MainActivity&#xff…

Netty:查看ChannelPipeline已经添加的ChannelHandler名称

说明 使用Netty框架开发&#xff0c;可以向ChannelPipeline中添加或者移除ChannelHandler&#xff0c;可以通过ChannelPipeline的names()函数查看ChannelPipeline中已经添加的ChannelHandler名称。 示例 代码片段 package com.thb.power.terminal;import java.io.BufferedR…

uni-app:实现点击按钮出现底部弹窗(uni.showActionSheet+自定义)

一、通过uni.showActionSheet实现底部选择 效果 代码 <template><view><button click"showActionsheet">点击打开弹窗</button></view> </template><script> export default {methods: {showActionsheet() {uni.showAct…

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

10*1000【1】

7.20号 讲了蚂蚁的运行方式和关键技术&#xff1a; 数字技术实现了对金融的改革&#xff0c;让它更包容。当然也实现了消费方式的改变&#xff0c;是得以用户为中心。同时虚拟技术让个人也有了一个自己的小公司&#xff0c;在互联网上面的信息与信用都会被记录下来&#xff0…

如何构造一个安全的单例?

为什么要问这个问题&#xff1f; 我们知道&#xff0c;单例是一种很常用的设计模式&#xff0c;主要作用就是节省系统资源&#xff0c;让对象在服务器中只有一份。但是实际开发中可能有很多人压根没有写过单例这种模式&#xff0c;只是看过或者为了面试去写写demo熟悉一下。那…

springboot家政服务管理系统java家务保姆资源 jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springboot家政服务管理系统 系统1权限&#xff1a;管…

Sentinel 2.0 微服务零信任的探索与实践

作者&#xff1a;涯客、十眠 从古典朴素的安全哲学谈起 网络安全现状 现在最常见的企业网络安全架构便是在企业网络边界处做安全防护&#xff0c;而在企业网络内部不做安全防范。这确实为企业的安全建设省了成本也为企业提供了一定的防护能力。但是这类比于现实情况的一个小…

解决Centos/Linux操作系统安装 uWSGI项目报错

解决linux 操作系统编译uWSGI源码报错 最近在学习在Linux操作系统中使用uWSGI项目部署django项目,在使用源码安装uWSGI项目的时候报错。 报错如下&#xff1a; In file included from plugins/python/python_plugin.c:1:0: plugins/python/uwsgi_python.h:4:20: 致命错误&…

Spring Boot整合ES的两种方式

使用Spring Data Elasticsearch Starter 在Spring Boot中整合Elasticsearch的方式之一是使用Elasticsearch的官方Spring Data Elasticsearch Starter。该Starter提供了对Elasticsearch的高级集成&#xff0c;简化了配置和管理Elasticsearch客户端。 下面是使用Spring Data E…

【SOP】最佳实践之 TiDB 业务写变慢分析

作者&#xff1a; 李文杰_Jellybean 原文来源&#xff1a; https://tidb.net/blog/d3d4465f 前言 在日常业务使用或运维管理 TiDB 的过程中&#xff0c;每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题。这类问题大部分情况下都具有一定的规律可循&#xff0c;…

不要在 foreach 循环里进行元素的 remove/add 操作

如果要进行remove操作&#xff0c;可以调用迭代器的 remove 方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后&#xff0c;以任何方式除非通过迭代器自身remove/add方法&#xff0c;迭代器都将抛出一个ConcurrentModificationException,这就…

大数据-玩转数据-Flink-Transform(上)

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map&#xff08;映射&#xff09; 将数据流中的数据进行转换, 形成新的数据流&#xff0c;消费一个元素并产出一个元素…