前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实用API设计案例

实用API设计案例

作者头像
阿超
发布2022-08-17 19:50:38
2940
发布2022-08-17 19:50:38
举报
文章被收录于专栏:快乐阿超快乐阿超

艺术生永远不要把学技巧放在第一位,而要把怎么思考放在第一位。——灵遁者

今天为了偷懒,写了两个函数

代码语言:javascript
复制
/**
 * AR模式in查询
 *
 * @param page 分页参数
 * @param ids  ids
 * @param type Class
 * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 16:21
 */
@SneakyThrows
public static <T extends BaseEntity<T>> IPage<T> selectPageByIds(IPage<T> page, List<?> ids, Class<T> type) {
    if (ids.isEmpty()) {
        return page;
    }
    return type.newInstance().selectPage(page, new LambdaQueryWrapper<>(type.newInstance()).in(T::getId, ids));
}

这里用到了AR模式,AR模式我之前博客写过,就不赘述了

AR模式文章戳我

看上去就两三行,但这个函数能应对我此处的需求:查询我的关注企业/收藏资讯/收藏产品列表等

然后我在service中调用如下:

代码语言:javascript
复制
/**
 * 我的关注/收藏
 *
 * @param page          分页参数
 * @param userAttention 查询条件
 * @return com.ruben.zsxh.pojo.common.Result
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 15:51
 */
@Override
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public Result mine(Page page, UserAttention userAttention) {
    userAttention.setUserId(Long.valueOf(ProfileHolder.getProfile().getId()));
    List<Long> ids = list(Wrappers.lambdaQuery(userAttention).select(UserAttention::getAttentionId)).parallelStream().map(UserAttention::getAttentionId).collect(Collectors.toList());
    return Result.ok().data(MybatisPlusUtils.selectPageByIds(page, ids, userAttention.getType().getTypeClass()));
}

这里第一行是给参数赋值,便于作为下方查询条件

代码语言:javascript
复制
userAttention.setUserId(Long.valueOf(ProfileHolder.getProfile().getId()));

第二行是从表内根据条件查询出关联数据

例如这里service的第二行是:在userAttention中调用UserAttention::getUserId,并以user_id=userId作为where条件,在对应的数据库表名为user_attention中取出attention_id,但mybatis-plusselectList返回的是UserAttention,所以我们再使用并行流转换为attentionId

代码语言:javascript
复制
List<Long> ids = list(Wrappers.lambdaQuery(userAttention).select(UserAttention::getAttentionId)).parallelStream().map(UserAttention::getAttentionId).collect(Collectors.toList());

最后拿到的返回值就是attentionId的集合,然后这个ids是用于关联其他表的

最后第三行中我们写法如下:

代码语言:javascript
复制
return Result.ok().data(MybatisPlusUtils.selectPageByIds(page, ids, userAttention.getType().getTypeClass()));

这里调用了我们上面的selectPageByIds,然后传入了

page:分页参数

ids:上方获取到attentionId的集合

userAttention.getType().getTypeClass():这个对应了一个枚举如下:

代码语言:javascript
复制
package com.ruben.zsxh.enumration.type;

import com.ruben.zsxh.entity.ArticleInfo;
import com.ruben.zsxh.entity.MemberInfo;
import com.ruben.zsxh.entity.ProductInfo;
import com.ruben.zsxh.pojo.common.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 用户关注类型
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 14:46
 */
@Getter
@AllArgsConstructor
public enum UserAttentionTypeEnum {
    /**
     * Cheating the compiler.
     */
    MEMBER("关注企业", MemberInfo.class),
    NEWS("收藏资讯", ArticleInfo.class),
    PRODUCT("收藏商品", ProductInfo.class);


    private final String desc;
    private final Class<? extends BaseEntity> typeClass;
}

然后我们再配置mvc配置fastjson序列化枚举以及Mybatis-plus通用枚举之后

再到Controller中调用service

代码语言:javascript
复制
/**
 * 查询我的列表
 *
 * @param page 分页参数?size=10&current=1
 * @return 分页结果
 * @author <achao1441470436@gmail.com>
 * @since 2021-08-09
 */
@GetMapping("mine")
public Result mine(Page page, UserAttention userAttention) {
    return userAttentionService.mine(page, userAttention);
}

最后就能实现传入不同的type,分页拿到不同表的数据

例如传入MEMBER

传入NEWS

传入PRODUCT

这样就能用最少的代码做最多的事,达到事半功倍的效果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档