MybatisPlus简单使用与自定义sql以及通过自定义sql实现多表联查的分页查询
创始人
2024-02-25 10:17:40
0

MybatisPlus简单使用与自定义sql以及通过自定义sql实现多表联查的分页查询

  • 前言
  • 1. mybatis的简单使用
  • 2. MybatisPlus 的简单使用
    • 2.1 入门
      • 2.1.1 简单配置
      • 2.1.2 入门例子
      • 2.1.3 测试
    • 2.2 MybatisPlus自带封装的增删改查
      • 2.2.1 傻瓜式使用
      • 2.2.2 批量添加数据
  • 3 MybatisPlus 动态查询sql
    • 3.1 QueryWrapper 或 LambdaQueryWrapper 条件构造器
      • 3.1.1 QueryWrapper
      • 3.1.2 LambdaQueryWrapper
    • 3.2 自定义 sql 语句
      • 3.2.1 xml方式
      • 3.2.2 @Select 注解
      • 3.2.3 LambdaQueryWrapperX 拼接sql
      • 3.2.4 @SelectProvider 注解
        • 3.2.4.1 直接 @SelectProvider
        • 3.2.4.2 QueryWrapper + @SelectProvider
          • 1. ${ew.customSqlSegment}
          • 2. ${ew.sqlSegment}
  • 4. 优化代码->统一一下返回格式
  • 5.MybatisPlus 实现分页( Page 与 IPage)
    • 5.1 对分页插件进行初始化配置
    • 5.2 使用分页例子
      • 5.2.1 简单免写sql分页
      • 5.2.2 优化-Page分页传参和返回结果统一格式
      • 5.2.3 简单分页测试->统一分页格式之后
    • 5.3 自定义sql实现分页
      • 5.3.1 @Select+ Page 实现分页查询
      • 5.3.2 @SelectProvider + Page 实现分页查询
        • 5.3.2.1 基本数据类型作为参数情况
        • 5.3.2.2 实体对象作为参数情况(注意)
    • 5.4 关于多表联查实现分页

前言

  • 之前介绍过mybatis,但是感觉缺少点什么,所以想想还是周末抽空写了点把mybatisplus给补上

1. mybatis的简单使用

  • 关于mybatis自定义枚举类型的转换器相关的点,可以看下面的文章
    mybatis自定义枚举类型的转换器以及各种使用场景.
  • 关于mybatis使用插件pagehelper分页的,这个看文章:
    springboot项目前后端分离:统一返回数据格式+mybatis 分页.

2. MybatisPlus 的简单使用

2.1 入门

  • 下面是以spring boot项目为例简单做简单的例子介绍

2.1.1 简单配置

  • 如下
    1. pom 依赖
      com.baomidoumybatis-plus-boot-starter3.5.2
      
      
      在这里插入图片描述
    2. 配置,入门配置所以配的很简单
      mybatis-plus:configuration:map-underscore-to-camel-case: true
      
    在这里插入图片描述

2.1.2 入门例子

  1. 实体:DogEntity.java
    package com.liu.susu.pojo.entity;import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;@TableName("dog")
    @Data
    public class DogEntity {@TableId(type = IdType.ASSIGN_ID)private String id;private String dogName;private String dogSex;private String kennelsNum;}
    
  2. DogMapper.java(直接extends BaseMapper,后面简单的sql就不用写了,页不用写xml文件了)
    package com.liu.susu.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.liu.susu.pojo.entity.DogEntity;
    import org.apache.ibatis.annotations.Mapper;@Mapper
    public interface DogMapper extends BaseMapper {}
    
    在这里插入图片描述
  3. DogService.java
    在这里插入图片描述
  4. DogServiceImpl.java
    在这里插入图片描述
  5. DogController.java
    在这里插入图片描述

2.1.3 测试

  • 如下:
    在这里插入图片描述

2.2 MybatisPlus自带封装的增删改查

2.2.1 傻瓜式使用

  1. 上面我们已经介绍了一个查询,其实没啥可说的,想用什么方法直接就能.出来,我们这里就提一嘴:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2.2 批量添加数据

  1. 主要向想说的是另外一个,批量添加,怎么用自带的方法实现批量插入数据,看下面介绍:
    • ① 修改DogService.java,如下:
      在这里插入图片描述
    • ② 修改DogServiceImpl.java,如下:
      在这里插入图片描述
  2. 修改完上述代码怎么用,下面来个测试看看
    • 代码:
      在这里插入图片描述
    • 效果:
      在这里插入图片描述
      在这里插入图片描述
  3. 注意:
  • 上述例子插入的数据量少,如果批量插入数据量多的话,可以换个方法控制每次插入的条数:
    在这里插入图片描述

3 MybatisPlus 动态查询sql

3.1 QueryWrapper 或 LambdaQueryWrapper 条件构造器

3.1.1 QueryWrapper

  • 傻瓜式使用操作,直接给图看吧:
    在这里插入图片描述

3.1.2 LambdaQueryWrapper

  • 如图:
    在这里插入图片描述

3.2 自定义 sql 语句

3.2.1 xml方式

  • 太常用了,不介绍了,看mybatis

3.2.2 @Select 注解

  • 直接看图:
    在这里插入图片描述

3.2.3 LambdaQueryWrapperX 拼接sql

  • 如图:
    在这里插入图片描述
    在这里插入图片描述

3.2.4 @SelectProvider 注解

3.2.4.1 直接 @SelectProvider

  1. DogProvide.java
    在这里插入图片描述

  2. DogMapper.java
    在这里插入图片描述

  3. DogServiceImpl.java
    在这里插入图片描述

  4. 看效果:
    在这里插入图片描述

3.2.4.2 QueryWrapper + @SelectProvider

1. ${ew.customSqlSegment}
  • ${ew.customSqlSegment} 自动拼接上where 关键字
  • DogProvide.java
    在这里插入图片描述
  • DogMapper.java
    在这里插入图片描述
  • DogServiceImpl.java
    在这里插入图片描述
  • 看效果:
    在这里插入图片描述
2. ${ew.sqlSegment}
  • ${ew.sqlSegment} 是不拼接 where 关键字的条件sql
    在这里插入图片描述
    在这里插入图片描述

4. 优化代码->统一一下返回格式

  1. ResponseCode.java
    package com.liu.susu.common;/*** description* @author susu**/
    public enum ResponseCode {SUCCESS_000000("000000","操作成功"),INSERT_SUCCESS("000000","新增成功"),UPDATE_SUCCESS("000000","修改成功"),DELETE_SUCCESS("000000","删除成功"),SELECT_SUCCESS("000000","查询成功"),SELECT_SUCCESS_NO_DATA("000001","查无数据"),INSERT_FAIL("100000","新增失败"),UPDATE_FAIL("100000","修改失败"),DELETE_FAIL("100000","删除失败"),SELECT_FAIL("100000","查询失败"),FAIL_NO_PARAM("200001","参数不能为空"),FAIL_999998("999998","操作失败"),FAIL_999999("999999","系统异常");private final String code;private final String message;ResponseCode(String code, String message){this.code = code;this.message = message;}public String getCode(){return code;}public String getMessage(){return message;}}
    
  2. ResponseData.java
    package com.liu.susu.common;import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.apache.commons.lang.StringUtils;/*** description* @author susu**/
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class ResponseData {private String code;private String message;private T data;public static ResponseData returnResult(){return returnResult(ResponseCode.SUCCESS_000000);//默认成功}public static ResponseData returnResult(ResponseCode responseCode) {ResponseData responseData = new ResponseData<>();responseData.setCode(responseCode.getCode());responseData.setMessage(responseData.getMessage());return responseData;}public static ResponseData returnResult(ResponseCode responseCode, String message) {ResponseData responseData = new ResponseData<>();responseData.setCode(responseCode.getCode());message = StringUtils.isNotEmpty(message)?message: responseCode.getMessage();responseData.setMessage(message);return responseData;}public static ResponseData returnResult(ResponseCode responseCode, T data) {ResponseData responseData = returnResult(responseCode);responseData.setData(data);return responseData;}public static  ResponseData returnResult(T data) {return returnResult(ResponseCode.SUCCESS_000000,data);}
    }
    

5.MybatisPlus 实现分页( Page 与 IPage)

5.1 对分页插件进行初始化配置

  • 使用 Page 与 IPage进行分页时,需要先配置
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    先配置,否则分页不生效,配置如下:
    package com.liu.susu.common.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    @MapperScan("com.liu.susu.mapper")
    public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    //        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件return mybatisPlusInterceptor;}}

5.2 使用分页例子

5.2.1 简单免写sql分页

  1. 代码如下:

    • DogServiceImpl.java
      在这里插入图片描述
      public IPage getDogPageList_1(int pageNo,int pageSize){Page page = new Page(pageNo,pageSize);IPage pageResult = dogMapper.selectPage(page, null);return pageResult;}
      
    • DogController.java
      在这里插入图片描述
  2. 效果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.2.2 优化-Page分页传参和返回结果统一格式

  1. MyPageParam.java

    package com.liu.susu.common.page;import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;import java.io.Serializable;@ApiModel("分页参数")
    @Data
    public class MyPageParam implements Serializable {private static final Integer PAGE_NO = 1;private static final Integer PAGE_SIZE = 10;@ApiModelProperty(value = "页码", required = true,example = "1")private Integer pageNo = PAGE_NO;@ApiModelProperty(value = "每页条数", required = true, example = "10")private Integer pageSize = PAGE_SIZE;}
    
  2. MyServletUtils.java
    在这里插入图片描述

    package com.liu.susu.common.utils;import cn.hutool.core.convert.Convert;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;public class MyServletUtils {public static Integer getParameterToInt(String name) {RequestAttributes attributes = RequestContextHolder.getRequestAttributes();ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;HttpServletRequest request = servletRequestAttributes.getRequest();//获取requestObject value = request.getParameter(name);return Convert.toInt(value);}}
    
  3. MyPageResult.java

    package com.liu.susu.common.page;import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    import lombok.NoArgsConstructor;import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;@NoArgsConstructor
    @Data
    public final class MyPageResult implements Serializable {@ApiModelProperty(value = "数据", required = true)private List list;@ApiModelProperty(value = "总量", required = true)private Long total;public MyPageResult(List list, Long total) {this.list = list;this.total = total;}public MyPageResult(Long total) {this.list = new ArrayList<>();this.total = total;}public static  MyPageResult empty() {return new MyPageResult<>(0L);}public static  MyPageResult empty(Long total) {return new MyPageResult<>(total);}}
  4. MyPageUtils.java

    package com.liu.susu.common.utils;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.liu.susu.common.page.MyPageParam;
    import com.liu.susu.common.page.MyPageResult;
    import java.util.List;/*** description 分页工具类* @author susu**/
    public class MyPageUtils {public static final String PAGE_NO = "pageNo";public static final String PAGE_SIZE = "pageSize";public static MyPageParam getMyPageParam() {MyPageParam myPageParam = new MyPageParam();myPageParam.setPageNo(MyServletUtils.getParameterToInt(PAGE_NO));myPageParam.setPageSize(MyServletUtils.getParameterToInt(PAGE_SIZE));return myPageParam;}public static  Page getMyPage(){MyPageParam myPageParam = getMyPageParam();Integer pageNo = myPageParam.getPageNo();Integer pageSize = myPageParam.getPageSize();if (pageNo!=null && pageSize!=null){Page page = new Page<>(myPageParam.getPageNo(), myPageParam.getPageSize());return page;}return null;}public static  MyPageResult getMyPageResult(IPage pageResult){if (pageResult != null) {return new MyPageResult<>(pageResult.getRecords(), pageResult.getTotal());}return new MyPageResult<>(null);//没有分页}/*** description :获取分页结果* @param page* @param list* @author susu*/public static  MyPageResult getMyPageResult(Page page, List list){if (page != null) {page.setRecords(list);return new MyPageResult<>(page.getRecords(), page.getTotal());}return new MyPageResult<>(list, null);//没有分页}}

5.2.3 简单分页测试->统一分页格式之后

  • 代码如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 效果:
    在这里插入图片描述

5.3 自定义sql实现分页

5.3.1 @Select+ Page 实现分页查询

  • 太简单,直接给图:

    • DogMapper.java(备注:Page page 可以不用加注解@Param
      在这里插入图片描述
    • DogServiceImpl.java
      在这里插入图片描述
    • DogController.java在这里插入图片描述
  • 效果:
    在这里插入图片描述
    在这里插入图片描述

5.3.2 @SelectProvider + Page 实现分页查询

  • 首先先来个vo–>DogInfoVo.java
    package com.liu.susu.pojo.vo;import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;@Data
    @ApiModel("狗狗信息vo")
    public class DogInfoVo {@ApiModelProperty("id")private String id;@ApiModelProperty("狗狗姓名")private String dogName;@ApiModelProperty("所在犬舍名")private String kennelsName;}
    

5.3.2.1 基本数据类型作为参数情况

  1. 代码如下:
    • DogProvide2.java + DogMapper2.java
      在这里插入图片描述
    • DogController2.java
      在这里插入图片描述
      @ApiOperationSupport(author = "浪花们",order = 1)@ApiOperation(value = "查询狗狗")@ResponseBody@GetMapping("/selectDogs")public ResponseData> selectDogs(@RequestParam("kennelsName") String kennelsName){Page myPage = MyPageUtils.getMyPage();List dogInfoList = dogMapper2.selectDogs(myPage,kennelsName);return ResponseData.returnResult(MyPageUtils.getMyPageResult(myPage,dogInfoList));}
      
  2. 效果如下:
    在这里插入图片描述
    在这里插入图片描述

5.3.2.2 实体对象作为参数情况(注意)

  1. 代码如下:
    • DogProvide2.java
      在这里插入图片描述
    • DogMapper2.java
      在这里插入图片描述
  2. 效果如下:
    在这里插入图片描述
    在这里插入图片描述

5.4 关于多表联查实现分页

  • 上面5.3.2 已经实现,可以再点回去看看,还要自定义sql的其实都可以实现多表联查实现分页的,在此不多说了,自己试试吧。
  • 好了,愿每个周末是充实的而不是毫无意义的!

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...