使用MyBatis-Plus實(shí)現(xiàn)聯(lián)表查詢分頁(yè)的示例代碼
前言
在本文中,我們將詳細(xì)介紹如何使用 MyBatis-Plus 的分頁(yè)插件在 XML 文件中實(shí)現(xiàn)聯(lián)表查詢的分頁(yè)功能。
環(huán)境準(zhǔn)備
項(xiàng)目環(huán)境
- Java 版本: 1.8+
- Spring Boot 版本: 2.x
- MyBatis-Plus 版本: 3.x
- 數(shù)據(jù)庫(kù): MySQL
添加依賴
確保你的項(xiàng)目中添加了 MyBatis-Plus 的相關(guān)依賴。如果你使用 Maven,可以在 pom.xml
文件中添加如下依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mybatis-plus</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 其他依賴 --> </dependencies>
配置數(shù)據(jù)庫(kù)連接
在 application.properties
或 application.yml
文件中配置數(shù)據(jù)庫(kù)連接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
實(shí)體類定義
首先,定義幾個(gè)基本的實(shí)體類:
User.java
package com.microsun.integrated.framework.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { private Long id; private String name; // Getters and Setters }
UserRole.java
package com.microsun.integrated.framework.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class UserRole { private Long userId; private Long roleId; // Getters and Setters }
Role.java
package com.microsun.integrated.framework.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Role { private Long id; private String roleName; // Getters and Setters }
RoleVo.java (用于展示的視圖對(duì)象)
package com.microsun.integrated.framework.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class RoleVo { private Long userId; private String roleName; // Getters and Setters }
分頁(yè)返回對(duì)象
為了封裝分頁(yè)返回的對(duì)象,我們定義了一個(gè) PageVO
類:
PageVO.java
package com.microsun.integrated.framework.domain; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor @Schema(title = "分頁(yè)") public class PageVO<T> { @Schema(title = "總數(shù)") private Long total; @Schema(title = "每頁(yè)顯示條數(shù)") private Long size; @Schema(title = "當(dāng)前頁(yè)") private Long current; @Schema(title = "數(shù)據(jù)列表") private List<T> records; }
請(qǐng)求參數(shù)封裝
接下來(lái),我們創(chuàng)建一個(gè) BO (Business Object) 對(duì)象來(lái)封裝請(qǐng)求參數(shù):
UserRoleQueryBO.java
package com.microsun.integrated.framework.domain; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 用戶角色查詢 BO */ @Data @NoArgsConstructor @AllArgsConstructor @Schema(title = "用戶角色查詢 BO") public class UserRoleQueryBO { /** * 用戶ID */ @Schema(title = "用戶ID") private Long userId; /** * 角色名稱 */ @Schema(title = "角色名稱") private String roleName; }
DAO 層
接口定義
在 DAO 層創(chuàng)建接口并定義分頁(yè)查詢方法:
UserMapper.java
package com.microsun.integrated.framework.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.microsun.integrated.framework.domain.RoleVo; import com.microsun.integrated.framework.domain.UserRoleQueryBO; import org.apache.ibatis.annotations.Param; public interface UserMapper { /** * 聯(lián)表查詢實(shí)現(xiàn)分頁(yè),根據(jù)用戶ID查詢用戶具有的角色列表 * 把聯(lián)表查詢得到的數(shù)據(jù)當(dāng)成一張單表來(lái)看 * * @param page 分頁(yè)對(duì)象 * @param bo 查詢條件對(duì)象 * @return 分頁(yè)后的角色列表 */ IPage<RoleVo> getUlserListByMulTable(@Param("page") IPage<RoleVo> page, @Param("bo") UserRoleQueryBO bo); }
映射文件
創(chuàng)建對(duì)應(yīng)的 XML 映射文件 UserMapper.xml
,并在其中編寫(xiě) SQL 查詢語(yǔ)句:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.microsun.integrated.framework.mapper.UserMapper"> <select id="getUlserListByMulTable" resultType="com.microsun.integrated.framework.domain.RoleVo"> select sr.role_name from sys_user su left join sys_user_role sur on su.id = sur.user_id left join sys_role sr on sur.role_id = sr.id where su.id = #{bo.userId} <if test="bo.roleName != null and bo.roleName != ''"> and sr.role_name like concat('%', #{bo.roleName}, '%') </if> <include refid="mp_limit_sql"/> </select> </mapper>
這里使用 <if>
標(biāo)簽來(lái)動(dòng)態(tài)拼接 SQL 語(yǔ)句,并使用 <include refid="mp_limit_sql"/>
來(lái)引用 MyBatis-Plus 提供的分頁(yè) SQL 語(yǔ)法。
Service 層
接口定義
定義 Service 接口:
UserService.java
package com.microsun.integrated.framework.service; import com.microsun.integrated.framework.domain.PageVO; import com.microsun.integrated.framework.domain.RoleVo; import com.microsun.integrated.framework.domain.UserRoleQueryBO; public interface UserService { /** * 獲取用戶角色列表 * * @param currentPage 當(dāng)前頁(yè)碼 * @param pageSize 每頁(yè)數(shù)量 * @param bo 查詢條件對(duì)象 * @return 分頁(yè)后的角色列表 */ PageVO<RoleVo> getUserRoleList(int currentPage, int pageSize, UserRoleQueryBO bo); }
實(shí)現(xiàn)類
實(shí)現(xiàn) Service 接口:
UserServiceImpl.java
package com.microsun.integrated.framework.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.microsun.integrated.framework.domain.PageVO; import com.microsun.integrated.framework.domain.RoleVo; import com.microsun.integrated.framework.domain.UserRoleQueryBO; import com.microsun.integrated.framework.mapper.UserMapper; import com.microsun.integrated.framework.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, RoleVo> implements UserService { @Autowired private UserMapper userMapper; @Override public PageVO<RoleVo> getUserRoleList(int currentPage, int pageSize, UserRoleQueryBO bo) { IPage<RoleVo> page = new Page<>(currentPage, pageSize); IPage<RoleVo> result = userMapper.getUlserListByMulTable(page, bo); PageVO<RoleVo> pageVO = new PageVO<>(); pageVO.setTotal(result.getTotal()); pageVO.setSize(result.getSize()); pageVO.setCurrent(result.getCurrent()); pageVO.setRecords(result.getRecords()); return pageVO; } }
Controller 層
創(chuàng)建 Controller 類來(lái)處理前端請(qǐng)求:
UserController.java
package com.microsun.integrated.framework.controller; import com.microsun.integrated.framework.domain.PageVO; import com.microsun.integrated.framework.domain.RoleVo; import com.microsun.integrated.framework.domain.UserRoleQueryBO; import com.microsun.integrated.framework.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/roles") public PageVO<RoleVo> getUserRoleList( @RequestParam(value = "currentPage", defaultValue = "1") int currentPage, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize, @RequestParam(value = "userId", required = false) Long userId, @RequestParam(value = "roleName", required = false) String roleName) { UserRoleQueryBO bo = new UserRoleQueryBO(userId, roleName); return userService.getUserRoleList(currentPage, pageSize, bo); } }
測(cè)試
現(xiàn)在你可以啟動(dòng) Spring Boot 應(yīng)用并測(cè)試你的分頁(yè)聯(lián)表查詢功能??梢酝ㄟ^(guò)發(fā)送 HTTP GET 請(qǐng)求到 /users/roles
來(lái)測(cè)試上述功能,例如:
GET /users/roles?currentPage=1&pageSize=2&userId=1&roleName=admin
GET /users/roles?currentPage=1&pageSize=2&userId=1
通過(guò)這個(gè)示例,你學(xué)會(huì)了如何封裝請(qǐng)求參數(shù),并在 MyBatis-Plus 的 XML 文件中使用這些封裝好的參數(shù)。這有助于保持代碼的整潔性和可維護(hù)性。
到此這篇關(guān)于使用MyBatis-Plus實(shí)現(xiàn)聯(lián)表查詢分頁(yè)的示例代碼的文章就介紹到這了,更多相關(guān)MyBatis-Plus 聯(lián)表查詢分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatisPlus 一對(duì)多、多對(duì)一、多對(duì)多的完美解決方案
這篇文章主要介紹了MyBatisPlus 一對(duì)多、多對(duì)一、多對(duì)多的完美解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Object類wait及notify方法原理實(shí)例解析
這篇文章主要介紹了Object類wait及notify方法原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Java中Comparable和Comparator兩種比較器的區(qū)別詳解
這篇文章主要介紹了Java中Comparable和Comparator兩種比較器的區(qū)別詳解,Comparable接口將比較代碼嵌入自身類中,像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實(shí)現(xiàn)了Comparable接口,這些類對(duì)象本身就支持和自己比較,需要的朋友可以參考下2023-09-09Java利用WatchService監(jiān)聽(tīng)文件變化示例
本篇文章主要介紹了Java利用WatchService監(jiān)聽(tīng)文件變化示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java利用正則取標(biāo)簽之間的數(shù)據(jù)
這篇文章主要介紹了Java利用正則取標(biāo)簽之間的數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Java文件字符輸入流FileReader讀取txt文件亂碼的解決
這篇文章主要介紹了Java文件字符輸入流FileReader讀取txt文件亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目
今天給大家普及如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目及配置tomcat的方法,在文末給大家提到如果不想每次都重啟tomcat,可以設(shè)置快捷方式,對(duì)idea新建Javaweb項(xiàng)目感興趣的朋友一起看看吧2021-06-06