mybatis分页插件以及嵌套查询以及关联查询

一.mybatis的分页插件的使用.

1.引入maven

        <!-- 引入mybatis的 pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>

2.mybatis的配置

    <!-- 引入 pageHelper插件 -->
    <!--注意这里要写成PageInterceptor, 5.0之前的版本都是写PageHelper, 5.0之后要换成PageInterceptor-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--reasonable:分页合理化参数,默认值为false,直接根据参数进行查询。
              当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。-->
            <!--<property name="reasonable" value="true"/>-->
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
        </plugin>
    </plugins>

3.使用:PageHelper.startPage(pageIndex, pageSize);的后面一句查询语句会自动帮我们分页,并且数据不要在下面查询 感觉有问题。所有推荐推荐serviceimpl下面

        //利用PageHelper分页查询 注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
        PageHelper.startPage(pageIndex, pageSize);
        //User user=(User)session.getAttribute("user");
        List<Blog> blogList = blogMapper.findBlogAll(use_id);
        PageInfo<Blog> pageInfo = new PageInfo<Blog>(blogList);

注意注意:当查询涉及到三个表推荐使用关联查询,因为在使用分页查询的时候分页的数目会对不上。嵌套查询会重新新生成一个表,然后把所有的数据放进去,这样会出现的状况是blog表相同,但是标签有其他,这样会出现多的行。

下图就是一个很好的列子 他生产成了第三个表,然后把数据一一放进去,这样看半部分都相同,但因为标签不同,所以就变成了两行数据,我们想要的是一个blog里面有一个label的集合。在这里插入图片描述

二.嵌套查询

1.首先有三个表 blog、label、blogandlabel
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.blogmapper的写法:

    <select id="findBlogAll" parameterType="Long" resultMap="BlogAllResult">
      select b.*,la.id as laid,la.name
      from blog b left join blogandlabel blo on b.id=blo.blog_id
      left join label la on blo.label_id=la.id
      where b.user_id=#{user_id}
    </select>
    <resultMap id="BlogAllResult" type="Blog">
        <id property="id" column="id"></id>
        <result property="header" column="header"></result>
        <result property="content" column="content"></result>
        <result property="user_id" column="user_id"></result>
        <result property="createtime" column="createtime"></result>
        <collection property="labelList" ofType="Label">
            <id property="id" column="laid"></id>
            <result property="name" column="name"></result>
        </collection>
    </resultMap>

4.然后通过分页插件查询数据就可以了。

三.关联查询

1.blogmapper

    <select id="findBlogAll" parameterType="Long" resultMap="BlogAllResult">
        select * from blog where user_id=#{user_id}
    </select>
    <resultMap id="BlogAllResult" type="Blog">
        <id property="id" column="id"></id>
        <result property="header" column="header"></result>
        <result property="content" column="content"></result>
        <result property="user_id" column="user_id"></result>
        <result property="createtime" column="createtime"></result>
        <collection property="labelList" ofType="Label" column="id"
            select="com.wcy.mapper.LabelMapper.findLabel">
        </collection>
    </resultMap>

2.labelmapper

    <select id="findLabel" parameterType="Long" resultType="Label">
      select * from label where id in(
        select label_id from blogandlabel where blog_id=#{id}
      )
    </select>

3.serviceimpl

    public JSONObject findBlogAll(Long use_id,Integer pageIndex,Integer pageSize) {
        JSONObject jsonObject = new JSONObject();
        //利用PageHelper分页查询 注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
        PageHelper.startPage(pageIndex, pageSize);
        //User user=(User)session.getAttribute("user");
        List<Blog> blogList = blogMapper.findBlogAll(use_id);
        PageInfo<Blog> pageInfo = new PageInfo<Blog>(blogList);
        jsonObject.put("type","success");
        jsonObject.put("bloglist",blogList);
        jsonObject.put("count",pageInfo.getTotal());
        System.out.println("第一个"+blogList);
        System.out.println("第二个"+pageInfo);
        return jsonObject;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值