前言:在开发的时候,有时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.处理voUserVO 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中实现该方法:
@Overridepublic 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转换为地址VOList<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转为VOUserVO userVO = BeanUtil.copyProperties(user, UserVO.class);list.add(userVO);//3.2转换地址VOuserVO.setAddresses(addressMap.get(user.getId()));}return list;}