面试官:有一个 List 对象集合,如何优雅地返回给前端?我懵了。。
2023-03-31 10:57:14 时间
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);
}
来源:liuchenyang0515.blog.csdn.net/article/details/118159196
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!
相关文章
- 一篇运维老司机的大数据平台监控宝典(2)-联通大数据集群平台监控体系详解
- 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
- 空中换引擎 博时基金数字化转型经验谈
- 如何高效地学习编程语言
- 作为一名阿里巴巴数据分析大牛,送给学弟学妹的经验积分
- 为什么要学习R语言
- Hadoop大数据分析平台的介绍性讨论
- 最全面的Spring学习笔记
- 16个用于数据科学和机器学习的顶级平台
- 给有抱负的数据科学家的六条建议
- 如何做一枚合格的数据产品经理
- 除Kaggle外,还有哪些顶级数据科学竞赛平台
- 一个鲜为人知却可以保护隐私的训练方法:联合学习
- 干货 :送你12个关于数据科学学习的关键提示(附链接)
- 大数据行业有多少种工作岗位,各自的技能需求是什么?
- 中国移动研究院常耀斌:商用大数据平台的研发之路
- 这些数据科学家必备的技能,你拥有哪些?
- 自学成才的开发者有何优势和劣势?
- Gartner报告:正处于数据科学与机器学习工具 “大爆炸”的时代
- Ready Computing借助InterSystems IRIS医疗版为医疗机构提供具有高度互操作性和可扩展性的解决方案