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
    评论
Mybatis查询分页时,可以使用PageHelper插件来实现同时获取总条数和分页数据。PageHelper是一个开源的Mybatis分页插件,它提供了非常方便的分页功能,同时支持获取总条数。 以下是使用PageHelper插件进行分页查询并获取总条数的示例代码: 1. 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency> ``` 2. 在Mapper.xml中编写分页查询SQL语句,例如: ```xml <select id="getUserList" resultMap="user"> select * from user <where> <if test="name != null and name != ''"> and name like concat('%',#{name},'%') </if> </where> order by id desc </select> ``` 3. 在Java代码中调用分页查询方法,例如: ```java //设置分页信息 PageHelper.startPage(pageNum, pageSize); //执行查询 List<User> userList = userDao.getUserList(name); //获取总条数 long total = ((Page) userList).getTotal(); //封装结果 PageInfo<User> pageInfo = new PageInfo<>(userList); pageInfo.setTotal(total); ``` 在上述代码中,我们使用了PageHelper.startPage(pageNum, pageSize)来设置分页信息,然后执行查询并将查询结果封装成PageInfo对象,同时通过((Page) userList).getTotal()方法获取总条数并设置到PageInfo对象中。最终返回的是一个带有分页信息和总条数的PageInfo对象。 需要注意的是,PageHelper插件只支持Mybatis的Mapper接口方式,不支持直接使用SqlSession进行查询。如果您使用SqlSession进行查询,可以考虑使用Mybatis提供的RowBounds类来手动实现分页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值