Mybatis分页查询避免两次查询同时返回总数和数据(一条SQL直接查询)

一、 场景:

mysql分页查询一般都需要给前端返回一个总数,便于前端人员计算总页数。以前的处理办法是查询两次数据库,现在想提升下效率。

二、处理方法:

SELECT SQL_CALC_FOUND_ROWS * FROM [table] WHERE ......  limit M, N;
SELECT FOUND_ROWS();

SQL_CALC_FOUND_ROWS 告诉MySQL将sql所处理的行数记录下来
FOUND_ROWS() 则取到了这个纪录。

三、controller层:

public Page<People> PageAfter(PageModel<People>  page, PeopleQuery query) {
        List<People> list = service.PageAfter(page.getP(),page.getPs(),query);
        List<People> people = (List<People>) list.get(0); //数据集合
        Integer total = ((List<Integer>) list.get(1)).get(0); //总量
        Page<People> page1 = new Page();
        page1.setTotal(total);
        page1.setRecords(people);
        page1.setCurrent(page.getP());
        page1.setSearchCount(true);
        page1.setSize(page.getPs());
        page1.setPages(total/page1.getSize());
        return page1;
    }

四、service层:

public List<People> PageAfter(long p, long ps, PeopleQuery query) {
		return peopleMapper.PageAfter(p,ps,query);
}

五、mapper层:

List<People> PageAfter(@Param("p") Long p,@Param("ps") Long ps, @Param("query") PeopleQuery query);

六、xml代码:

<!-- 用来记录分页查询时的全部数据量,避免出现分页查询时须要查询两次 -->
    <resultMap type="java.lang.Integer" id="count">
        <result column="total"/>
    </resultMap>

<!-- 这个地方的resultMap中的内容会变红,不过不影响程序正常启动 -->
<select id="PageAfter" resultMap="BaseResultMap,count"
              resultType="com.sangang.video.admin.modules.dim.entity.People">
         select SQL_CALC_FOUND_ROWS
             a.id,a.name,sum(b.type = 'PEOPLE_VOICE' OR NULL) AS voice, sum(b.type = 'PEOPLE_FACE' OR NULL) AS face,a.create_date
         from
             dim_people a
        LEFT JOIN
             dim_attach b ON b.bill_id = a.id
        where
            a.flag=1
           <if test="query.name!=null  and query.name !='' ">
              and a.name like  CONCAT('%',#{query.name},'%')
           </if>
        GROUP BY
           a.id,a.name
        LIMIT #{p}, #{ps};
        SELECT FOUND_ROWS() as total;
      </select>

注意:在使用时须要在配置文件中,设置容许sql进行多语句执行:allowMultiQueries=true,在sql的url上加上这个配置就能够了
在这里插入图片描述

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值