每人心中都应有两盏灯光,一盏是希望的灯光;一盏是勇气的灯光。有 了这两盏灯光,我们就不怕海上的黑暗和风涛的险恶了。——罗兰
分享给大家
需要引入mybatis-plus
package com.kuang.common.util;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors;
public class MybatisPlusUtils { private MybatisPlusUtils() { }
public static <T, I, R> List<R> getList(BaseMapper<T> mapper, Supplier<I> param, SFunction<T, I> origin, SFunction<T, R> target) { return Optional.ofNullable(param).map(Supplier::get).map(p -> mapper.selectList(new LambdaQueryWrapper<T>().eq(origin, p).select(target))).map(List::parallelStream).map(s -> s.map(target).collect(Collectors.toList())).orElseGet(Collections::emptyList); }
public static <T, I> Map<I, T> getMapBy(BaseMapper<T> mapper, List<I> paramList, SFunction<T, I> sFunction) { return Optional.ofNullable(paramList).filter(CollectionUtils::isNotEmpty).map(p -> mapper.selectList(new LambdaQueryWrapper<T>().in(sFunction, p))).map(List::parallelStream).map(s -> s.collect(Collectors.toMap(sFunction, Function.identity(), (a, b) -> b))).orElseGet(Collections::emptyMap); }
public static <T, I> Map<I, List<T>> groupBy(BaseMapper<T> mapper, List<I> paramList, SFunction<T, I> sFunction) { return Optional.ofNullable(paramList).filter(CollectionUtils::isNotEmpty).map(p -> mapper.selectList(new LambdaQueryWrapper<T>().in(sFunction, p))).map(List::parallelStream).map(s -> s.collect(Collectors.groupingBy(sFunction))).orElseGet(Collections::emptyMap); }
}
|
第一个函数getList
一般用于关联表处,例如我这里需要实现一个已购课程的功能,我们首先要根据用户id
去查询用户的课程购买记录表
User current = UserThreadLocal.getNoneNullUser();
List<String> courseIds = MybatisPlusUtils.getList(this.baseMapper, current::getUserid, UserCourse::getUserid, UserCourse::getCourseid);
|
这里三个参数,baseMapper
是继承mybatis-plus
中com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
获取的
![image-20210508131805092](https://waibi.oss-cn-chengdu.aliyuncs.com/picGo/image-20210508131805092.png)
然后第二个参数current::getUserid
就是一个java.util.function.Supplier
是作为查询条件参数值
你也可以这么写 () -> current.getUserid()
![image-20210508132053517](https://waibi.oss-cn-chengdu.aliyuncs.com/picGo/image-20210508132053517.png)
第三个参数是用于查询的条件,这里UserCourse::getUserid
表示根据userId
查询数据
结合上个参数,这里是使用userId = current.getUserid()
去查询数据
第四个参数是你要返回的数据,例如这里我是通过用户id
获取课程id
,我们就给个UserCourse::getCourseid
最后实现的效果就下面这段差不多的
List<UserCourse> userCourses = this.baseMapper.selectList(Wrappers.lambdaQuery(new UserCourse()).in(UserCourse::getUserid, current.getUserid())); List<String> courseIds = new ArrayList<>(userCourses.size()); for (int i = 0; i < userCourses.size(); i++) { courseIds.add(userCourses.get(i).getCourseid()); }
|
第二个函数getMapBy
这里描述写的多用于一对一,不是指表之间关联关系是一对一,而是key
和value
一对一
三个参数分别为
继承com.baomidou.mybatisplus.core.mapper.BaseMapper
的mapper
接口
数据参数集合
查询条件
例如我这里,查询一个用户信息列表,但我需要带一个用户的信息,放在用户信息表
List<User> list = userService.list();
List<String> userIds = list.parallelStream().map(User::getUserid).collect(Collectors.toList());
Map<String, UserInfo> userIdInfoMap = MybatisPlusUtils.getMapBy(userInfoMapper, userIds, UserInfo::getUserid); List<UserVO> collect = list.parallelStream().map(user -> { UserInfo fans = userIdInfoMap.getOrDefault(user.getUserid(), new UserInfo()); UserInfo fans1 = Optional.ofNullable(user.getUserid()).map(userIdInfoMap::get).orElseGet(UserInfo::new); return vo; }).collect(Collectors.toList());
|
第三个函数groupBy
这里用于key
对多个value
场景
三个参数分别为
继承com.baomidou.mybatisplus.core.mapper.BaseMapper
的mapper
接口
数据参数集合
查询条件
例如我这里,查询一个用户信息列表,并携带出用户的粉丝列表,用户和粉丝列表是一对多的关系
List<User> list = userService.list();
List<String> userIds = list.parallelStream().map(User::getUserid).collect(Collectors.toList());
Map<String, List<UserFans>> userIdFansMap = MybatisPlusUtils.groupBy(userFansMapper, userIds, UserFans::getUserid); List<UserVO> collect = list.parallelStream().map(user -> { List<UserFans> fans = userIdFansMap.getOrDefault(user.getUserid(), Collections.emptyList()); List<UserFans> fans = Optional.ofNullable(user.getUserid()).map(userIdFansMap::get).orElseGet(Collections::emptyList); return vo; }).collect(Collectors.toList());
|