mybatis plus实现多表分页条件查询


前言

没啥可说的

一、

没啥可说的

二、如何实现

1 配置mybatis plus分页插件

@Configuration
@MapperScan("com.breez.vote.mapper")
public class MybatispluConfig {
    /**
     * 配置分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2.准备三张表

2.1 学生表

@Data
@TableName("student")
public class Student implements Serializable {
    private Integer id;
    private String studentName;
    private Integer studentAge;
}

2.2 老师表

@Data
@TableName("teacher")
public class Teacher implements Serializable {
    private Integer id;
    private String teacherName;
    private Integer teacherAge;
}

2.3 老师和学生Vo表

💡这张表的数据来自老师和学生,用来保存来自多张表的数据。

/**
 * 学生和老师
 */
@Data
public class QueryVo implements Serializable {
    /**
     * 学生名字
     */
    private String studentName;
    /**
     * 学生年龄
     */
    private Integer studentAge;
    /**
     * 老师姓名
     */
    private String teacherName;
    /**
     * 老师年龄
     */
    private Integer teacherAge;
}

3. 编写SQL语句

💡这里需要注意:写完SQL语句后,需要在结尾加上${ew.customSqlSegment},查询参数,由mybatis plus自动拼装。

<?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="com.breez.vote.mapper.StudentMapper">

    <select id="findByPage" resultType="com.breez.vote.domain.vo.QueryVo">
        select * from student,teacher  ${ew.customSqlSegment}
    </select>
    
</mapper>

4. 编写mapper层

public interface StudentMapper extends BaseMapper<Student> {
    /**
     *自定义分页条件查询
     * @param page 分页参数
     * @param wrapper 查询参数
     * @return
     */
    IPage<QueryVo> findByPage(IPage<QueryVo> page, @Param(Constants.WRAPPER) QueryWrapper<QueryVo> wrapper);
}

5. service层

public interface StudentService extends IService<Student> {
    /**
     *
     * @param page 分页参数
     * @param queryWrapper 查询条件
     * @return 分页后的数据
     */
    public IPage<QueryVo> findByPage(Page<QueryVo> page, QueryWrapper<QueryVo> queryWrapper);

}
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Resource
    private StudentMapper queryMapper;

    /**
     * @param page         分页参数
     * @param queryWrapper 查询条件
     * @return 分页后的数据
     */
    @Override
    public IPage<QueryVo> findByPage(Page<QueryVo> page, QueryWrapper<QueryVo> queryWrapper) {
        return queryMapper.findByPage(page, queryWrapper);
    }
}

6.controller层

@RestController
@RequestMapping("data")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @GetMapping("query")
    public Object query() {
        Page<QueryVo> page = new Page<>(1, 2);
        IPage<QueryVo> queryVoPage = studentService.findByPage(page, new QueryWrapper<>());
        return queryVoPage;
    }
}

演示效果

✏️学生表【4条数据】
在这里插入图片描述


✏️ 老师表【3条数据】
在这里插入图片描述

💡这里出现这个结果原因(出现了12条数据【3*4=12】)是我没有在SQL语句中写多表查询条件,出现了笛卡尔积,加上多表查询条件后就不会出现相同的了(李刚)。

在这里插入图片描述

【补充】 XML 自定义分页

  • UserMapper.java 方法内容
public interface UserMapper {//可以继承或者不继承BaseMapper
    /**
     * <p>
     * 查询 : 根据state状态查询用户列表,分页显示
     * </p>
     *
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param state 状态
     * @return 分页对象
     */
    IPage<User> selectPageVo(Page<?> page, Integer state);
}
  • UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
<select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
    SELECT id,name FROM user WHERE state=#{state}
</select>
  • UserServiceImpl.java 调用分页方法
public IPage<User> selectUserPage(Page<User> page, Integer state) {
    // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
    // page.setOptimizeCountSql(false);
    // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
    // 要点!! 分页返回的对象与传入的对象是同一个
    return userMapper.selectPageVo(page, state);
}

总结

📖
一个字: 巴适

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗨老同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值