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

打印 上一主题 下一主题

主题 548|帖子 548|积分 1654

1.业务背景

业务场景中,一个会话中存在多个场景,即一个session_id对应多个scene_id和scene_name
如果你写成如下的聚合模型类
  1. public class SceneVO {
  2. private String sessionId;
  3. private String sceneId;
  4. private String sceneName;
  5. // 省略对应的getter和setter方法
  6. }
复制代码
返回的List形式如下,这个数据在data属性中
  1. {
  2. "data":[
  3.   {
  4.    "sessionId": "jksadhjksd",
  5.    "sceneId":"NDJWKSDSJKDKED",
  6.    "sceneName":"场景1"
  7.   },
  8.   {
  9.    "sessionId": "jksadhjksd",
  10.    "sceneId":"KLJSDJKLSDFALK",
  11.    "sceneName":"场景2"
  12.   },
  13.   {
  14.    "sessionId": "jksadhjksd",
  15.    "sceneId":"KERFJKOVDJKDSS",
  16.    "sceneName":"场景3"
  17.   }
  18. ]
  19. }
复制代码
每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办?
我想改为如下形式,sessionId提出到外层,更能体现出一个sessionId对应多个sceneId和sceneName的含义,这样也便于前端取数据,不然每个对象都要增加一个sessionId属性,太麻烦。
  1. {
  2. "data": {
  3.   "sessionId": "jksadhjksd",
  4.   "sceneList": [
  5.    {
  6.     "sceneId":"NDJWKSDSJKDKED",
  7.     "sceneName":"场景1"
  8.    },
  9.    {
  10.     "sceneId":"KLJSDJKLSDFALK",
  11.     "sceneName":"场景2"
  12.    },
  13.    {
  14.     "sceneId":"KERFJKOVDJKDSS",
  15.     "sceneName":"场景3"
  16.    }
  17.   ]
  18. }
  19. }
复制代码
Java 集合系列文章:https://www.javastack.cn/categories/Java/
2.实体类

方法如下:
首先创建两个实体类
  1. public class SceneVO {
  2. private String sessionId;
  3. private List<SubSceneVO> sceneList;
  4. // 省略对应的getter和setter方法
  5. }
  6. public class SubSceneVO {
  7. private String sceneId;
  8. private String sceneName;
  9. // 省略对应的getter和setter方法
  10. }
复制代码
3.自定义Mapper和xml文件
  1. public interface BusinessScenesCustomMapper {
  2. SceneVO selectBySessionId(String sessionId);
  3. }
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  6. <mapper namespace="你的包名.mapper.BusinessScenesCustomMapper">
  7.     <resultMap id="BaseResultMap" type="你的包名.vo.SceneVO">
  8.         <result column="session_id" jdbcType="VARCHAR" property="sessionId"/>
  9.    
  10.         <collection property="sceneList" ofType="你的包名.vo.SubSceneVO">
  11.             <result column="scene_id" jdbcType="VARCHAR" property="sceneId"/>
  12.             <result column="scene_name" jdbcType="VARCHAR" property="sceneName"/>
  13.         </collection>
  14.     </resultMap>
  15.     <select id="selectBySessionId" parameterType="string" resultMap="BaseResultMap">
  16.         select session_id, scene_id, scene_name
  17.         from 表名
  18.         where session_id = #{sessionId,jdbcType=VARCHAR}
  19.     </select>
  20. </mapper>
复制代码

  • collection标签: 用于定义关联的List集合类型的封装规则
  • property属性: 对应父类中List集合的变量名,这里SceneVO类里的List变量名为sceneList
  • ofType属性: 集合存放的类型,List集合要装的类的类名,这里是SubSceneVO
4.Service层
  1. public interface SceneService {
  2. /**
  3. * 获取场景信息
  4. */
  5. SceneVO getScenesInfo(String sessionId);
  6. }
  7. @Service
  8. public class SceneServiceImpl {
  9. @Resource
  10. private BusinessScenesCustomMapper businessScenesCustomMapper;
  11. ......
  12. public SceneVO getScenesInfo(String sessionId) {
  13.   return businessScenesCustomMapper.selectBySessionId(sessionId);
  14. }
  15. }
复制代码
5.Controller层
  1. ......
  2. @Resource
  3. private SceneService sceneService;
  4. @GetMapping("/getScenesInfo")
  5. public ResModel getScenesInfo(String sessionId) {
  6. SceneVO sceneVO = sceneService.getScenesInfo(sessionId);
  7. return ResModel.ok(sceneVO);
  8. }
复制代码
来源:liuchenyang0515.blog.csdn.net/article/details/118159196
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表