Mybatis-Plus多表分页加条件自定义sql查询(三表查询)

4 篇文章 0 订阅
3 篇文章 0 订阅

介绍

在使用mybatis-plus时,IPage对象可以方便的进行单表分页查询,但是进行多表分页查询及带查询条件则需要自己封装sql语句,自定义封装sql语句也可以使用mybatis-plus的IPage和QueryWrapper条件
先来看下官方介绍
自定义SQL自定义SQL

步骤:

Mapper层

  • Mapper层,使用mybatis映射xml文件写sql语句
    此处的LendList是查询结果的VO对象
    方法传参:IPage<VO> page,@Param(Constants.WRAPPER) QueryWrapper<VO>
    方法返回:IPage<VO>
    @Mapper
    public interface LendRecordMapper extends BaseMapper<LendRecord> {
    
        /**
         * 多表分页查询加条件
         * @param page IPage
         * @param wrapper 查询条件
         * @return 返回IPage对象
         */
        IPage<LendList> getLendList(IPage<LendList> page, @Param(Constants.WRAPPER) Wrapper<LendList> wrapper);
    
    }
    
    xml文件
    <select id="getLendList" resultType="LendList">
           select lend_record.id, book_name, user_name, lend_time
           from lend_record
                    left join book b on b.id = lend_record.book_id
                    left join user u on u.id = lend_record.user_id
           <where>
               ${ew.sqlSegment}
           </where>
       </select>
    

Service层

  • Service层,这里的Service层是主表对象,继承了IService
        /**
         * 获取借阅信息(多表查询)
         *
         * @param pageNo     当前页
         * @param pageSize   页面展示数据大小
         * @param lendSearch 查询条件
         * @return 返回自定义VO对象
         */
        @Override
        public Result<MyPage<LendList>> getLendList(Integer pageNo, Integer pageSize, LendList lendSearch) {
            // 封装查询条件
            HashMap<String, Object> map = new HashMap<>(5);
            map.put("book_name", lendSearch.getBookName());
            map.put("user_name", lendSearch.getUserName());
            QueryWrapper<LendList> wrapper = new QueryWrapper<>();
            wrapper.allEq(map, false);
            // 分页查询数据
            Page<LendList> page = new Page<>(pageNo, pageSize);
            // 对多表查询后的结果进行count(*)
        	page.setOptimizeCountSql(false);
            IPage<LendList> lendList = lendRecordMapper.getLendList(page, wrapper);
            // 封装数据返回
            MyPage<LendList> myPage = new MyPage<>(
                    lendList.getRecords(), pageNo, pageSize, lendList.getTotal()
            );
            return Result.success(myPage);
        }
    

Mapper层详情

  • xml方法
    这里Mapper主要用了Mybatis-plus自定义sql分页查询,查询条件整合
    方法传参:IPage<VO> page,@Param(Constants.WRAPPER) QueryWrapper<VO>
    方法返回:IPage<VO>
    /**
     * 多表分页查询加条件
     * @param page IPage
     * @param wrapper 查询条件
     * @return 返回IPage对象
     */
    IPage<LendList> getLendList(IPage<LendList> page, @Param(Constants.WRAPPER) Wrapper<LendList> wrapper);
    
    注意:
    这里的xml不需要parameterType
    在<where>中写${ew.sqlSegment}
    	<select id="getLendList" resultType="LendList">
            select lend_record.id, book_name, user_name, lend_time
            from lend_record
                     left join book b on b.id = lend_record.book_id
                     left join user u on u.id = lend_record.user_id
            <where>
                ${ew.sqlSegment}
            </where>
        </select>
    

Service层详情

  • Service层详情介绍
    封装查询条件
    使用的是wrapper.allEq(Map(String,Object) param,boolean null2IsNull);
    第二个参数为false是为了没有这个条件的时候查询语句没有xxx is null

    // 封装查询条件
    HashMap<String, Object> map = new HashMap<>(5);
    map.put("book_name", lendSearch.getBookName());
    map.put("user_name", lendSearch.getUserName());
    QueryWrapper<LendList> wrapper = new QueryWrapper<>();
    wrapper.allEq(map, false);
    

    分页查询
    注意 new Page<>(PageNo,pageSize);
    第三个参数为false,因为在mybatisplus默认查询时会查询主表的count,如果有条件则会报错(条件的字段在主表中没有)
    加上 page.setOptimizeCountSql(false);,他会对条件查询后的结果进行封装

    // 分页查询数据
    Page<LendList> page = new Page<>(pageNo, pageSize);
    // 对多表查询后的结果进行count(*)
    page.setOptimizeCountSql(false);
    IPage<LendList> lendList = lendRecordMapper.getLendList(page, wrapper);
    

    封装数据
    根据自定义VO,封装数据返回,前台需要三个数据,列表,当前页,页面大小,总条数
    count()方法是继承的IService中的方法

    // 封装数据返回
    MyPage<LendList> myPage = new MyPage<>(
            lendList.getRecords(), pageNo, pageSize, lendList.getTotal()
    );
    
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MyBatis-Plus 中,可以通过使用 @SqlResultSetMapping 注解和 @Query 注解来实现自定义返回对象的多分页查询。 首先,需要使用 @SqlResultSetMapping 注解定义定义返回对象。该注解的 name 属性指定了返回对象的名称,classes 属性指定了返回对象的属性。例如: ```java @SqlResultSetMapping(name = "UserAndOrderMapping", classes = { @ConstructorResult(targetClass = UserAndOrderDTO.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "name", type = String.class), @ColumnResult(name = "order_id", type = Long.class), @ColumnResult(name = "order_name", type = String.class) }) }) public class UserAndOrderDTO { private Long id; private String name; private Long orderId; private String orderName; public UserAndOrderDTO(Long id, String name, Long orderId, String orderName) { this.id = id; this.name = name; this.orderId = orderId; this.orderName = orderName; } // getters and setters } ``` 然后,在使用 @Query 注解时,需要指定 nativeQuery 属性为 true,示使用原生 SQL 查询。同时,需要将 @SqlResultSetMapping 注解的 name 属性值作为 resultClass 属性的值传入 @Query 注解。例如: ```java @Query(value = "SELECT u.id, u.name, o.id AS order_id, o.name AS order_name FROM user u LEFT JOIN order o ON u.id = o.user_id", countQuery = "SELECT COUNT(*) FROM user u LEFT JOIN order o ON u.id = o.user_id", nativeQuery = true, resultSetMapping = "UserAndOrderMapping") Page<UserAndOrderDTO> selectUserAndOrderPage(Page page); ``` 这样就可以实现自定义返回对象的多分页查询了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值