MyBatis-plus(下)

目录

静态工具

逻辑删除

枚举处理器

​编辑​编辑JSON处理器

分页插件

案例


静态工具

只有save与update不需要传class字节码

UserController:

MyServiceImpl:

改造根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址

java 复制代码
 @Override
    public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {
        //查询用户
        List<User> users = listByIds(ids);
        if (CollUtil.isEmpty(users)){
            return Collections.emptyList();
        }
        //查询地址
        //获取用户id集合
        List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
        //根据用户id查询地址
        List<Address> address = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();
        //转换地址vo
        List<AddressVO> addressVOList = BeanUtil.copyToList(address, AddressVO.class);
        //用户地址集合分组处理,相同用户的放入一个集合(组)中
        Map<Long, List<AddressVO>> addressMap=new HashMap<>(0);
        if (CollUtil.isNotEmpty(addressVOList)) {
            addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
        }

        //转VO返回
        List<UserVO> list=new ArrayList<>(users.size());
        for (User user : users) {
            UserVO vo = BeanUtil.copyProperties(user, UserVO.class);
            list.add(vo);
            vo.setAddresses(addressMap.get(user.getId()));
        }
        return list;
    }

逻辑删除

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:

java 复制代码
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted #全局逻辑制除的实体字段名,字段类型可以是boolean、integer
      logic-delete-value: 1 #逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 #逻辑未删除值(默认为 0)

逻辑删除本身也有自己的问题,比如:

  • 会导致数据库表垃圾数据越来越多,影响查询效率
  • SQL中全都需要对逻辑删除字段做判断,影响查询效率

因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法

枚举处理器

在application.yml中配置全局枚举处理器:

java 复制代码
mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
java 复制代码
package com.yjj.mp.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FROZEN(2, "冻结"),
    ;
    @EnumValue
    private final int value;
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

将类型改为UserStatus枚举类型

可以看到运行程序之后显示的是NORMAL,如果想要看到显示状态的话,就加上JsonValue注解

JSON处理器

写一个UserInfo类

java 复制代码
package com.yjj.mp.domain.po;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserInfo {
    private Integer age;
    private String intro;
    private String gender;
}

在User类上加上@TableName(value = "user",autoResultMap = true)

然后之前写的测试就要修改了

现在再测试的话

分页插件

首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件

MyBatisConfig配置类:

java 复制代码
package com.yjj.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        //创建分页插件
        PaginationInnerInterceptor paginationInnerInterceptor=new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(1000L);
        //添加分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

测试代码:

java 复制代码
 @Test
        void testPageQuery(){
            int pageNo=1,pageSize=10;
            //准备分页条件
            Page<User> page = Page.of(pageNo, pageSize);
            //排序条件
            page.addOrder(new OrderItem("balance",true));
            page.addOrder(new OrderItem("id",true));
            Page<User> p = myUserService.page(page);
            //解析
            long total = p.getTotal();
            System.out.println("total ="+total);
            long pages = p.getPages();
            System.out.println("pages ="+pages);
            List<User> users = p.getRecords();
            users.forEach(user -> System.out.println(user));
        }

案例

请求方式 GET

请求路径 /users/page

请求参数

"pageNo":1

"pageSize": 5,

"sortBy":"balance"

"isAsc":false,

"name": "jack",

"statub":1

返回值

特殊说明

如果排序字段为空,默认按照更新时间排序,排序字段不为空,则按照排序字段排序

controller层:

service接口层

先写个PageQuery,再让UserQuery继承PageQuery

java 复制代码
package com.yjj.mp.query;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {
    @ApiModelProperty("页码")
    private Integer pageNo=1;
    @ApiModelProperty("页码")
    private Integer pageSize=5;
    @ApiModelProperty("排序字段")
    private String  sortBy;
    @ApiModelProperty("是否升序")
    private Boolean isAsc=true;


    public <T> Page<T> toMapPage(OrderItem ... items){
        //分页查询
        Page<T> page = Page.of(pageNo, pageSize);
        //排序条件
        if (StrUtil.isNotEmpty(sortBy)) {
            //不为空
            page.addOrder(new OrderItem(sortBy, isAsc));
        }else if (items!=null){
            //为空,默认按照更新时间排序
            page.addOrder(items);
        }
        return page;
    }

    public <T> Page<T> toMapPage(String defaultSortBy,Boolean defaultAsc){
        return toMapPage(new OrderItem(defaultSortBy,defaultAsc));
    }

    public <T> Page<T> toMapPageDefaultSortByCreateTime(){
        return toMapPage(new OrderItem("create_time",false));
    }

    public <T> Page<T> toMapPageDefaultSortByUpdateTime(){
        return toMapPage(new OrderItem("update_time",false));
    }
}

PageDTO :

java 复制代码
package com.yjj.mp.domain.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Collections;
import java.util.List;

@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {
    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("集合")
    private List<T> list;

    public static <PO,VO> PageDTO<VO> of(Page<PO> p,Class<VO> clazz){
        PageDTO<VO> dto = new PageDTO<>();
        //总条数
        dto.setTotal(p.getTotal());
        //总页数
        dto.setPages(p.getPages());
        //当前页数据
        List<PO> records = p.getRecords();
        if (CollUtil.isEmpty(records)){
            dto.setList(Collections.emptyList());
            return dto;
        }
        List<VO> vos = BeanUtil.copyToList(records, clazz);
        dto.setList(vos);
        //返回

        return dto;
    }
}

service层:

java 复制代码
@Override
    public PageDTO<UserVO> queryUsersPage(UserQuery query) {
        String name = query.getName();
        Integer status = query.getStatus();
        //构建查询条件
        Page<User> page = query.toMapPageDefaultSortByUpdateTime();

        //分页查询
        Page<User> p = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .page(page);
        //封装VO结果
        return PageDTO.of(p,UserVO.class);
    }

努力遇见更好的自己!!!

相关推荐
追风林5 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨19 分钟前
El表达式和JSTL
java·el
duration~1 小时前
Maven随笔
java·maven
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
跃ZHD1 小时前
前后端分离,Jackson,Long精度丢失
java
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射
九圣残炎2 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge3 小时前
Netty篇(入门编程)
java·linux·服务器