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.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這纔是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!