SpringCloud——MybatisPlus

打印 上一主题 下一主题

主题 1988|帖子 1988|积分 5964

一、快速入门

1.引入相干依赖


2.界说Mapper接口并继承BaseMapper

 二、常见注解


1.MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息


2.@TableName:用来指定表名

3.@TableId:用来指定表中的关键字段信息


4.@TableField:用来指定表中的平凡字段信息

    

三、常见设置


四、条件构造器


注意:
1.QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
2.UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
3.尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,制止硬编码
五、自界说SQL

利用MyBatisPlus的Wrapper来构建复杂的where条件,然后本身界说SQL语句中剩下的部分
1.基于Wrapper构建where条件


2.在mapper方法参数用Param注解声明Wrapper变量名称,必须是ew


3.自界说SQL,并实用Wrapper条件


 六、IService接口

1、继承实现结构



2、Lambda

查询相干操作:
  1. @Override
  2.     public  List<User> complexSearch(String name, Integer status, Integer minBalance, Integer maxBalance) {
  3.        return lambdaQuery().like(name != null, User::getUsername, name)
  4.                 .eq(status != null, User::getStatus, status)
  5.                 .ge(minBalance != null, User::getBalance, minBalance)
  6.                 .le(maxBalance != null, User::getBalance, maxBalance).list();
  7.     }
复制代码
更新相干操作:
  1. @Override
  2.     public void minusMoneyById(Long id, Long money) {
  3.         //通过id查找用户
  4.         User userById = this.getById(id);
  5.         if (userById == null) {
  6.             throw new RuntimeException("扣减失败,用户不存在");
  7.         }
  8.         //判断用户状态
  9.         if (userById.getStatus() == 2) {
  10.             throw new RuntimeException("扣减失败,用户被冻结");
  11.         }
  12.         //判断账户余额
  13.         if (userById.getBalance() == 0 || userById.getBalance() < money) {
  14.             throw new RuntimeException("扣减失败,余额不足");
  15.         }
  16.         long updateBalance = userById.getBalance() - money;
  17.         //baseMapper.minusMoneyById(id, money);
  18.         lambdaUpdate().set(User::getBalance, updateBalance).set(updateBalance==0,User::getStatus,2).eq(User::getId,id).update();
  19.     }
复制代码
批量新增相干操作:
开启rewriteBatchedStatements=true
  1. spring:
  2.   datasource:
  3.     url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
复制代码

3、静态工具

相干依赖:
  1.         <dependency>
  2.             <groupId>com.baomidou</groupId>
  3.             <artifactId>mybatis-plus-boot-starter</artifactId>
  4.             <version>3.5.6</version>
  5.         </dependency>
复制代码
相干代码:
  1. @Override
  2.     public UserVO selectUserAndAddress(Long id) {
  3.         //根据id查询用户
  4.         UserVO userVO = new UserVO();
  5.         User selectUserById = this.lambdaQuery().eq(User::getId, id).one();
  6.         if (selectUserById == null||selectUserById.getStatus() == 2) {
  7.             throw new RuntimeException("用户状态异常");
  8.         }
  9.         BeanUtils.copyProperties(selectUserById, userVO);
  10.         //根据用户id查询地址
  11.         List<Address> adressList = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();
  12.         if (adressList != null && adressList.size() > 0) {
  13.             ArrayList<AddressVO> addressVOS = new ArrayList<>();
  14.             for (Address address : adressList) {
  15.                 AddressVO addressVO = new AddressVO();
  16.                 BeanUtils.copyProperties(address, addressVO);
  17.                 addressVOS.add(addressVO);
  18.             }
  19.             userVO.setAddresses(addressVOS);
  20.         }
  21.         return userVO;
  22.     }
复制代码
4、逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据

缺点:使用逻辑删除后,会导致数据库表垃圾数据越来越多,SQL中全都需要对逻辑删除字段做判断,影响查询效率
5、枚举处置惩罚器

mybatisPlus提供了一个处置惩罚枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。
界说枚举:
  1. package com.itheima.mp.enums;
  2. import com.baomidou.mybatisplus.annotation.EnumValue;
  3. import com.fasterxml.jackson.annotation.JsonValue;
  4. public enum UserStatus {
  5.     Normal(1,"正常"),
  6.     FROZON(2,"冻结"),
  7.     ;
  8.     @EnumValue
  9.     private final int value;
  10.     @JsonValue
  11.     private final String desc;
  12.     UserStatus(int value, String desc) {
  13.         this.value = value;
  14.         this.desc = desc;
  15.     }
  16. }
复制代码
设置枚举处置惩罚器:
  1. mybatis-plus:
  2.   configuration:
  3.     default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
复制代码
6、Json处置惩罚器

将数据库中字符串的数据转换为实体对象
界说实体类:
  1. package com.itheima.mp.domain.po;
  2. import lombok.Data;
  3. @Data
  4. public class UserInfo {
  5.     private Integer age;
  6.     private String intro;
  7.     private String gender;
  8. }
复制代码
使用处置惩罚器:
  1. package com.itheima.mp.domain.po;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
  4. import com.itheima.mp.enums.UserStatus;
  5. import lombok.Data;
  6. import java.time.LocalDateTime;
  7. @Data
  8. // @TableName(value = "myuser")
  9. @TableName( autoResultMap = true)
  10. public class User {
  11.     /**
  12.      * 用户id
  13.      */
  14.     @TableId(type = IdType.AUTO)
  15.     private Long id;
  16.     /**
  17.      * 用户名
  18.      */
  19.     private String username;
  20.     /**
  21.      * 密码
  22.      */
  23.     private String password;
  24.     /**
  25.      * 注册手机号
  26.      */
  27.     private String phone;
  28.     /**
  29.      * 详细信息
  30.      */
  31.     //private String info;
  32.     @TableField(typeHandler = JacksonTypeHandler.class)
  33.     private UserInfo info;
  34.     /**
  35.      * 使用状态(1正常 2冻结)
  36.      */
  37.     //@TableField(value = "status")
  38.     private UserStatus status;
  39.     /**
  40.      * 账户余额
  41.      */
  42.     //@TableField(exist = false)
  43.     private Integer balance;
  44.     /**
  45.      * 创建时间
  46.      */
  47.     private LocalDateTime createTime;
  48.     /**
  49.      * 更新时间
  50.      */
  51.     private LocalDateTime updateTime;
  52. }
复制代码


7、分页插件

设置插件:
  1. package com.itheima.mp.domain.config;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class MybatisConfig {
  9.     @Bean
  10.     public MybatisPlusInterceptor mybatisPlusInterceptor(){
  11.         // 初始化核心插件
  12.         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  13.         // 添加分页插件
  14.         interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  15.         return interceptor;
  16.     }
  17. }
复制代码

分页API:
  1. @Test
  2.     void testPage(){
  3.         Page<User> myPage = Page.of(3, 2);
  4.         Page<User> pageFromDatabase = userServiceImpl.page(myPage);
  5.         for (User user : pageFromDatabase.getRecords()) {
  6.             System.out.println(user);
  7.         }
  8.     }
复制代码
分页参数实体:
  1. package com.itheima.mp.domain.query;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.baomidou.mybatisplus.core.metadata.OrderItem;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import io.swagger.annotations.ApiModel;
  6. import io.swagger.annotations.ApiModelProperty;
  7. import lombok.Data;
  8. @Data
  9. @ApiModel(description = "分页查询相关实体")
  10. public class PageQuery {
  11.     @ApiModelProperty("页码")
  12.     private Integer pageNo=1;
  13.     @ApiModelProperty("页码")
  14.     private Integer pageSize=5;
  15.     @ApiModelProperty("牌序字段")
  16.     private String sortBy;
  17.     @ApiModelProperty("是否升序")
  18.     private Boolean isAsc;
  19.     public <T> Page<T> toMpPage(OrderItem ... orderItems) {
  20.         //分页条件
  21.         Page<T> page = Page.of(pageNo, pageSize);
  22.         //排序依靠、排序方式
  23.         //排序字段不为空
  24.         if  (StrUtil.isNotBlank(sortBy)) {
  25.             page.addOrder(new OrderItem().setColumn(sortBy).setAsc(isAsc));
  26.         }else {
  27.             page.addOrder(orderItems);
  28.         }
  29.         return page;
  30.     }
  31.     public <T> Page<T> toMpPageDefaultOrderByCreateTime(){
  32.         return toMpPage(new OrderItem().setColumn("create_time").setAsc(false));
  33.     }
  34.     public <T> Page<T> toMpPageDefaultOrderByUpdateTime(){
  35.         return toMpPage(new OrderItem().setColumn("update_time").setAsc(false));
  36.     }
  37.     public <T> Page<T> toMpPage(String sortBy, Boolean isAsc) {
  38.         return toMpPage(new OrderItem().setColumn(sortBy).setAsc(isAsc));
  39.     }
  40. }
复制代码
实体类继承分页参数实体:
  1. package com.itheima.mp.domain.query;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import io.swagger.annotations.ApiModel;
  4. import io.swagger.annotations.ApiModelProperty;
  5. import lombok.Data;
  6. @Data
  7. @ApiModel(description = "用户查询条件实体")
  8. public class UserQuery extends PageQuery {
  9.     @ApiModelProperty("用户名关键字")
  10.     private String name;
  11.     @ApiModelProperty("用户状态:1-正常,2-冻结")
  12.     private Integer status;
  13.     @ApiModelProperty("余额最小值")
  14.     private Integer minBalance;
  15.     @ApiModelProperty("余额最大值")
  16.     private Integer maxBalance;
  17. }
复制代码
同一响应返回实体:
  1. package com.itheima.mp.domain.dto;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import java.util.Collections;
  8. import java.util.List;
  9. import java.util.function.Function;
  10. import java.util.stream.Collectors;
  11. @Data
  12. @NoArgsConstructor
  13. @AllArgsConstructor
  14. public class PageDTO<V> {
  15.     private Long total;
  16.     private Long pages;
  17.     private List<V> list;
  18.     /**
  19.      * 返回空分页结果
  20.      * @param p MybatisPlus的分页结果
  21.      * @param <V> 目标VO类型
  22.      * @param <P> 原始PO类型
  23.      * @return VO的分页对象
  24.      */
  25.     public static <V, P> PageDTO<V> empty(Page<P> p){
  26.         return new PageDTO<>(p.getTotal(), p.getPages(), Collections.emptyList());
  27.     }
  28.     /**
  29.      * 将MybatisPlus分页结果转为 VO分页结果
  30.      * @param p MybatisPlus的分页结果
  31.      * @param voClass 目标VO类型的字节码
  32.      * @param <V> 目标VO类型
  33.      * @param <P> 原始PO类型
  34.      * @return VO的分页对象
  35.      */
  36.     public static <V, P> PageDTO<V> of(Page<P> p, Class<V> voClass) {
  37.         // 1.非空校验
  38.         List<P> records = p.getRecords();
  39.         if (records == null || records.size() <= 0) {
  40.             // 无数据,返回空结果
  41.             return empty(p);
  42.         }
  43.         // 2.数据转换
  44.         List<V> vos = BeanUtil.copyToList(records, voClass);
  45.         // 3.封装返回
  46.         return new PageDTO<>(p.getTotal(), p.getPages(), vos);
  47.     }
  48.     /**
  49.      * 将MybatisPlus分页结果转为 VO分页结果,允许用户自定义PO到VO的转换方式
  50.      * @param p MybatisPlus的分页结果
  51.      * @param convertor PO到VO的转换函数
  52.      * @param <V> 目标VO类型
  53.      * @param <P> 原始PO类型
  54.      * @return VO的分页对象
  55.      */
  56.     public static <V, P> PageDTO<V> of(Page<P> p, Function<P, V> convertor) {
  57.         // 1.非空校验
  58.         List<P> records = p.getRecords();
  59.         if (records == null || records.size() <= 0) {
  60.             // 无数据,返回空结果
  61.             return empty(p);
  62.         }
  63.         // 2.数据转换
  64.         List<V> vos = records.stream().map(convertor).collect(Collectors.toList());
  65.         // 3.封装返回
  66.         return new PageDTO<>(p.getTotal(), p.getPages(), vos);
  67.     }
  68. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表