前言:在开发的时候,有时Service之间也会相互调用,会出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与
IService
中方法签名基本一致,也可以帮助我们实现CRUD功能。
一、Db工具类中常用的方法
如下:
二、入门示例
2.1 入门示例一
需求:改造根据id用户查询的接口,查询用户的同时返回用户收货地址列表
在Controller层中调用接口:
@GetMapping("/{id}")
@ApiOperation("根据id查询用户")
public UserVO queryUserById(@PathVariable("id") Long userId){
// 基于自定义service方法查询
return userService.queryUserAndAddressById(userId);
}
在service层中定义方法:
package com.itheima.mp.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
public interface IUserService extends IService<User> {
void deduct(Long id, Integer money);
//实现方法
UserVO queryUserAndAddressById(Long userId);
}
然后在UserServiceImpl中实现该方法:
@Override
public UserVO queryUserAndAddressById(Long userId) {
// 1.查询用户
User user = getById(userId);
if (user == null) {
return null;
}
// 2.查询收货地址
List<Address> addresses = Db.lambdaQuery(Address.class)
.eq(Address::getUserId, userId)
.list();
// 3.处理vo
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
userVO.setAddresses(BeanUtil.copyToList(addresses, AddressVO.class));
return userVO;
}
在查询地址时,我们采用了Db的静态方法,因此避免了注入AddressService,减少了循环依赖的风险。
2.2 入门示例二
需求:根据id批量查询用户,并查询出用户对应的所有地址
在Controller层中调用接口:
@GetMapping
@ApiOperation("根据id集合查询用户")
public List<UserVO> queryUserByIds(@RequestParam("ids") List<Long> ids){
return userService.queryUserAndAddressByIds(ids);
}
然后在IUserService中增加方法:
List<UserVO> queryUserAndAddressByIds(List<Long> ids);
在UserServiceImpl中实现该方法:
@Override
public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {
//1.查询用户
List<User> users = listByIds(ids);
if(CollUtil.isEmpty(users)) {
return Collections.emptyList();
}
//2.查询地址
//2.1获取用户id集合
List<Long> idList = users.stream().map(User::getId).collect(Collectors.toList());
//2.2根据用户id查询地址
List<Address> addressList = Db.lambdaQuery(Address.class).in(Address::getUserId, idList).list();
//2.3转换为地址VO
List<AddressVO> addressVOS = BeanUtil.copyToList(addressList, AddressVO.class);
//2.4用户地址集合分组处理,相同用户的地址放入同一个集合
Map<Long, List<AddressVO>> addressMap= new HashMap<>(0);
if (CollUtil.isNotEmpty(addressVOS)) {
addressMap = addressVOS.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
}
//3.转为VO,返回结果
ArrayList<UserVO> list = new ArrayList<>(users.size());
for (User user : users) {
//3.1将User的PO转为VO
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
list.add(userVO);
//3.2转换地址VO
userVO.setAddresses(addressMap.get(user.getId()));
}
return list;
}