目录
静态工具
只有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);
}
努力遇见更好的自己!!!