Java:采用mybatis+pagehealper优雅的实现分页功能

发布于:2025-07-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

       在实现分页功能时,通常的做法是提供一个查总记录数据的SQL,再提供一个带分页参数的SQL,如果系统需要,可能还需要提供一个查全量记录的SQL。这种实现方式实在是繁琐,理想的实现方式是只提供一个查全量的SQL,分页功能自己能根据这这个基础的SQL生成查总记录数据的SQL和分页参数的SQL。pagehelper组件就能实现这样的功能,但是它需要结合mybatis一起使用。下面就实现一个简单的例子。

1.maven配置pom.xml

<dependency>
    <groupId>org.mybatis.spring.boot<groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.2</version>
</dependency>

<dependency>
    <groupId>com.github.pagehelper<groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.7</version>
</dependency>

2.spring配置application.yaml

mybatis:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl

3.mybatis配置roleInfo.mapper.xml

<mapper namespace="org.test.core.dao.RoleDao">
    <resultMap id="RoleInfo" type="org.test.core.model.RoleInfo">
        <result property="id" column="role_id" />
        <result property="name" column="role_name" />
        <result property="type" column="type" />
        <result property="state" column="state" />
        <result property="desc" column="description" />
    </resultMap>

    <select id="getRoleInfoById" parameterType="string" resultMap="RoleInfo">
        select role_id, role_name, type, state, description
        from t_role
        where role_id = #{id}
    </select>

    <select id="getRoleInfoByMap" parameterType="hashmap" resultMap="RoleInfo">
        select role_id, role_name, type, state, description
        from t_role
        <where>
            <if test="id != null and id != ''">
                and role_id = #{id}
            </if>
            <if test="name != null and name != ''">
                and role_name = #{name}
            </if>
            <if test="state != null and state != ''">
                and state = #{state}
            </if>
    </select>

    <select id="getRoleInfoByObj" parameterType="org.test.core.model.RoleInfo" resultMap="RoleInfo">
        select role_id, role_name, type, state, description
        from t_role
        <where>
            <if test="id != null and id != ''">
                and role_id = #{id}
            </if>
            <if test="name != null and name != ''">
                and role_name = #{name}
            </if>
            <if test="state != null and state != ''">
                and state = #{state}
            </if>
    </select>
</mapper>

4.java代码

(1)RoleDao.java

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotation.Param;

public interface RoleDao {

    RoleInfo getRoleInfoById (@Param(value = "id") String roleId);

    List<RoleInfo> getRoleInfoByMap (Map<String, Object> map);

    List<RoleInfo> getRoleInfoByObj (RoleInfo roleInfo);

}

(2)PagingKit

import java.util.List;
import java.util.Map;
import java.util.function.Function;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

public class PagingKit {

    public static <T> PageInfo<T> makePageInfoUseMap(Map<String, Object> map, int pageNum, int pageSize, Function<Map<String, Object>, List<T>> query) {
        PageHelper.startPage(pageNum, pageSize);

        List<T> list = query.apply(map);

        PageInfo<T> pageInfo = new PageInfo<T>(list);

        return pageInfo;
    }

    public static <T> PageInfo<T> makePageInfoUseObj(T condition, int pageNum, int pageSize, Function<T, List<T>> query) {
        PageHelper.startPage(pageNum, pageSize);

        List<T> list = query.apply(condition);

        PageInfo<T> pageInfo = new PageInfo<T>(list);

        return pageInfo;
    }

}

(3)HeathController.java

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.github.pagehelper.PageInfo;

@Component
@Path("/sys")
public class HealthController {

    @Autowired
    private RoleDao roleDao;

    @GET
    @Path("/role/{id}")
    @Produces({"application/json"})
    public RoleInfo getRoleById (@PathParam("id") String id) {
        return roleDao.getRoleInfoById(id);
    }

    @GET
    @Path("/role/byMap")
    @Produces({"application/json"})
    public RoleInfo pagingRoleByMap (@queryParam("pageNum") int pageNum, @queryParam("pageSize") int pageSize) {
        Map<String, Object> map = new HashMap<>();
        map.put("state", "0");
        map.put("name", "管理员");

        PageInfo<RoleInfo> pageInfo = PagingKit.makePageInfoUseMap(map, pageNum, pageSize, roleDao::getRoleInfoByMap); 

        return pageInfo;
    }

    @GET
    @Path("/role/byObj")
    @Produces({"application/json"})
    public RoleInfo pagingRoleByObj (@queryParam("pageNum") int pageNum, @queryParam("pageSize") int pageSize) {
        RoleInfo  role = new RoleInfo();
        role.setState("0");
        role.setName("管理员");

        PageInfo<RoleInfo> pageInfo = PagingKit.makePageInfoUseObj(role, pageNum, pageSize, roleDao::getRoleInfoByObj); 

        return pageInfo;
    }

}

5.执行如果

可以查看日志

getRoleInfoByMap_COUNT|==>Preparing: select count(0) from (select role_id,role_name,type,state,description from t_role where role_name like "%"?"%" and state = ? ) tmp_count

getRoleInfoByMap_COUNT|==>Parameters: 管理员(String), 0(String)

getRoleInfoByMap_COUNT|==>   Total: 1

getRoleInfoByMap==>Preparing: select role_id,role_name,type,state,description from t_role where role_name like "%"?"%" and state = ? LIMIT ?,?

getRoleInfoByMap|==>Parameters: 管理员(String), 0(String), 3(Long),3(Integer)

getRoleInfoByMap|==>   Total: 1


网站公告

今日签到

点亮在社区的每一天
去签到