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

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

1.业务背景


业务场景中,一个会话中存在多个场景,即一个session_id对应多个scene_id和scene_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"
   }
  ]
 }
}


Java 集合系列文章:https://www.javastack.cn/categories/Java/


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);
}
相关文章
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
335 4
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
580 3
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
525 20
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
1633 1
Java面试题之Java集合面试题 50道(带答案)
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
1924 1
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)

热门文章

最新文章