百木园-与人分享,
就是让自己快乐。

面试官:有一个 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开发手册(嵩山版)》最新发布,速速下载!

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


来源:https://www.cnblogs.com/javastack/p/16574998.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 面试官:有一个 List 对象集合,如何优雅地返回给前端?我懵了。。

相关推荐

  • 暂无文章