目录
静态工具
逻辑删除
枚举处理器
编辑编辑JSON处理器
分页插件
案例
静态工具
只有save与update不需要传class字节码
UserController:
MyServiceImpl:
改造根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址
@Overridepublic 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();//转换地址voList<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、integerlogic-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, "冻结"),;@EnumValueprivate 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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();//创建分页插件PaginationInnerInterceptor paginationInnerInterceptor=new PaginationInnerInterceptor(DbType.MYSQL);paginationInnerInterceptor.setMaxLimit(1000L);//添加分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}
}
测试代码:
@Testvoid 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层:
@Overridepublic 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);}
努力遇见更好的自己!!!