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


    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"
       }
      ]
     }
    }
    

    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);
    }
    

    来源:liuchenyang0515.blog.csdn.net/article/details/118159196

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2022最新版)

    2.劲爆!Java 协程要来了。。。

    3.Spring Boot 2.x 教程,太全了!

    4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    mysql数据库的基本操作:创建数据库、查看数据库、修改数据库、删除数据库
    CentOS7安装python3
    如何修改博客园的标题,文本,表格等的显示样式
    html:常见行内标签,常见块级标签,常见自闭合标签
    drupal 精彩文章
    DRUPAL8模版命名规则
    编写.info文件
    module.inc 模块
    drupal 内容类型
    drupal
  • 原文地址:https://www.cnblogs.com/javastack/p/16574998.html
Copyright © 2020-2023  润新知