java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis limit分页设置

MyBatis中的limit分页设置

作者:timchen525

这篇文章主要介绍了MyBatis中的limit分页设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MyBatis limit分页设置

错误的写法

<select id="queryMyApplicationRecord" parameterType="MyApplicationRequest" resultMap="myApplicationMap">
    SELECT
    a.*,
    FROM
    tb_user a
    WHERE 1=1
    <if test="ids != null and ids.size()!=0">
        AND a.id IN
        <foreach collection="ids" item="id" index="index"
                 open="(" close=")" separator=",">
            #{id}
        </foreach>
    </if>
    <if test="statusList != null and statusList.size()!=0">
        AND a.status IN
        <foreach collection="statusList" item="status" index="index"
                 open="(" close=")" separator=",">
            #{status}
        </foreach>
    </if>
    ORDER BY a.create_time desc
    LIMIT (#{pageNo}-1)*#{pageSize},#{pageSize};  // 错误
</select>

在MyBatis中LIMIT之后的语句不允许的变量不允许进行算数运算,会报错。

正确的写法一

<select id="queryMyApplicationRecord" parameterType="MyApplicationRequest" resultMap="myApplicationMap">
    SELECT
    a.*,
    FROM
    tb_user a
    WHERE 1=1
    <if test="ids != null and ids.size()!=0">
        AND a.id IN
        <foreach collection="ids" item="id" index="index"
                 open="(" close=")" separator=",">
            #{id}
        </foreach>
    </if>
    <if test="statusList != null and statusList.size()!=0">
        AND a.status IN
        <foreach collection="statusList" item="status" index="index"
                 open="(" close=")" separator=",">
            #{status}
        </foreach>
    </if>
    ORDER BY a.create_time desc
    LIMIT ${(pageNo-1)*pageSize},${pageSize}; (正确)
</select>

正确的写法二:(推荐)

<select id="queryMyApplicationRecord" parameterType="MyApplicationRequest" resultMap="myApplicationMap">
    SELECT
    a.*,
    FROM
    tb_user a
    WHERE 1=1
    <if test="ids != null and ids.size()!=0">
        AND a.id IN
        <foreach collection="ids" item="id" index="index"
                 open="(" close=")" separator=",">
            #{id}
        </foreach>
    </if>
    <if test="statusList != null and statusList.size()!=0">
        AND a.status IN
        <foreach collection="statusList" item="status" index="index"
                 open="(" close=")" separator=",">
            #{status}
        </foreach>
    </if>
    ORDER BY a.create_time desc
    LIMIT #{offSet},#{limit}; (推荐,代码层可控)
</select>

分析:

方法二的写法,需要再请求参数中额外设置两个get函数,如下:

@Data
public class QueryParameterVO {
 
    private List<String> ids;
 
    private List<Integer> statusList;
 
    // 前端传入的页码
    private int pageNo;  // 从1开始
 
    // 每页的条数
    private int pageSize;
 
    // 数据库的偏移
    private int offSet;
 
    // 数据库的大小限制
    private int limit;
 
    // 这里重写offSet和limit的get方法
    public int getOffSet() {
        return (pageNo-1)*pageSize;
    }
 
    public int getLimit() {
        return pageSize;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文