免连表查询并手动实现PageHelper
项目需求关联了三个表进行查询,并且对查询的结果进行分页。
在项目中有的地方使用了PageHelper进行分页,但写这个没用,这里一定一定要注意!!!在传参的时候要注意不能给语句传PageHelper中已有的参数名(pageNum,pageSize),这是SpringBoot中的一个坑。
下面是查询语句,以及count查询,因为返回结果需要count信息,你查看PageHelper的查询过程就会发现,也是执行了一下count
但是要在同样的条件下查询才会准确。
比如下面的语句中查询了status,那么count语句中同样要带着status进行查询,为了方便我用的map传参,下面会有展示
<select id="list" parameterType="java.util.HashMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from invite
<where>
<if test="status != null">
status = #{status,jdbcType=VARCHAR}
</if>
<if test="member_id != null">
and member_id = #{memberId,jdbcType=INTEGER}
</if>
</where>
order by num DESC
<if test="startNum!= null and pageLength!= null">
limit #{pageNum},#{pageSize}
</if>
</select>
<select id="selceCount" parameterType="java.util.HashMap" resultType="Integer">
SELECT COUNT(id) FROM invite
<where>
<if test="status != null">
status = #{status,jdbcType=VARCHAR}
</if>
<if test="member_id != null">
and member_id = #{memberId,jdbcType=INTEGER}
</if>
</where>
</select>
service层
以下是service层的查询,返回一个结构体
public List<InviteVo> list(HashMap map){
//查询出来后,循环拼到返回体中,返回体中有你要的其他表的信息
List<InviteEntity> list = inviteEntityMapper.list(map);
List<InviteVo> voList = new ArrayList<>();
if (list.size() != 0){
for (InviteEntity invite : list){
InviteVo inviteVo = new InviteVo();
inviteVo.setId(invite.getId());
inviteVo.setNum(invite.getNum());
inviteVo.setStatus(invite.getStatus());
MemberEntity memberEntity = memberService.info(invite.getMemberId());
inviteVo.setMemberId(memberEntity.getId());
inviteVo.setMemberName(memberEntity.getName());
voList.add(inviteVo);
}
}
return voList;
}
public Integer count(HashMap map){
//总条数统计
return inviteEntityMapper.selceCount(map);
}
@RequestMapping("list")
public Object list(HttpServletRequest request){
JSONObject json = new JSONObject();
String memberId = request.getParameter("memberId");
String status = request.getParameter("status");
String pageNum = request.getParameter("pageNum");
String pageSize = request.getParameter("pageSize");
//将要用的参数放到map中
HashMap<String,Object> selectMap = new HashMap<>();
if (StringUtils.isNotBlank(memberId)){
selectMap.put("memberId",memberId);
}
if (StringUtils.isNotBlank(status)){
selectMap.put("status",status);
}
if (!StringUtils.isNotBlank(pageNum)){
pageNum = "1";
}
if (!StringUtils.isNotBlank(pageSize)){
pageSize = "15";
}
//手动计算startNum
int startNum = (Integer.valueOf(pageNum)-1)*Integer.valueOf(pageSize);
//limit后面的两个参数是int类型
selectMap.put("startNum",Integer.valueOf(pageNum));
selectMap.put("pageLength",Integer.valueOf(pageSize));
List<InviteVo> list = inviteService.list(selectMap);
Integer num = inviteService.count(selectMap);
Map map = new HashMap();
//计算totalPage
int totalPage = num / Integer.valueOf(pageSize) + ((num % Integer.valueOf(pageSize) == 0) ? 0 : 1);
//
map.put("list", list);
map.put("total", num);
map.put("pageNum", Integer.valueOf(pageNum));
map.put("pages", totalPage);
json.put("success", true);
json.put("code", 200);
json.put("msg", "查询成功");
json.put("data", map);
return json;
}
题外话:使用springboot最好引入这个
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
yml文件中的配置
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: countSql