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

文章目录

  • 前言
  • 一、
  • 二、如何实现
    • 1 配置mybatis plus分页插件
    • 2.准备三张表
      • 2.1 学生表
      • 2.2 老师表
      • 2.3 老师和学生Vo表
    • 3. 编写SQL语句
    • 4. 编写mapper层
    • 5. service层
    • 6.controller层
    • 演示效果
  • 【补充】 XML 自定义分页
  • 总结


前言

没啥可说的

一、

没啥可说的

二、如何实现

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条数据】
mybatis plus实现多表分页条件查询_第1张图片


✏️ 老师表【3条数据】
mybatis plus实现多表分页条件查询_第2张图片

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

mybatis plus实现多表分页条件查询_第3张图片

【补充】 XML 自定义分页

  • UserMapper.java 方法内容
public interface UserMapper {//可以继承或者不继承BaseMapper
    /**
     * 

* 查询 : 根据state状态查询用户列表,分页显示 *

* * @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);
}

总结


一个字: 巴适

你可能感兴趣的:(MySQL,java,mysql,sql)