错误的写法:
-
<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; -
} -
}
博客指出在MyBatis里,LIMIT之后的语句中变量不允许进行算数运算,否则会报错。同时给出了两种正确写法,其中第二种写法被推荐,且采用该写法需在请求参数中额外设置两个get函数。
103

被折叠的 条评论
为什么被折叠?



