List
对象集合?”这个问题表面上看起来简单,但如果你稍微考虑一下背后的数据结构设计和优化,就能发现其实有不少值得深思的地方。1. 问题描述
sessionId
重复出现在多个场景数据中,导致了冗余。sessionId
的数据给前端,前端不仅要处理这些冗余数据,还可能会面临性能问题。2. 期望的数据结构
sessionId
提取到数据结构的外层,同时将多个场景放到 sceneList
中。这样做的好处是:清晰性:前端能够直接获取到 sessionId
,并且多个场景会在sceneList
中存储,简洁明了。减少冗余:避免 sessionId
在每个场景中重复出现,减少不必要的数据传输。
{
"sessionId": "12345",
"sceneList": [
{
"sceneId": "A1",
"sceneName": "Scene 1",
"description": "This is the first scene."
},
{
"sceneId": "A2",
"sceneName": "Scene 2",
"description": "This is the second scene."
}
]
}
sessionId
提取到外层,sceneList
存储的是所有相关的场景信息,这样就避免了每个场景中都包含 sessionId
。3. 优化后的实体类设计
SceneVO
和 SubSceneVO
。** SceneVO
**:包含sessionId
和sceneList
。** SubSceneVO
**:表示单个场景的信息,包含sceneId
、sceneName
和description
等属性。
实体类设计如下:
public class SceneVO {
private String sessionId; // sessionId 提取到外层
private List<SubSceneVO> sceneList; // 存储多个场景
// Getter 和 Setter
}
public class SubSceneVO {
private String sceneId;
private String sceneName;
private String description;
// Getter 和 Setter
}
4. 自定义 MyBatis Mapper 和 XML 配置
selectBySessionId
。Mapper 接口:
public interface SceneMapper {
List<SubSceneVO> selectBySessionId(String sessionId);
}
<collection>
标签来映射 sceneList
。这样,MyBatis 会根据 sessionId
查询出所有场景,并将它们映射到 sceneList
中。MyBatis XML 配置:
<resultMap id="sceneResultMap" type="SceneVO">
<id property="sessionId" column="session_id"/>
<collection property="sceneList" ofType="SubSceneVO">
<result property="sceneId" column="scene_id"/>
<result property="sceneName" column="scene_name"/>
<result property="description" column="description"/>
</collection>
</resultMap>
<select id="selectBySessionId" resultMap="sceneResultMap">
SELECT session_id, scene_id, scene_name, description
FROM scenes
WHERE session_id = #{sessionId}
</select>
5. Service 层设计
SceneService
,并实现 SceneServiceImpl
。通过调用 Mapper 层的方法,我们将数据库查询的数据传递到 Controller 层,最终返回给前端。Service 接口:
public interface SceneService {
SceneVO getScenesBySessionId(String sessionId);
}
Service 实现:
@Service
public class SceneServiceImpl implements SceneService {
@Autowired
private SceneMapper sceneMapper;
@Override
public SceneVO getScenesBySessionId(String sessionId) {
SceneVO sceneVO = new SceneVO();
sceneVO.setSessionId(sessionId);
sceneVO.setSceneList(sceneMapper.selectBySessionId(sessionId));
return sceneVO;
}
}
6. Controller 层设计
/scenes/{sessionId}
,Controller 会获取 sessionId
,然后调用 SceneService
返回结果。Controller 示例:
@RestController
@RequestMapping("/scenes")
public class SceneController {
@Autowired
private SceneService sceneService;
@GetMapping("/{sessionId}")
public SceneVO getScenes(@PathVariable String sessionId) {
return sceneService.getScenesBySessionId(sessionId);
}
}
7. 总结
sessionId
提取到外层,避免冗余,并通过合适的 MyBatis 配置与 Service 层设计,将数据以优雅的方式返回给前端。8. 扩展与优化建议
分页查询:对于数据量较大的场景列表,可以考虑引入分页查询,避免一次性查询大量数据。 缓存优化:可以通过引入缓存(如 Redis)来加速查询,特别是在查询结果不频繁变化的情况下。
-END-
ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞。
最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:
网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。
添加时备注:副业