1. 程式人生 > >(六)springboot + mybatis plus實現多表聯查分頁3.X版本

(六)springboot + mybatis plus實現多表聯查分頁3.X版本

註明 : 上兩篇文章我們講解了springboot+mybatis-plus對於單表的CRUD和條件構造器的使用方法,但是對於我們的實戰專案中多表聯查也是經常會出現的。今天我們就來說下怎麼在springboot+MP模式下實現多表聯查並分頁。

MP推薦使用的是一種苞米豆團隊自己封裝好的分頁外掛,也就是PaginationInterceptor分頁攔截器,那麼下面我們整合分頁外掛,如果在專案使用使用過程中出現任何問題,下載原始碼觀看,可找到問題所在,如不能解決,可在下方部落格留言,看到留言後會幫你解決問題。

1 配置分頁外掛

package com.lqf.multitable.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
@MapperScan("com.lqf.multitable.dao.*")
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL執行效率外掛【生產環境可以關閉】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }

    /*
     * 分頁外掛,自動識別資料庫型別 多租戶,請參考官網【外掛擴充套件】
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }


}

分頁外掛配置好後,需要在專案中自動生成各個層級程式碼,在這裡我就不闡述自動生成的過程了,如果有不知道的童鞋可觀看我MP第三篇博文

由於在多表聯查的情況下可能會出現返回不同表的欄位,當自動生成的表不能滿足你的返回條件時,需要我們自動生成一個返回實體。下面實體是包括使用者表和角色表的兩張返回實體。

2 建立返回實體

package com.lqf.multitable.bean.crm;

import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * @author : lqf
 * @Description :
 * @date : Create in 18:14 2018/10/3
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRoleVo {

    private Long userId;

    /**
     * 建立時間
     */
    private LocalDateTime createTime;

    /**
     * 修改時間
     */
    private LocalDateTime updateTime;

    /**
     * 賬號
     */
    private String username;

    /**
     * 密碼
     */
    private String password;

    /**
     * 姓名
     */
    private String realname;

    /**
     * 性別(0為女 1為男)
     */
    private Integer sex;

    /**
     * 手機號
     */
    private String mobile;

    /**
     * 密碼加密串
     */
    private String passwordMd5;

    /**
     * 開賬號人
     */
    private Long parentId;

    /**
     * 是否禁用 0否 1是
     */
    private Integer status;

    /**
     * 授權大區
     */
    private String authArea;

    /**
     * 授權城市
     */
    private String authCity;

    private Integer role;

    /**
     * 使用者剩餘卡數
     */
    private Integer residueCardNumber;

    /**
     * 最後登入時間
     */
    private LocalDateTime lastLoginTime;

    /**
     * 最後登入ip地址
     */
    private String lastLoginIp;

    /**
     * 最後登入次數
     */
    private Integer lastLoginCount;

    /**
     * 渠道
     */
    private String authChannel;

    /**
     * 0 外網 1 內網
     */
    private Integer internet;

    /**
     * 金幣
     */
    private Long goldCoin;

    private Long id;

    /**
     * 狀態
     */
    private String statusId;

    /**
     * 角色名
     */
    private String roleName;

    /**
     * 角色值
     */
    private String roleValue;

    /**
     * 能新增的下屬角色值
     */
    private String addibleValue;
}

3 測試Test

package com.lqf.multitable;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.service.crm.FyUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisPlusMultiTableApplicationTests {

    @Autowired
    private FyUserService service;

    /**
     * 聯表查詢並分頁
     */
    @Test
    public void contextLoads() {
        // 當前頁,總條數 構造 page 物件
        Page<UserRoleVo> page = new Page<>(1, 10);
        page.setRecords(service.selectUserListPage(page));
        System.out.println(page);
    }

}

4 service層

package com.lqf.multitable.service.crm.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.dao.crm.FyUserMapper;
import com.lqf.multitable.service.crm.FyUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服務實現類
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */
@Service
public class FyUserServiceImpl extends ServiceImpl<FyUserMapper, FyUser> implements FyUserService {

    @Override
    public List<UserRoleVo> selectUserListPage(Page<UserRoleVo> page) {
        return this.baseMapper.selectUserListPage(page);
    }
}

注意這裡的baseMapper不是你自己定義的,直接通過this.baseMapper呼叫就可以,這個是封裝好的。

5mapper層

package com.lqf.multitable.dao.crm;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lqf.multitable.bean.crm.UserRoleVo;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * <p>
 *  Mapper 介面
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */
@Repository
public interface FyUserMapper extends BaseMapper<FyUser> {


    @Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
    List<UserRoleVo> selectUserListPage(Page<UserRoleVo> pagination);

}

上方程式碼我直接通過註解進行了sql查詢,你也可以通過mapper.xml進行,這裡無需設定分頁條件,會自動進行sql拼接,這裡要注意sql的結尾不要用;否自自動拼接limit無法完成

6 測試結果

==>  Preparing: SELECT COUNT(1) FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id 
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 391
==>  Preparing: SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10 
==> Parameters: 
<==    Columns: user_id, create_time, update_time, username, password, realname, sex, mobile, password_md5, parent_id, status, auth_area, auth_city, role, residue_card_number, last_login_time, last_login_ip, last_login_count, auth_channel, internet, gold_coin, id, status_id, create_time, update_time, role_name, role_value, addible_value
********* 這裡是查詢到的資訊,有隱私就不列印了
<==      Total: 10
Closing non transactional SqlSession [[email protected]]
[email protected]8c9
 Time:61 ms - ID:com.lqf.multitable.dao.crm.FyUserMapper.selectUserListPage
Execute SQL:SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10

上面的測試結果可以看出,總查詢條數391條,分頁後查詢limit 0,10
查詢耗時 61ms
到這裡通過MP的分頁外掛進行多表聯查並分頁就演示完成了,誠心接受大家的指正。

下一篇 : 待續