mybatis-plus多表联合分页查询最佳实践

前言

网上看了很多关于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种方式,代码测试是可以的,希望可以帮到大家。

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在 MyBatis-Plus 中进行多表查询分页,你需要使用 `com.baomidou.mybatisplus.extension.plugins.pagination.Page` 类来构建分页查询对象,并且在 `selectPage` 方法中传入该对象来进行分页查询。 以下是一个简单的示例代码: ```java Page<User> page = new Page<>(1, 10); // 构建分页查询对象,查询第一页,每页10条记录 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 1); // 添加查询条件 IPage<User> userPage = userMapper.selectPage(page, queryWrapper); // 进行分页查询 ``` 在多表查询时,你可以使用 `com.baomidou.mybatisplus.core.conditions.query.QueryWrapper` 类来构建查询条件,然后在 `selectPage` 方法中传入该查询条件对象和分页查询对象。 例如,假设你要查询用户和订单表的数据,你可以这样做: ```java Page<User> page = new Page<>(1, 10); // 构建分页查询对象,查询第一页,每页10条记录 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 1); // 添加查询条件 queryWrapper.inSql("id", "SELECT user_id FROM order WHERE price > 100"); // 添加子查询条件 IPage<Map<String, Object>> userOrderPage = userMapper.selectMapsPage(page, queryWrapper); // 进行分页查询,返回 Map 类型结果 ``` 在上面的示例中,我们通过 `inSql` 方法添加了一个子查询条件,查询所有订单价格大于100的用户。查询结果以 `Map` 类型返回,其中键为表字段名,值为查询结果。 注意,在多表查询时,如果查询结果需要返回多个表的字段,你需要使用 `selectMapsPage` 方法,并且在查询条件中使用 SQL 的联表查询语法。如果查询结果只需要返回单个表的字段,则可以使用 `selectPage` 方法。 ### 回答2: MyBatis-Plus是基于MyBatis的增强工具,为MyBatis提供了更加强大的功能,其中包括了多表查询分页,为我们开发中带来了很大的便利。 多表查询分页在实际开发中非常常见,MyBatis-Plus提供了多种方式,可以灵活使用。下面是一个例子: 我们有三张表:user、order、order_detail,每个用户可以有多个订单,每个订单可以有多个订单详情。现在我们需要查询所有用户的所有订单详情,并且需要分页。 首先,我们需要定义一个VO类,用来接收查询结果: public class UserOrderDetailVO { private Long userId; private String userName; private List<OrderDetail> orderDetails; // ... getter/setter } 然后,在Mapper中写一个SQL语句: SELECT u.id userId, u.name userName, od.* FROM user u LEFT JOIN order o ON u.id = o.user_id LEFT JOIN order_detail od ON o.id = od.order_id ORDER BY u.id; 注意,我们使用了LEFT JOIN来连接三张表,因为不是每个用户都有订单和订单详情。 最后,在Service中调用MyBatis-Plus提供的Page和Wrapper来实现分页和查询条件的封装: int page = 1; int size = 10; Wrapper wrapper = new Wrapper() { @Override public String getSqlSegment() { return "LIMIT " + (page - 1) * size + ", " + size; } }; Page<UserOrderDetailVO> userPage = new Page<>(page, size, true); List<UserOrderDetailVO> userOrderDetailVOS = userMapper.findUserOrderDetailByPage(userPage, wrapper); 这里我们使用了Lambda表达式和匿名内部类来封装分页的SQL语句,使用Page进行分页查询并接收结果,最后再由Mapper返回VO对象的List。 总之,MyBatis-Plus为我们开发中的多表查询分页提供了方便的解决方案,我们只需要灵活使用它提供的API,就可以快速地完成复杂查询的开发。 ### 回答3: MyBatis-Plus是基于MyBatis实现的一个ORM框架,它提供了很多实用的功能来简化数据持久化的操作。在实际项目开发中,多表查询和分页是非常常见的需求。那么如何使用MyBatis-Plus实现多表查询和分页呢? 在MyBatis-Plus中,我们可以使用Wrapper来实现多表查询。Wrapper是用来创建条件的一个抽象类,它有很多子类,如QueryWrapper、UpdateWrapper、LambdaWrapper等等。在多表查询中,我们一般使用QueryWrapper来创建查询条件。 例如,我们有两个表:user和role,它们之间存在一对多的关系。我们要查询所有的user及其对应的role信息,可以这样写: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("user.*, role.name as roleName").eq("user.status", 1) .eq("role.status", 1).eq("user.role_id", "role.id") .orderByDesc("user.create_time"); IPage<UserDto> page = userMapper.selectPage(new Page<>(pageNum, pageSize), wrapper); ``` 其中,select()方法可以指定查询字段,eq()方法可以添加查询条件。此外,我们使用了连接查询语句,将user表和role表关联起来。最后,我们使用selectPage()方法实现分页查询,它需要传入一个Page对象和一个Wrapper对象。 在这个例子中,我们还定义了一个UserDto类,它是一个扩展类,包含了user和role信息。为了让MyBatis-Plus能够将查询结果映射到UserDto对象中,我们需要在mapper.xml中进行配置: ```xml <resultMap type="com.example.dto.UserDto" id="UserDto"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <result column="email" property="email"/> <result column="phone" property="phone"/> <result column="create_time" property="createTime"/> <result column="role_id" property="roleId"/> <result column="status" property="status"/> <result column="roleName" property="roleName"/> </resultMap> ``` 在分页查询时,我们还可以使用PageHelper插件来简化代码。它是一个开源的分页插件,它能够自动拦截指定的方法,将其转换成分页查询,从而避免手动编写分页逻辑。简单使用示例: ```java PageHelper.startPage(pageNum, pageSize); List<UserDto> userList = userMapper.selectUsers(); return new PageInfo<>(userList); ``` 在这个例子中,我们使用了PageHelper.startPage()方法来启用分页功能。然后我们调用selectUsers()方法,它会自动进行分页查询。最后,我们使用PageInfo来封装查询结果,并返回给调用方。 总的来说,MyBatis-Plus提供了非常方便的多表查询和分页功能,通过合理地组合使用,可以让我们更加高效地进行数据持久化的操作。但需要注意的是,在进行多表查询时,要注意表的关联性和查询效率,避免出现慢查询或者环路查询等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值