MyBatis分页查询

在项目的开发中,需要经常对数据表进行分页查询。下面将介绍使用MyBatis实现对MySQL数据库表的分页查询,该分页方式仅适用于数据表中的数据量比较少的业务。

【实例】分页查询用户列表,并显示分页信息。执行结果如下图:

(1)创建数据库表

在MySQL数据库中创建用户信息表(tb_user),并添加数据。

-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
( 
	user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
	user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',
	province VARCHAR(50) NOT NULL COMMENT '省份',
	create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) COMMENT = '用户信息表';

-- 添加数据
INSERT INTO tb_user(user_name,province) VALUES
('pan_junbiao的博客_01','广东省'),('pan_junbiao的博客_02','黑龙江省'),('pan_junbiao的博客_03','山东省'),('pan_junbiao的博客_04','安徽省'),('pan_junbiao的博客_05','黑龙江省'),
('pan_junbiao的博客_06','江苏省'),('pan_junbiao的博客_07','黑龙江省'),('pan_junbiao的博客_08','广东省'),('pan_junbiao的博客_09','陕西省'),('pan_junbiao的博客_10','广东省'),
('pan_junbiao的博客_11','广东省'),('pan_junbiao的博客_12','江苏省'),('pan_junbiao的博客_13','陕西省'),('pan_junbiao的博客_14','安徽省'),('pan_junbiao的博客_15','山东省'),
('pan_junbiao的博客_16','陕西省'),('pan_junbiao的博客_17','安徽省'),('pan_junbiao的博客_18','江苏省'),('pan_junbiao的博客_19','黑龙江省'),('pan_junbiao的博客_20','安徽省'),
('pan_junbiao的博客_21','江苏省'),('pan_junbiao的博客_22','广东省'),('pan_junbiao的博客_23','安徽省'),('pan_junbiao的博客_24','陕西省'),('pan_junbiao的博客_25','广东省'),
('pan_junbiao的博客_26','广东省'),('pan_junbiao的博客_27','安徽省'),('pan_junbiao的博客_28','山东省'),('pan_junbiao的博客_29','山东省'),('pan_junbiao的博客_30','黑龙江省'),
('pan_junbiao的博客_31','广东省'),('pan_junbiao的博客_32','江苏省'),('pan_junbiao的博客_33','陕西省'),('pan_junbiao的博客_34','安徽省'),('pan_junbiao的博客_35','山东省');

(2)编写实体类(Entity层)

创建公共分页类(BasePaging.java)。

package com.pjb.sm.entity;

/**
 * 公共分页类
 * @author pan_junbiao
 **/
public class BasePaging
{
    private int pageIndex; //当前页码
    private int pageSize; //分页大小
    private int totalData; //数据总数
    private int totalPage; //总页数
    private String orderBy; //排序
    private int offset; //偏移量

    public int getPageIndex()
    {
        return pageIndex;
    }

    public void setPageIndex(int pageIndex)
    {
        this.pageIndex = pageIndex;
    }

    public int getPageSize()
    {
        return pageSize;
    }

    public void setPageSize(int pageSize)
    {
        this.pageSize = pageSize;
    }

    public int getTotalData()
    {
        return totalData;
    }

    public void setTotalData(int totalData)
    {
        this.totalData = totalData;
    }

    public String getOrderBy()
    {
        return orderBy;
    }

    public void setOrderBy(String orderBy)
    {
        this.orderBy = orderBy;
    }

    //计算偏移量:偏移量 = (page_index-1)*page_size
    public int getOffset()
    {
        int offset = 0;
        if(this.pageIndex>0 && this.pageSize>0)
        {
            offset = (this.pageIndex-1)*this.pageSize;
        }
        return offset;
    }

    //计算总页数:总页数 = (数据总数 + 分页大小 -1) / 分页大小
    public int getTotalPage()
    {
        int totalPage = 0;
        if (this.totalData > 0 && this.pageSize > 0)
        {
            totalPage = (this.totalData + this.pageSize - 1) / this.pageSize;
        }
        return totalPage;
    }
}

创建分页结果类(PageResult.java),并继承公共分页类(BasePaging.java)。

package com.pjb.sm.entity;

import java.util.List;

/**
 * 分页结果类
 * @author pan_junbiao
 **/
public class PageResult<T> extends BasePaging
{
    private List<T> dataList; //数据列表

    public List<T> getDataList()
    {
        return dataList;
    }

    public void setDataList(List<T> dataList)
    {
        this.dataList = dataList;
    }
}

创建用户信息的持久化类(User.java)。

package com.pjb.sm.entity;

import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 用户信息的持久化类
 * @author pan_junbiao
 **/
@Component
public class User
{
    private int userId; //用户编号
    private String userName; //用户姓名
    private String province; //省份
    private Date createTime; //注册时间

    //省略getter与setter方法...
}

创建用户查询条件类(UserSearchParam.java),并继承公共分页类(BasePaging.java)。

package com.pjb.sm.entity;

/**
 * 用户查询条件类
 * @author pan_junbiao
 **/
public class UserSearchParam extends BasePaging
{
    private String userName; //用户姓名
    private String province; //省份

    //省略getter与setter方法...
}

(3)编写Mapper配置文件

创建用户信息Mapper配置文件(UserMapper.xml)。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjb.sm.dao.UserDao">

    <!-- 用户信息ResultMap -->
    <resultMap id="userResultMap" type="com.pjb.sm.entity.User">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name"/>
        <result property="province" column="province"/>
        <result property="createTime" column="create_time"/>
    </resultMap>

    <!--用户查询条件SQL片段-->
    <sql id="query_user_where">
        <if test="userName!=null and userName!=''">
            AND user_name like '%${userName}%'
        </if>
        <if test="province!=null and province!=''">
            AND province = #{province}
        </if>
    </sql>

    <!-- 分页查询用户列表 -->
    <select id="getUserPaging" parameterType="com.pjb.sm.entity.UserSearchParam" resultMap="userResultMap">
        SELECT * FROM tb_user
        <where>
            <include refid="query_user_where"/>
        </where>
        <if test="orderBy!=null and orderBy!=''">
            Order BY ${orderBy}
        </if>
        LIMIT ${offset},${pageSize}
    </select>

    <!-- 统计用户数量 -->
    <select id="getCountUser" parameterType="com.pjb.sm.entity.UserSearchParam" resultType="int">
        SELECT COUNT(1) FROM tb_user
        <where>
            <include refid="query_user_where"/>
        </where>
    </select>
</mapper>

(4)实现数据库访问接口层(Dao层)

创建用户信息数据库访问接口(UserDao.java)。

package com.pjb.sm.dao;

import com.pjb.sm.entity.User;
import com.pjb.sm.entity.UserSearchParam;

import java.util.List;

/**
 * 用户信息数据库访问接口
 * Mapper动态代理接口
 * @author pan_junbiao
 **/
public interface UserDao
{
    /**
     * 分页查询用户列表
     */
    public List<User> getUserPaging(UserSearchParam param);

    /**
     * 统计用户数量
     */
    public int getCountUser(UserSearchParam param);
}

(5)实现业务逻辑层(Service层)

创建用户信息业务逻辑接口(UserService.java)。

package com.pjb.sm.service;

import com.pjb.sm.entity.PageResult;
import com.pjb.sm.entity.User;
import com.pjb.sm.entity.UserSearchParam;

/**
 * 用户信息业务逻辑接口
 * @author pan_junbiao
 **/
public interface UserService
{
    /**
     * 分页查询用户列表
     */
    public PageResult<User> getUserPagingResult(UserSearchParam param);
}

创建用户信息业务逻辑类(UserServiceImpl.java),并实现UserService接口,编写业务逻辑方法。

package com.pjb.sm.service.impl;

import com.pjb.sm.dao.UserDao;
import com.pjb.sm.entity.PageResult;
import com.pjb.sm.entity.User;
import com.pjb.sm.entity.UserSearchParam;
import com.pjb.sm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户信息业务逻辑类
 * @author pan_junbiao
 **/
@Service
public class UserServiceImpl implements UserService
{
    @Autowired
    private UserDao userDao;

    /**
     * 分页查询用户列表
     */
    public PageResult<User> getUserPagingResult(UserSearchParam param)
    {
        PageResult<User> userPageResult = new PageResult<User>();
        //获取分页查询用户列表
        List<User> userList = userDao.getUserPaging(param);
        userPageResult.setDataList(userList);
        //统计用户数量
        int totalData = userDao.getCountUser(param);
        userPageResult.setTotalData(totalData);
        //分页信息
        userPageResult.setPageIndex(param.getPageIndex());
        userPageResult.setPageSize(param.getPageSize());
        //返回结果
        return userPageResult;
    }
}

注意:引入Dao的注解 @Autowired 及 Service 实现类的暴露注解 @Service。

(6)编写测试方法(Test层)

创建用户信息业务逻辑测试类(UserTest.java)。

package com.pjb.sm.test;

import com.pjb.sm.entity.PageResult;
import com.pjb.sm.entity.User;
import com.pjb.sm.entity.UserSearchParam;
import com.pjb.sm.service.UserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**
 * 用户信息业务逻辑测试类
 * @author pan_junbiao
 **/
public class UserTest
{
    private ApplicationContext applicationContext;
    Logger logger = LogManager.getLogger(LogTest.class);
    private UserService userService;

    @Before
    public void setUp() throws Exception
    {
        //获取Spring配置文件对象
        applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");

        //通过配置资源对象获取UserServiceImpl对象
        userService = (UserService)applicationContext.getBean("userServiceImpl");
    }

    @After
    public void tearDown() throws Exception
    {
    }

    /**
     * 分页查询用户列表
     */
    @Test
    public void getUserPagingResult()
    {
        //分页查询条件
        UserSearchParam userSearchParam = new UserSearchParam();
        userSearchParam.setPageIndex(2); //获取第2页的数据
        userSearchParam.setPageSize(10); //每页10条数据
        //userSearchParam.setUserName("pan_junbiao的博客"); //查询条件1
        //userSearchParam.setProvince("广东省"); //查询条件2
        userSearchParam.setOrderBy("create_time ASC"); //排序
        //分页查询用户列表
        PageResult<User> userPageResult = userService.getUserPagingResult(userSearchParam);
        //获取用户列表
        List<User> userList = userPageResult.getDataList();
        if (userList != null && userList.size()>0)
        {
            for(User user : userList)
            {
                System.out.println("编号:" + user.getUserId() +" 姓名:" + user.getUserName() + " 省份:" + user.getProvince());
            }
        }
        //分页信息
        System.out.println("当前页码:第" + userPageResult.getPageIndex()+"页");
        System.out.println("分页大小:每页" + userPageResult.getPageSize()+"条");
        System.out.println("数据总数:共" + userPageResult.getTotalData()+"条");
        System.out.println("总页数:共" + userPageResult.getTotalPage()+"页");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值