我是靠谱客的博主 爱笑电灯胆,最近开发中收集的这篇文章主要介绍mybatis进阶分页(一对多)--嵌套结果集前言一、废话不多说,直接开干二、封装之前要想好,返回的结果集是什么,然后操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、废话不多说,直接开干
  • 二、封装之前要想好,返回的结果集是什么,然后操作
    • 1.创建封装返回的类
    • 2.写接口,编码(略过),重点是xml
    • 3.手动分页,给上述查询结果,进行分页
  • 总结


前言

之前写了一篇文章一对多的嵌套查询封装,利用主表的分页后,再次进行主表的查询,达到了分页结果的准确性,今天写另外一种实现方式,就是嵌套结果集分钟查询,那么这个分页就是我之前说过的不太推荐的方式,这是一个假分页,只能将查询结果返回后进行手动分页;(由于是一次查询,分页无法放在主表上,所以只能等封装完成后,再次手动分页)


一、废话不多说,直接开干

使用范围: 例如一个字典分组表group 每个字段分组有多个字典数据 字典表 dict

二、封装之前要想好,返回的结果集是什么,然后操作

1.创建封装返回的类

代码如下(示例):

@Data
public class GraphDictVo extends GraphDict {
    private List<GraphDictItem> itemList;
}
// GraphDictVo 和 GraphDict 除了这个集合完全一样,这样是为了不改变原有的 GraphDict 与数据库一致的类,规范而已

public class GraphDictItem implements Serializable {
    private static final long serialVersionUID = -83059310077853433L;

    private Integer id;
    /**
     * 字典项编码
     */
    private String code;
    /**
     * 字典项名称
     */
    private String name;
    /**
     * 字典编码
     */
    private String dictCode;
    /**
     * 创建时间
     */
    private String createTime;
    /**
     * 备注
     */
    private String remark;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDictCode() {
        return dictCode;
    }

    public void setDictCode(String dictCode) {
        this.dictCode = dictCode;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

}

2.写接口,编码(略过),重点是xml

代码如下(示例):

    <resultMap id="queryAllMap" type="com.hotemasoft.knowledge.manage.vo.GraphDictVo">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="code" column="code" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
       <collection property="itemList" ofType="com.hotemasoft.knowledge.manage.entity.GraphDictItem">
           <id property="id" column="iid" jdbcType="INTEGER"/>
           <result property="code" column="icode" jdbcType="VARCHAR"/>
           <result property="name" column="iname" jdbcType="VARCHAR"/>
           <result property="dictCode" column="dict_code" jdbcType="VARCHAR"/>
       </collection>
    </resultMap>

    <select id="queryAll" resultMap="queryAllMap">
        SELECT d.`id`,d.`name`,d.`code`,i.`id` iid,i.`name` iname,i.`code` icode ,i.`dict_code`
        FROM `graph_dict` d
        LEFT JOIN `graph_dict_item` i ON i.`dict_code` = d.`code`
    </select>

<collection 这个标签对应字典组中的字典集合 itemList 这样就能封装成一对多的结果了,


3.手动分页,给上述查询结果,进行分页

代码如下(示例):
这里仍然使用pagehelper 分页工具,把结果集和要分页的参数 传入即可

    public static <T> PageInfo<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
        //创建Page类
        Page page = new Page(pageNum, pageSize);
        //为Page类中的total属性赋值
        page.setTotal(list.size());
        //计算当前需要显示的数据下标起始值
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, list.size());
        //从链表中截取需要显示的子链表,并加入到Page
        page.addAll(list.subList(startIndex, endIndex));
        //以Page创建PageInfo
        PageInfo pageInfo = new PageInfo<>(page);
        return pageInfo;
    }

不推荐的原因是这种方式相当于每次都查询所有,然后,手动进行了假分页,不如直接在数据库级别进行分页,取少量的数据查询效率高;

总结

与上一篇文章结合看链接: mybatis进阶分页(一对多)
这样就ok了,两种mybatis的高级查询方式都清楚了

最后

以上就是爱笑电灯胆为你收集整理的mybatis进阶分页(一对多)--嵌套结果集前言一、废话不多说,直接开干二、封装之前要想好,返回的结果集是什么,然后操作的全部内容,希望文章能够帮你解决mybatis进阶分页(一对多)--嵌套结果集前言一、废话不多说,直接开干二、封装之前要想好,返回的结果集是什么,然后操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部