前言
网上看了很多关于mp联表分页查询的文章,都没get到想要的东西,综合实际应用场景,把我自己的多表分页查询分享一下,不喜勿喷
方式一(注解方式)
直接上代码:
返回前端展示VO:
mapper定义如下:
public interface JobCaseMapper extends BaseMapper<JobCase> {
//测试联表分页查询
@Select("SELECT j.id,j.job_no,j.client_id,c.case_no,c.script_name from job j " +
"left join job_case c on j.id = c.job_id where id= #{id}")
Page<JobVO> selectJobPage(Page<JobVO> page , @Param("id") String id);
}
调用方法:
@Test
public void testQuery(){
//模拟前端分页请求
Page<JobVO> query =new Page<>(1,10);
Page<JobVO> page = jobCaseMapper.selectJobPage(query,"1");
String pageStr = JSON.toJSONString(page);
System.out.println(pageStr);
}
Page为分页查询mybatis-plus里面的page:
这种方式适合简单的联表分页,比较复杂的条件比较多的我推荐方式二
方式二(XML方式)
先来看定义前端查询参数接收对象:
/**
* @ClassName JobPageQuery
* @Description job分页查询参数
* @Author nakey
* @Date 2022/3/3 19:09
*/
@Data
public class JobPageQuery extends Page<JobVO> {
/**
* ID
*/
private String id;
/**
* 编号
*/
private String caseNo;
}
Page类跟上面的一样:
mapper定义:
//测试联表分页查询XML的方式
IPage<JobVO> selectXmlPage(JobPageQuery jobPageQuery, @Param("query") JobPageQuery query);
其实上面2个参数都是同一个对象、同样的数据,但是mp定义第一个参数一定要是Page,第二个参数是条件参数,由于我把条件参数和分页参数都定义在一个类,所以就是一样的。
xml写法:
<!-- 联表分页查询 -->
<select id="selectXmlPage" resultType="com.company.project.vo.resp.JobVO">
SELECT
j.id,
j.job_no,
j.client_id,
c.case_no,
c.script_name
from job j left join job_case c
on j.id = c.job_id
where 1=1
<!-- 条件参数 -->
<if test="query.caseNo != '' and query.caseNo != null">
and c.job_no like "%"#{query.caseNo}"%"
</if>
<!-- 以下个条件为时间范围查询 -->
<if test="query.startTime != '' and query.startTime != null">
and c.create_time <![CDATA[>=]]> #{query.startTime}
</if>
<if test="query.endTime != '' and query.endTime != null">
and c.create_time <![CDATA[<=]]> #{query.endTime}
</if>
<!-- 如果排序字段为空,则默认创建时间倒序,如果有排序字段,则框架会自动拼接,不用加上默认的 -->
<if test="query.orders == '' or query.orders == null or query.orders.size() == 0" >
ORDER BY c.create_time DESC
</if>
方法调用:
/**
* @Description xml的方式联表分页查询
* @Author nakey
* @Date 2021/11/19 14:05
* @param
* @return void
*/
@Test
public void testXmlQuery(){
//模拟前端传输数据:
JobPageQuery query = new JobPageQuery();
//当前页
query.setCurrent(1);
//每页数量
query.setSize(10);
//查询参数
query.setId("123");
query.setCaseNo("no1");
IPage<JobVO> page = jobCaseMapper.selectXmlPage(query ,query);
String pageStr = JSON.toJSONString(page);
System.out.println(pageStr);
}
总结
以上是我自己总结的2种方式,代码测试是可以的,希望可以帮到大家。