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


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

相关推荐

  1. MyBatis-Plus

    2024-07-09 17:10:11       28 阅读
  2. MyBatis-plus

    2024-07-09 17:10:11       36 阅读
  3. Mybatis-Plus

    2024-07-09 17:10:11       34 阅读
  4. mybatis-plus

    2024-07-09 17:10:11       18 阅读

最近更新

  1. Vue3替代vue2就好比自动驾驶代替出租网约车

    2024-07-09 17:10:11       0 阅读
  2. 如何学习计算机

    2024-07-09 17:10:11       0 阅读
  3. 【大数据面试题】38 说说 Hive 怎么行转列

    2024-07-09 17:10:11       0 阅读
  4. 10步职业进阶:全新霍兰德自我提升计划

    2024-07-09 17:10:11       0 阅读
  5. Nginx系列-4 proxy_pass使用和路径拼接问题

    2024-07-09 17:10:11       0 阅读
  6. ASPICE在汽车软件开发中的作用

    2024-07-09 17:10:11       0 阅读

热门阅读

  1. C++多线程学习笔记

    2024-07-09 17:10:11       8 阅读
  2. 实现基于Spring Cloud的事件驱动微服务

    2024-07-09 17:10:11       8 阅读
  3. js使用websocket,vue使用websocket,copy即用

    2024-07-09 17:10:11       6 阅读
  4. PostgreSQL的扩展(extensions)-常用的扩展-pg_profile

    2024-07-09 17:10:11       5 阅读
  5. Spring Boot整合MongoDB实现事务管理

    2024-07-09 17:10:11       7 阅读
  6. Solana RPC 的工作原理

    2024-07-09 17:10:11       7 阅读
  7. 音频demo:使用faad2将AAC数据解码出PCM数据

    2024-07-09 17:10:11       6 阅读
  8. SQLAlchemy配置连接多个数据库

    2024-07-09 17:10:11       8 阅读
  9. Android C++系列:Linux常用函数和工具

    2024-07-09 17:10:11       5 阅读
  10. vb.net读取mssql的image字段后,如何转换成二进制

    2024-07-09 17:10:11       7 阅读
  11. 常用 Android 反编译工具apktooldex2jarenjarifyjd-guijadx

    2024-07-09 17:10:11       4 阅读
  12. Android Gradle 开发与应用 (十): Gradle 脚本最佳实践

    2024-07-09 17:10:11       9 阅读