使用MybatisPlus实现联表分页查询

本文详细介绍了如何在MybatisPlus中处理多表联查的需求,包括在实体类中添加属性、编写映射文件、自定义DAO和服务方法,以及配置分页插件。通过实例展示了如何实现分页查询并测试结果。
摘要由CSDN通过智能技术生成

目录

前言

数据库结构

第一步:给实体类加属性

第二步:编写映射文件

第三步:给dao层和service层添加方法

第四步:添加分页配置类

第五步:创建控制器Controller编写方法

最后启动项目测试结果


前言

这篇文章属于技术分享,不要看文章很长,但这篇文章绝对会给你点启发

在MybatisPlus中,Mapper类和service继承的baseMappr、IService类中自带的方法都只支持对单表操作

这个时候如果涉及到多表联查的功能时就必须自己手动在mapper映射文件中写SQL语句

所以不要说mybatis-plus既然是mybatis的加强版可以直接使用已经有的方法了还要自己写SQL语句了(bushi

其实对于多表分页的教程其实Mybatis-Plus官方文档中也有提及到,但是我个人认为教程还是有点简陋

分页插件 | MyBatis-PlusMyBatis-Plus 官方文档icon-default.png?t=N7T8https://baomidou.com/pages/97710a/#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84-mapper-method-%E4%BD%BF%E7%94%A8%E5%88%86%E9%A1%B5

所以在这篇文章中我会详细一些的介绍其中的小细节


数据库结构

班级信息表classInfo

教师表teacher


第一步:给实体类加属性

创建好对应的实体类后需要给需要联表查询的那个实体类加上一个新的属性

ClassInfo类

@TableField(exist = false)这个注解是用来告诉Mybatis-Plus这个字段是在数据库里没有的,是我们自己增加的属性,不然在自动映射的时候系统找不到这个字段就会报错

Teacher类

注意:我实体类中不用写set/get方法是因为使用了Lombok插件,使用这个插件后在实体类中

只需要加上以下注解

@Data注解即可自动生成set/get方法

@AllArgsConstructor即可自动生成有参构造

@NoArgsConstructor即可自动生成无参构造

当然不加这个依赖也可以,只是要自己写一下set/get方法和构造方法

可根据自己情况选择

依赖代码

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

第二步:编写映射文件

首先我们要创建映射文件,映射文件需要放在mappers文件夹中,也可以通过配置文件修改相应的设置

映射文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.qin.blogtest.dao.ClassInfoMapper">
<!--这里定义一个结果集用来把查询到的数据自动映射到我们的实体类中-->
  <resultMap id="BaseResultMap" type="cn.qin.blogtest.pojo.ClassInfo">
    <!--这里必须要注意下面的column属性需要跟sql语句查询出来的字段名对应-->
    <!--如果不对应则映射时MybatisPlus找不到对应的数据-->

    <!--property对应的是要映射到的实体类中的属性-->
    <id column="cId" property="id" />
    <result column="className" property="classname" />
    <result column="classTeacherId" property="classteacherid" />
    <result column="classSize" property="classsize" />
    <!--映射关系,一对一-->
    <association property="classteacherid" javaType="cn.qin.blogtest.pojo.Teacher">
      <id column="tId" property="id"/>
      <result column="teacherName" property="teachername"/>
    </association>
  </resultMap>
  <sql id="Base_Column_List">
    id, className, classTeacherId, classSize
  </sql>

  <!--因为多表查询时有时不可避免的会出现查出来有相同的字段名-->
  <!--所以需要取别名,让上面的cloumn跟查询出来的字段名相同-->
  <select id="selectPage" resultMap="BaseResultMap">
    select c.id as cId, className, classTeacherId, classSize, t.id as tId, teacherName
    from classInfo as c,teacher as t
    where c.classTeacherId=t.id
  </select>
</mapper>

第三步:给dao层和service层添加方法

有了SQL语句之后当然是写方法来调用这个SQL语句啦

dao层

package cn.qin.blogtest.dao;

import cn.qin.blogtest.pojo.ClassInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ClassInfoMapper extends BaseMapper<ClassInfo> {
    //自己写一个方法,使用自己的多表SQL语句,这里返回Page或者官方文档的IPage都可以
    Page<ClassInfo> selectPage(Page<ClassInfo> page);
}

service层

package cn.qin.blogtest.service;

import cn.qin.blogtest.pojo.ClassInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
public interface ClassInfoService extends IService<ClassInfo>{
    //只需要把dao层里的方法原样复制过来就行
    Page<ClassInfo> selectPage(Page<ClassInfo> page);
}

service实现类

package cn.qin.blogtest.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.qin.blogtest.dao.ClassInfoMapper;
import cn.qin.blogtest.pojo.ClassInfo;

@Service
public class ClassInfoServiceImpl extends ServiceImpl<ClassInfoMapper, ClassInfo> implements ClassInfoService {

    @Override
    public Page<ClassInfo> selectPage(Page<ClassInfo> page) {
        return this.baseMapper.selectPage(page);
    }
}

第四步:添加分页配置类

这一步的代码在MybatisPlus中也是有的

分页插件 | MyBatis-PlusMyBatis-Plus 官方文档icon-default.png?t=N7T8https://baomidou.com/pages/97710a/#%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95代码如下

//声明这是一个配置类
@Configuration
/*
@MapperScan是声明要扫描的dao层下的mapper类,
如果自己在每个mapper类中加入了@Mapper注解就可以不用写这个注解了
*/
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
        //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
        return interceptor;
    }
}

具体创建位置

 

第五步:创建控制器Controller编写方法

这一步可以自行选择在Controller类中写方法测试也可以选择在测试类中测试

这里演示控制器写法

先创建一个控制器包,然后创建一个控制器

然后写代码

//包各位自己导一下qwq

/*@RestController注解是在返回结果时将对象以json格式输出
* @Controller注解是在返回结果时将对象以html格式输出
* */
@RestController
public class ClassInfoController {
    /*@Resource注解是通过在类中添加@Resource注解来实现对类的依赖注入*/
    @Resource
    private ClassInfoServiceImpl classInfoService;

    /*查询分页结果*/
    @RequestMapping("/getPage")
    public Object getPage(Model model, @RequestParam(defaultValue = "1") Integer page){
        Page<ClassInfo> classInfoPage = new Page<>(page, 3);
        //调用我们写好的方法,如果不需要联表查询这里调用page方法就可以了
        classInfoService.selectPage(classInfoPage);
        /*如果需要把数据传到前端渲染的话给入参加一个model对象然后添加属性即可
        model.addAttribute("pageInfo", classInfoPage);
        */

        //分页对象中有很多属性可以获取,这里的getRecords就是分页结果
        List<ClassInfo> records = classInfoPage.getRecords();

        return classInfoPage;
    }
}

最后启动项目测试结果

在浏览器输入网址http://localhost:8081/getPage?page=1查看结果

可以发现成功实现了我们需要的联表分页效果


Page类中的属性
records结果列表
total全部数据的总数
size页大小,一次查询几条数据
current当前是第几页
pages总共被分成了几页

知道这些属性后就可以通过这些属性发挥自己的想象去做出其他功能啦

这里如果需要了解SpringBoot+MybatisPlus+Thymeleaf前端实现分页按钮的话可以查看我的上一篇文章~

MyBatis-Plus分页+Thymeleaf模板实现前端分页按钮icon-default.png?t=N7T8https://blog.csdn.net/Klelelele/article/details/136342899


如果对你有帮助的话可以给新人博主点个赞嘛qwq

  • 37
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值