mybatis-plus跨表條件查詢


mybatis-plus跨表自定義需求

1、建表

 #新建一個user表
 CREATE TABLE `user`(
  `id` INT(10) NOT NULL auto_increment,
  `name` VARCHAR(64) NOT NULL,
  `password` VARCHAR(64) NOT NULL,
  department_id INT(10),
  PRIMARY KEY(id)
 ),
 #新建一個department表
 CREATE TABLE department(
  `id` INT(10) NOT NULL auto_increment,
  dept_name VARCHAR(64) NOT NULL,
  PRIMARY KEY(id)
 )
 

2、創建工程,導入mybatis-plus即其他依賴

     <!--mybatis-plus依賴-->
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>3.4.2</version>
         </dependency>
         <!--mysql依賴-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
  <!--lombok-->
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
  <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
             <version>2.0.7</version>
         </dependency>

3.1、創User實體類

 /**
  * @author sfybxs
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @TableName("user")
 @ApiModel(value = "User對象" ,description = "用戶表")
 public class User implements Serializable {
     private Integer id;
     private String name;
     private String password;
     private Integer department_id;
 }

3.2、創department實體類

 /**
  * @author sfybxs
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @ApiModel(value = "Department對象",description = "部門表")
 @TableName("department")
 public class Department {
     private Integer id;
     private String dept_name;
 }

4、編寫mapper也是最重要的一部分

在resource下面創建一個mapper文件夾下面創建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.mjy.mapper.UserMapper">

sql語句

  <select id="findUserPage" resultType="User">
        SELECT u.id,u.`name`,u.`password`,u.department_id,
 d.dept_name AS `deptName`
 FROM `user` u
 INNER JOIN department d
 ON u.department_id = d.id
 ${ew.customSqlSegment}
     </select>
 </mapper>
     <select id="findUserPage">
        SELECT u.id,u.`name`,u.`password`,u.department_id,
 d.dept_name AS `deptName`
 FROM `user` u
 INNER JOIN department d
 ON u.department_id = d.id
 ${ew.customSqlSegment}
     </select>

mapper接口

 /**
  * <p>
  * 用戶表 Mapper 接口
  * </p>
  *
  * @author mjy
  * @since 2021-01-20
  */
 public interface UserMapper extends BaseMapper<User> {
 
     /**
      * 自定義多表查詢
      * @param page
      * @param wrapper
      * @return
      */
     IPage<User> findUserPage(Page<User> page,@Param(Constants.WRAPPER) QueryWrapper<User> wrapper);
 
 }
 

配置yml文件

 server:
  port: 8000
 spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 12345678
    url: jdbc:mysql://localhost:3306/mybatis_plus_test?userSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
 mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml
  type-aliases-package: com.mjy.entity

5、編寫service層代碼

service接口層代碼

 /**
  * @author sfybxs
  */
 public interface UserService extends IService<User> {
 
     /**
      *
       * @param userVo
      * @param wrapper 用來傳入參數到sql語句中
      * @return
      */
     List<User> findUserPage(UserVo userVo , @Param(Constants.WRAPPER) QueryWrapper wrapper);
 }

因為真正的業務的時候許需要通過多個字段進行查詢,是需要封裝一個vo(view object)來進行數據庫的查詢,因為沒設置這么多字段,所以,我的vo就三個字段,就通過賬號和密碼以及部門編號進行查詢,可以通過業務來修改vo中的屬性

 /**
  * @author sfybxs
  */
 @Data
 public class UserVo {
 
     private String name;
 
     private String password;
 
     private Integer departmentId;
 
 }

編寫一個utils類來判斷字段是否為空

 /**
  * @author sfybxs
  */
 public class UserUtils {
 
     public static QueryWrapper<User> getQueryWrapper(UserVo userVo){
         QueryWrapper queryWrapper = new QueryWrapper();
         if (userVo!=null){
             if (!StringUtils.isEmpty(userVo.getDepartmentId())){
                 queryWrapper.eq("department_id",userVo.getDepartmentId());
            }
             if (!StringUtils.isEmpty(userVo.getName())){
                 queryWrapper.eq("name",userVo.getName());
            }
             if (!StringUtils.isEmpty(userVo.getPassword())){
                 queryWrapper.eq("password",userVo.getPassword());
            }
        }
         return queryWrapper;
    }
 }

編寫service實現類

 @Service
 public class UserviceImpl extends ServiceImpl<UserMapper,User> implements UserService{
 
 
     @Override
     public List<User> findUserPage(UserVo userVo, QueryWrapper wrapper) {
         QueryWrapper<User> queryWrapper = UserUtils.getQueryWrapper(userVo);
         return this.baseMapper.findUserPage(queryWrapper);
    }
 }

6、controller根據自己的需求進行書寫

1.先要創建一個返回狀態嗎碼的接口

 /**
  * @author sfybxs
  */
 public interface CustomizeResultCode {
 
     /**
      * 獲取錯誤狀態碼
      * @return 錯誤狀態碼
      */
     Integer getCode();
 
     /**
      * 獲取錯誤信息
      * @return 錯誤信息
      */
     String getMessage();
 }

2.編寫實現類

 /**
  * @author sfybxs
  */
 
 public enum ResultCode implements CustomizeResultCode{
     /**
      * 20000:"成功"
      */
     SUCCESS(20000,"成功"),
 
 
     /**
      * 20001:"失敗"
      */
     ERROR(20001,"失敗"),
 
     /**
      * 3005:"密碼不正確!"
      */
     PASS_NOT_CORRECT(3005, "密碼不正確!請重新嘗試!"),
     /**
      * 3006:"算數異常"
      */
     ARITHMETIC_EXCEPTION(3006, "算數異常"),
     /**
      * 3007:"用戶不存在"
      */
     USER_NOT_FOUND_EXCEPTION(3007, "用戶不存在"),
 
     /**
      * 3007:"用戶不存在"
      */
     DEPT_NOT_FOUND_EXCEPTION(3008, "沒有查詢到部門信息"),
 
     /**
      * 3006:"尚未登錄!"
      */
     NOT_LOGIN(3006, "尚未登錄!"),
     /**
      * 2005:"沒有找到這一條歷史信息!有人侵入數據庫強制刪除了!"
      */
     INTRODUCTION_NOT_FOUND(2005, "沒有找到這一條歷史信息!有人侵入數據庫強制刪除了!"),
     /**
      * 404:沒有找到對應的請求路徑
      */
     PAGE_NOT_FOUND(404, "你要請求的頁面好像暫時飄走了...要不試試請求其它頁面?"),
     /**
      * 500:服務端異常
      */
     INTERNAL_SERVER_ERROR(500, "服務器冒煙了...要不等它降降溫后再來訪問?"),
     /**
      * 2001:未知異常
      */
     UNKNOW_SERVER_ERROR(2001, "未知異常,請聯系管理員!");
    ;
     private Integer code;
 
     private String message;
 
     ResultCode(Integer code, String message) {
         this.code = code;
         this.message = message;
    }
 
     @Override
     public Integer getCode() {
         return code;
    }
 
     @Override
     public String getMessage() {
         return message;
    }
 }

3.編寫一個公共返回的接口

 /**
  * 公共返回結果
  *
  * @author sfybxs
  */
 @Data
 public class Result {
 
 
     @ApiModelProperty(value = "是否成功")
     private boolean success;
 
 
     @ApiModelProperty(value = "返回碼")
     private Integer code;
 
     @ApiModelProperty(value = "返回消息")
     private String message;
 
     @ApiModelProperty(value = "返回數據")
     private Map<String, Object> data = new HashMap<>();
 
     /**
      * 構造方法私有化,里面的方法都是靜態方法
      * 達到保護屬性的作用
      */
     private Result() {
 
    }
 
     /**
      * 這里使用的是鏈式編程
      *
      * @return
      */
     public static Result ok() {
         Result result = new Result();
         result.setSuccess(true);
         result.setCode(ResultCode.SUCCESS.getCode());
         result.setMessage(ResultCode.SUCCESS.getMessage());
         return result;
    }
 
 
     public static Result error() {
         Result result = new Result();
         result.setSuccess(false);
         result.setCode(ResultCode.ERROR.getCode());
         result.setMessage(ResultCode.ERROR.getMessage());
         return result;
    }
 
     /**
      * 自定義返回成功與否
      *
      * @param success
      * @return
      */
     public Result success(boolean success) {
         this.setSuccess(success);
         return this;
    }
 
 
     public Result message(String message) {
         this.setMessage(message);
         return this;
    }
 
     public Result code(Integer code) {
         this.setCode(code);
         return this;
    }
 
     public Result data(String key, Object value) {
         this.data.put(key, value);
         return this;
    }
 
     public Result data(Map<String, Object> map) {
         this.data(map);
         return this;
    }
 
 
 }

4.編寫controller的測試類

 @RestController
 @Api(value = "用戶管理")
 public class UserController {
 
     @Autowired
     private UserService userService;
 
     @PostMapping("/findUserPage")
     public Result findUserPage(@RequestBody UserVo userVo){
         List<User> records = userService.findUserPage(userVo);
         return Result.ok().data("records",records);
    }
 
 }

7、測試結果

image-20210125143600565

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM