面试官:有一个 List 对象集合,如何优雅地返回给前端?我懵了

简介: 1.业务背景2.实体类3.自定义Mapper和xml文件4.Service层5.Controller层
  • 1.业务背景
  • 2.实体类
  • 3.自定义Mapper和xml文件
  • 4.Service层
  • 5.Controller层


1.业务背景

业务场景中,一个会话中存在多个场景,即一个session_id对应多个scene_idscene_name

如果你写成如下的聚合模型类

public class SceneVO {
 private String sessionId;
 private String sceneId;
 private String sceneName;
 // 省略对应的getter和setter方法
}

返回的List<SceneVO>形式如下,这个数据在data属性中

{
 "data":[
  {
   "sessionId": "jksadhjksd",
   "sceneId":"NDJWKSDSJKDKED",
   "sceneName":"场景1"
  },
  {
   "sessionId": "jksadhjksd",
   "sceneId":"KLJSDJKLSDFALK",
   "sceneName":"场景2"
  },
  {
   "sessionId": "jksadhjksd",
   "sceneId":"KERFJKOVDJKDSS",
   "sceneName":"场景3"
  }
 ]
}

每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办?

我想改为如下形式,sessionId提出到外层,更能体现出一个sessionId对应多个sceneId和sceneName的含义,这样也便于前端取数据,不然每个对象都要增加一个sessionId属性,太麻烦。

{
 "data": {
  "sessionId": "jksadhjksd",
  "sceneList": [
   {
    "sceneId":"NDJWKSDSJKDKED",
    "sceneName":"场景1"
   },
   {
    "sceneId":"KLJSDJKLSDFALK",
    "sceneName":"场景2"
   },
   {
    "sceneId":"KERFJKOVDJKDSS",
    "sceneName":"场景3"
   }
  ]
 }
}

2.实体类

方法如下,首先创建两个实体类。

public class SceneVO {
 private String sessionId;
 private List<SubSceneVO> sceneList;
 // 省略对应的getter和setter方法
}
public class SubSceneVO {
 private String sceneId;
 private String sceneName;
 // 省略对应的getter和setter方法
}

3.自定义Mapper和xml文件

public interface BusinessScenesCustomMapper {
 SceneVO selectBySessionId(String sessionId);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="你的包名.mapper.BusinessScenesCustomMapper">
    <resultMap id="BaseResultMap" type="你的包名.vo.SceneVO">
        <result column="session_id" jdbcType="VARCHAR" property="sessionId"/>
    <!--
      collection 标签:用于定义关联的list集合类型的封装规则
      property:对应父类中list属性名,这里SceneVO类里的List变量名为sceneList
      ofType:集合存放的类型,List集合要装的类的类名,这里是SubSceneVO
    -->
        <collection property="sceneList" ofType="你的包名.vo.SubSceneVO">
            <result column="scene_id" jdbcType="VARCHAR" property="sceneId"/>
            <result column="scene_name" jdbcType="VARCHAR" property="sceneName"/>
        </collection>
    </resultMap>
<!-- 一个session_id对应多条记录,返回的是SceneVO对象,SceneVO对象有一个List装着SubSceneVO  -->
    <select id="selectBySessionId" parameterType="string" resultMap="BaseResultMap">
        select session_id, scene_id, scene_name
        from 表名
        where session_id = #{sessionId,jdbcType=VARCHAR}
    </select>
</mapper>
  • collection标签: 用于定义关联的List集合类型的封装规则
  • property属性: 对应父类中List集合的变量名,这里SceneVO类里的List变量名为sceneList
  • ofType属性: 集合存放的类型,List集合要装的类的类名,这里是SubSceneVO

4.Service层

public interface SceneService {
 /**
 * 获取场景信息
 */
 SceneVO getScenesInfo(String sessionId);
}
@Service
public class SceneServiceImpl {
 @Resource
 private BusinessScenesCustomMapper businessScenesCustomMapper;
 ......
 public SceneVO getScenesInfo(String sessionId) {
  return businessScenesCustomMapper.selectBySessionId(sessionId);
 }
}

5.Controller层

......
@Resource
private SceneService sceneService;
@GetMapping("/getScenesInfo")
public ResModel getScenesInfo(String sessionId) {
 SceneVO sceneVO = sceneService.getScenesInfo(sessionId);
 return ResModel.ok(sceneVO);
}

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
28天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
37 0
|
3月前
|
存储 JavaScript 前端开发
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
|
3月前
|
JavaScript 前端开发 Java
【面试题】new 一个对象时,js 做了什么?
【面试题】new 一个对象时,js 做了什么?
|
3月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
24 0
|
1月前
|
存储 安全 Java
Python教程第3章 | 集合(List列表、Tuple元组、Dict字典、Set)
Python 列表、无序列表、字典、元组增删改查基本用法和注意事项
51 1
|
1月前
|
存储 安全 Java
【Java】集合(一)单列集合List
【Java】集合(一)单列集合List
22 0
|
1月前
|
Java API
java 对象list 使用stream进行过滤
在Java中,你可以使用Stream API对对象列表进行过滤。假设你有一个`List<MyObject>`,并且你想根据某些条件过滤出特定的对象。以下是一个示例: ```java import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<MyObject> myObjects = ... // 初始化你的对象列表 List<MyObject> filter
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
107 0
|
2月前
|
Java
Java对list集合元素进行排序的几种方式
Java对list集合元素进行排序的几种方式
22 0