目录
前言
这篇文章属于技术分享,不要看文章很长,但这篇文章绝对会给你点启发
在MybatisPlus中,Mapper类和service继承的baseMappr、IService类中自带的方法都只支持对单表操作
这个时候如果涉及到多表联查的功能时就必须自己手动在mapper映射文件中写SQL语句
所以不要说mybatis-plus既然是mybatis的加强版可以直接使用已经有的方法了还要自己写SQL语句了(
bushi
其实对于多表分页的教程其实Mybatis-Plus官方文档中也有提及到,但是我个人认为教程还是有点简陋
所以在这篇文章中我会详细一些的介绍其中的小细节
数据库结构
班级信息表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中也是有的
//声明这是一个配置类
@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查看结果
可以发现成功实现了我们需要的联表分页效果
records | 结果列表 |
total | 全部数据的总数 |
size | 页大小,一次查询几条数据 |
current | 当前是第几页 |
pages | 总共被分成了几页 |
知道这些属性后就可以通过这些属性发挥自己的想象去做出其他功能啦
这里如果需要了解SpringBoot+MybatisPlus+Thymeleaf前端实现分页按钮的话可以查看我的上一篇文章~
MyBatis-Plus分页+Thymeleaf模板实现前端分页按钮https://blog.csdn.net/Klelelele/article/details/136342899
如果对你有帮助的话可以给新人博主点个赞嘛qwq