MyBatis如何实现分页查询呢?

戚薇 MyBatis 发布时间:2023-05-02 22:16:28 阅读数:1140 1
下文笔者讲述MyBatis分页查询的实现思路,如下所示

Mybatis分页查询的实现思路

使用计算出offset pagesize
    并且将这些参数传入到mapper.xml中
使mapper中的xml实现分页查询
例:Mybatis实现分页查询的示例
//创建数据库表

在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
('1','广东'),('2','湖北'),('3','四川'),
('4','台湾'),('5','陕西')


//编写实体类(Entity层)

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

package com.java265.sm.entity;
/**
 * 公共分页类
 * 
 **/
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.java265.sm.entity;
import java.util.list;
 
/**
 * 分页结果类
 * 
 **/
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.java265.sm.entity;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * 用户信息的持久化类
 * 
 **/
@Component
public class User
{
    private int userId; //用户编号
    private String userName; //用户姓名
    private String province; //省份
    private Date createTime; //注册时间
 
    //省略getter与setter方法...
}

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

package com.java265.sm.entity;
 
/**
 * 用户查询条件类
 * 
 **/
public class UserSearchParam extends BasePaging
{
    private String userName; //用户姓名
    private String province; //省份
 
    //省略getter与setter方法...
}


//编写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.java265.sm.dao.UserDao">
 
    <!-- 用户信息ResultMap -->
    <resultMap id="userResultMap" type="com.java265.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.java265.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.java265.sm.entity.UserSearchParam" resultType="int">
        SELECT COUNT(1) FROM tb_user
        <where>
            <include refid="query_user_where"/>
        </where>
    </select>
</mapper>


//实现数据库访问接口层(Dao层)
//创建用户信息数据库访问接口(UserDao.java)

package com.java265.sm.dao;
import com.java265.sm.entity.User;
import com.java265.sm.entity.UserSearchParam;
 
import java.util.List;
 
/**
 * 用户信息数据库访问接口
 * Mapper动态代理接口
 * 
 **/
public interface UserDao
{
    /**
     * 分页查询用户列表
     */
    public List<User> getUserPaging(UserSearchParam param);
 
    /**
     * 统计用户数量
     */
    public int getCountUser(UserSearchParam param);
}


//实现业务逻辑层(Service层)
//创建用户信息业务逻辑接口(UserService.java)

package com.java265.sm.service;
 
import com.java265.sm.entity.PageResult;
import com.java265.sm.entity.User;
import com.java265.sm.entity.UserSearchParam;
 
/**
 * 用户信息业务逻辑接口
 * 
 **/
public interface UserService
{
    /**
     * 分页查询用户列表
     */
    public PageResult<User> getUserPagingResult(UserSearchParam param);
}

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

package com.java265.sm.service.impl;
 
import com.java265.sm.dao.UserDao;
import com.java265.sm.entity.PageResult;
import com.java265.sm.entity.User;
import com.java265.sm.entity.UserSearchParam;
import com.java265.sm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
/**
 * 用户信息业务逻辑类
 * 
 **/
@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。


//编写测试方法(Test层)
//创建用户信息业务逻辑测试类(UserTest.java)

package com.java265.sm.test;
import com.java265.sm.entity.PageResult;
import com.java265.sm.entity.User;
import com.java265.sm.entity.UserSearchParam;
import com.java265.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;
 
/**
 * 用户信息业务逻辑测试类
 * 
 **/
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()+"页");
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/MyBatis/202305/6330.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者