面試官:有一個 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開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章