面試官:有一個(gè) List 對(duì)象集合,如何優(yōu)雅地返回給前端?我懵了。。
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
作者:磚業(yè)洋__

業(yè)務(wù)場(chǎng)景中,一個(gè)會(huì)話中存在多個(gè)場(chǎng)景,即一個(gè)session_id對(duì)應(yīng)多個(gè)scene_id和scene_name
如果你寫成如下的聚合模型類
public class SceneVO {
private String sessionId;
private String sceneId;
private String sceneName;
// 省略對(duì)應(yīng)的getter和setter方法
}
返回的List<SceneVO>形式如下,這個(gè)數(shù)據(jù)在data屬性中
{
"data":[
{
"sessionId": "jksadhjksd",
"sceneId":"NDJWKSDSJKDKED",
"sceneName":"場(chǎng)景1"
},
{
"sessionId": "jksadhjksd",
"sceneId":"KLJSDJKLSDFALK",
"sceneName":"場(chǎng)景2"
},
{
"sessionId": "jksadhjksd",
"sceneId":"KERFJKOVDJKDSS",
"sceneName":"場(chǎng)景3"
}
]
}
每個(gè)對(duì)象里面都帶上了重復(fù)的一個(gè)sessionId數(shù)據(jù),我想提出來該怎么辦?
我想改為如下形式,sessionId提出到外層,更能體現(xiàn)出一個(gè)sessionId對(duì)應(yīng)多個(gè)sceneId和sceneName的含義,這樣也便于前端取數(shù)據(jù),不然每個(gè)對(duì)象都要增加一個(gè)sessionId屬性,太麻煩。
{
"data": {
"sessionId": "jksadhjksd",
"sceneList": [
{
"sceneId":"NDJWKSDSJKDKED",
"sceneName":"場(chǎng)景1"
},
{
"sceneId":"KLJSDJKLSDFALK",
"sceneName":"場(chǎng)景2"
},
{
"sceneId":"KERFJKOVDJKDSS",
"sceneName":"場(chǎng)景3"
}
]
}
}
2.實(shí)體類
方法如下,首先創(chuàng)建兩個(gè)實(shí)體類。
public class SceneVO {
private String sessionId;
private List<SubSceneVO> sceneList;
// 省略對(duì)應(yīng)的getter和setter方法
}
public class SubSceneVO {
private String sceneId;
private String sceneName;
// 省略對(duì)應(yīng)的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 標(biāo)簽:用于定義關(guān)聯(lián)的list集合類型的封裝規(guī)則
property:對(duì)應(yīng)父類中l(wèi)ist屬性名,這里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>
<!-- 一個(gè)session_id對(duì)應(yīng)多條記錄,返回的是SceneVO對(duì)象,SceneVO對(duì)象有一個(gè)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標(biāo)簽:用于定義關(guān)聯(lián)的List集合類型的封裝規(guī)則 property屬性:對(duì)應(yīng)父類中List集合的變量名,這里SceneVO類里的List變量名為sceneList ofType屬性:集合存放的類型,List集合要裝的類的類名,這里是SubSceneVO
4.Service層
public interface SceneService {
/**
* 獲取場(chǎng)景信息
*/
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);
}
往 期 推 薦
3、互聯(lián)網(wǎng)人為什么學(xué)不會(huì)擺爛
4、為什么國(guó)外JetBrains做 IDE 就可以養(yǎng)活自己,國(guó)內(nèi)不行?區(qū)別在哪?
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看
評(píng)論
圖片
表情





