package com.itheima.mp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.itheima.mp.domain.dto.PageDTO;
import com.itheima.mp.domain.po.Address;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.query.UserQuery;
import com.itheima.mp.domain.vo.AddressVO;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.enums.UserStatus;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import com.sun.org.apache.bcel.internal.generic.NEW;
import lombok.AllArgsConstructor;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
private final UserMapper userMapper;
@Override
public void deductMoneyById(Long id, Integer money) {
// 查询用用户余额是否支持扣减
// 已经注入mapper了
// User user1 = baseMapper.selectById(id);
User user = this.getById(id);
if (user == null || user.getStatus() == UserStatus.FROZEN) {
throw new RuntimeException("用户状态异常");
}
// 校验用户余额是否支持扣减
if (user.getBalance() - money < 0) {
throw new RuntimeException("用户余额不足");
}
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id",id);
// 完成扣减
baseMapper.deductMoneyById(wrapper,money);
}
@Override
public List<User> queryUsers(UserQuery query) {
List<User> list = lambdaQuery()
.like(query.getName() != null, User::getUsername, query.getName())
.eq(query.getStatus() != null, User::getStatus, query.getStatus())
.gt(query.getMinBalance() != null, User::getBalance, query.getMinBalance())
.lt(query.getMaxBalance() != null, User::getBalance, query.getMaxBalance())
.list();
// 执行查询并返回结果
return list;
}
@Override
public UserVO queryUserAndAddressById(long id) {
// 1.查询用户
User user = getById(id);
if (user == null || user.getStatus() == UserStatus.FROZEN) {
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();
// }
// Map<Long, List<Address>> collect = Db.lambdaQuery(Address.class).in(Address::getUserId, ids).list().stream()
// .collect(Collectors.groupingBy(Address::getUserId));
// List<UserVO> userVOS = new ArrayList<>();
// for (int i = 0; i < users.size(); i++) {
// UserVO userVO = new UserVO();
// BeanUtil.copyProperties(users.get(i),userVO);
// userVO.setAddresses(BeanUtil.copyToList(collect.get(users.get(i).getId()),AddressVO.class));
// userVOS.add(userVO);
// }
// return userVOS;
// }
@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());
}
@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;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
MybatisPlus拓展功能(内附全功能代码)
共73个文件
class:25个
java:25个
xml:14个
0 下载量 186 浏览量
2024-05-15
16:43:29
上传
评论
收藏 71KB RAR 举报
温馨提示
可运行代码
资源推荐
资源详情
资源评论
收起资源包目录
mp-example.rar (73个子文件)
mp-demo
pom.xml 3KB
src
test
java
com
itheima
mp
mapper
UserMapperTest.java 4KB
MpDemoApplicationTests.java 139B
service
IUserServiceTest.java 2KB
impl
AddressServiceImplTest.java 557B
main
resources
mapper
UserMapper.xml 2KB
AddressMapper.xml 215B
application.yaml 1014B
java
com
itheima
mp
MpDemoApplication.java 406B
mapper
UserMapper.java 736B
AddressMapper.java 293B
controller
UserController.java 3KB
AddressController.java 350B
service
IUserService.java 613B
IAddressService.java 294B
impl
UserServiceImpl.java 7KB
AddressServiceImpl.java 508B
enums
UserStatus.java 505B
Biginteger.java 378B
domain
dto
UserFormDTO.java 772B
PageDTO.java 3KB
po
UserInfo.java 346B
Address.java 2KB
User.java 1KB
query
PageQuery.java 2KB
UserQuery.java 570B
vo
AddressVO.java 953B
UserVO.java 824B
config
MyBatisConfig.java 982B
.idea
jarRepositories.xml 864B
dataSources
1f2fd68d-e6e6-4877-94f0-1e41d0612fea.xml 44KB
1f2fd68d-e6e6-4877-94f0-1e41d0612fea
storage_v2
_src_
schema
performance_schema.kIw0nw.meta 76B
sys.zb4BAA.meta 61B
information_schema.FNRwLQ.meta 76B
mysql.osA4Bg.meta 63B
mp.ow0AAA.meta 57B
mp.ow0AAA.zip 730B
dataSources.local.xml 1KB
uiDesigner.xml 9KB
workspace.xml 9KB
misc.xml 465B
dataSources.xml 839B
compiler.xml 751B
.gitignore 190B
encodings.xml 191B
target
classes
mapper
UserMapper.xml 2KB
AddressMapper.xml 215B
application.yaml 1014B
com
itheima
mp
mapper
UserMapper.class 989B
AddressMapper.class 310B
Biginteger.class 706B
controller
AddressController.class 517B
UserController.class 4KB
MpDemoApplication.class 824B
service
IAddressService.class 323B
IUserService.class 1KB
impl
AddressServiceImpl.class 704B
UserServiceImpl.class 11KB
enums
UserStatus.class 2KB
domain
dto
UserFormDTO.class 4KB
PageDTO.class 6KB
po
User.class 6KB
UserInfo.class 3KB
Address.class 7KB
query
UserQuery.class 3KB
PageQuery.class 5KB
vo
UserVO.class 5KB
AddressVO.class 6KB
config
MyBatisConfig.class 1KB
test-classes
com
itheima
mp
mapper
UserMapperTest.class 7KB
service
IUserServiceTest.class 4KB
impl
AddressServiceImplTest.class 897B
MpDemoApplicationTests.class 464B
generated-test-sources
test-annotations
generated-sources
annotations
共 73 条
- 1
资源评论
一只傻小白,
- 粉丝: 348
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Swift语言教程及案例
- 汇编语言教程以及汇编器和伪指令的定义
- global,nonlocal,json和python的类的介绍
- DELL EMC POWEREDGE R440 BIOS 2.10.2 编程器备份
- IMG_20240529_122750.jpg
- 基于Java的职工工资管理系统设计源码 - salary management system
- 张律师〈人民路街道)-2405291432.awb
- Editplus 4GL Progress 高亮配色方案
- 回调函数的定义和应用场景
- meta-llama-3-8b-instruct 的 model-00002-of-00004.safetensors 的3/3
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功