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

 

posted @ 2021-01-25 14:39  遇到即是上上签  阅读(1260)  评论(0编辑  收藏  举报