注明 : 上兩篇文章我們講解了springboot+mybatis-plus對于單表的CRUD和條件構造器的使用方法,但是對于我們的實戰項目中多表聯查也是經常會出現的。今天我們就來說下怎麼在springboot+MP模式下實作多表聯查并分頁。
項目源碼下載下傳位置 | gitee
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的分頁插件進行多表聯查并分頁就示範完成了,誠心接受大家的指正。
上一篇 : (五)springboot + mybatis plus強大的條件構造器queryWrapper、updateWrapper
下一篇 : 待續