Mybatis多表分页查询

1,888 阅读1分钟

在日常开发中,多表的分页查询我们无法避免,但是我们在封装分页对象的时候,不仅需要记录数据还要符合条件的总条数。

data: 从数据库查询出来符合条件的数据,没什么好说的
total: 去除limit语句的count(*)

所以平时,我们需要写两天SQL,一条查询数据,另外一条查询记录总数,今天就通过另外一种方式解决这个问题,执行一次sql就可以解决这个问题。

  • 指定查询的时候支持多查询
连接数据库的时候,指定可支持多查询“allowMultiQueries=true”,如配置文件中 jdbc:mysql://127.0.0.1:3306/he_zhe?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
  • mapper.xml

==注意:==SQL_CALC_FOUND_ROWS和FOUND_ROWS()

<resultMap id="userResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="desc" column="desc"/>
    </resultMap>

    <resultMap id="count" type="integer">
        <result column="count" jdbcType="INTEGER" javaType="Integer"/>
    </resultMap>

    <select id="list" resultMap="userResultMap,count">
        SELECT SQL_CALC_FOUND_ROWS u.*,t.`desc` FROM t_user u LEFT JOIN t_test t ON u.id = t.user_id
        LIMIT #{page} , #{size};
        SELECT FOUND_ROWS() as count;
    </select>
  • mapper接口
List<List<? extends Object>> list(@Param("page") Integer page,@Param("size") Integer size);
  • service
UserDTO dto = new UserDTO();
List<List<? extends Object>> list = userMapper.list((page - 1) * size, size);
dto.setUsers((List<User>) list.get(0));
dto.setTotal(Long.valueOf(list.get(1).get(0).toString()));