MyBatis-plus(下)

目录

静态工具

逻辑删除

枚举处理器

​编辑​编辑JSON处理器 

分页插件

案例 



静态工具

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

UserController:

MyServiceImpl: 

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

 @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文件中配置逻辑删除的字段名称和值即可: 

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中配置全局枚举处理器: 

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

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类

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配置类:

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;
    }
}

测试代码:

 @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

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 :

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层:

@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);
    }


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

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码的小火龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值