目录
代码生成
静态工具
案例
@Override
public UserVO queryUserAndAddressById(long id) {
// 1.查询用户
User user = getById(id);
if (user == null || user.getStatus() == 2) {
throw new RuntimeException("用户状态异常");
}
// 2.查询地址
// 避免循环依赖
List<Address> list = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();
UserVO userVO = new UserVO();
BeanUtil.copyProperties(user, userVO);
if (CollUtil.isNotEmpty(list)) {
userVO.setAddresses(BeanUtil.copyToList(list, AddressVO.class));
}
// 2.查询地址
return userVO;
}
@Override
public List<UserVO> queryUsersAndAddress(List<Long> ids) {
List<User> users = listByIds(ids);
if (CollUtil.isEmpty(users)) {
return Collections.emptyList();
}
// 查询所有相关的地址列表,并按 userId 分组
Map<Long, List<Address>> addressMap = Db.lambdaQuery(Address.class)
.in(Address::getUserId, ids)
.list().stream()
.collect(Collectors.groupingBy(Address::getUserId));
// 使用 Stream API 转换 User 列表到 UserVO 列表,并关联地址信息
return users.stream().map(user -> {
UserVO userVO = new UserVO();
BeanUtil.copyProperties(user, userVO); // 复制 User 属性到 UserVO
// 使用 getOrDefault 避免 NullPointerException,并转换地址列表到 AddressVO 列表
List<AddressVO> addresses = addressMap.getOrDefault(user.getId(), Collections.emptyList()).stream()
.map(address -> {
AddressVO addressVO = new AddressVO();
BeanUtil.copyProperties(address, addressVO); // 复制 Address 属性到 AddressVO
return addressVO;
}).collect(Collectors.toList());
userVO.setAddresses(addresses); // 封装地址信息到 UserVO
return userVO;
}).collect(Collectors.toList());
}
逻辑删除
枚举处理器
@Getter
public enum UserStatus {
NORMAL(1,"正常"),
FROZEN(2,"冻结"),
;
@EnumValue
@JsonValue
private final int value;
private final String desc;
UserStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
Json处理器
分页插件功能
@Configuration
public class MyBatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
// 只有拦截功能
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 1.创建分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setMaxLimit(1000L);
// 2.添加分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
案例
@Override
public PageDTO<UserVO> queryUsersPage(UserQuery query) {
Page<User> page = new Page<>();
// 创建分页对象
if (query.getPageNo()!=null|| query.getPageSize()!=null){
page.setPages(query.getPageNo());
page.setSize(query.getPageSize());
}
// 添加排序,根据 query.getIsAsc() 的值确定升序或降序
if (query.getIsAsc()) {
page.addOrder(OrderItem.asc("balance")); // 升序
} else {
page.addOrder(OrderItem.desc("balance")); // 降序
}
// 创建查询条件
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
if (StrUtil.isNotEmpty(query.getName())) {
queryWrapper.like(User::getUsername, query.getName());
}
queryWrapper.eq(User::getStatus, UserStatus.NORMAL);
Page<User> page1= userMapper.selectPage(page, queryWrapper);
PageDTO<UserVO> pageDTO = new PageDTO<>();
pageDTO.setList(BeanUtil.copyToList(page1.getRecords(), UserVO.class));
// 总条数
pageDTO.setTotal(page1.getTotal());
// 总页数
pageDTO.setPages(page1.getPages());
// 执行分页查询并返回结果
return pageDTO;
}
封装转换方法
@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> toMpPage(OrderItem ... orders){
// 1.分页条件
Page<T> p = Page.of(pageNo, pageSize);
// 2.排序条件
// 2.1.先看前端有没有传排序字段
if (sortBy != null) {
p.addOrder(new OrderItem(sortBy, isAsc));
return p;
}
// 2.2.再看有没有手动指定排序字段
if(orders != null){
// 传递可变参数
p.addOrder(orders);
}
return p;
}
public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc){
return this.toMpPage(new OrderItem(defaultSortBy, isAsc));
}
public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {
return toMpPage("create_time", false);
}
public <T> Page<T> toMpPageDefaultSortByUpdateTimeDesc() {
return toMpPage("update_time", false);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分页结果")
public class PageDTO<V> {
@ApiModelProperty("总条数")
private Long total;
@ApiModelProperty("总页数")
private Long pages;
@ApiModelProperty("集合")
private List<V> list;
/**
* 返回空分页结果
* @param p MybatisPlus的分页结果
* @param <V> 目标VO类型
* @param <P> 原始PO类型
* @return VO的分页对象
*/
// 类上的泛型是属于对象的,静态方法不能调用
public static <V, P> PageDTO<V> empty(Page<P> p){
return new PageDTO<>(p.getTotal(), p.getPages(), Collections.emptyList());
}
/**
* 将MybatisPlus分页结果转为 VO分页结果
* @param p MybatisPlus的分页结果
* @param voClass 目标VO类型的字节码
* @param <V> 目标VO类型
* @param <P> 原始PO类型
* @return VO的分页对象
*/
// 调用者才能知道字节码是什么,泛型不能获取class
public static <V, P> PageDTO<V> of(Page<P> p, Class<V> voClass) {
// 1.非空校验
List<P> records = p.getRecords();
if (records == null || records.size() <= 0) {
// 无数据,返回空结果
return empty(p);
}
// 2.数据转换
List<V> vos = BeanUtil.copyToList(records, voClass);
// 3.封装返回
return new PageDTO<>(p.getTotal(), p.getPages(), vos);
}
/**
* 将MybatisPlus分页结果转为 VO分页结果,允许用户自定义PO到VO的转换方式
* @param p MybatisPlus的分页结果
* @param convertor PO到VO的转换函数
* @param <V> 目标VO类型
* @param <P> 原始PO类型
* @return VO的分页对象
*/
// 函数式编程
public static <V, P> PageDTO<V> of(Page<P> p, Function<P, V> convertor) {
// 1.非空校验
List<P> records = p.getRecords();
if (records == null || records.size() <= 0) {
// 无数据,返回空结果
return empty(p);
}
// 2.数据转换
List<V> vos = records.stream().map(convertor).collect(Collectors.toList());
// 3.封装返回
return new PageDTO<>(p.getTotal(), p.getPages(), vos);
}
}