mybatis?實(shí)現(xiàn)多層級(jí)collection嵌套
mybatis多層級(jí)collection嵌套
json結(jié)構(gòu)

第一步查詢
第一層查詢,將第一層的id傳遞到第二層當(dāng)條件查詢 column="id"
<resultMap id="BaseResultMapClass" type="com.kingyon.common.models.shortcut.ShortcutKeyClassBean">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="title" jdbcType="VARCHAR" property="title"/>
<result column="img" jdbcType="VARCHAR" property="img"/>
<result column="bgColor" jdbcType="VARCHAR" property="bgColor"/>
<result column="describe" jdbcType="VARCHAR" property="describe"/>
<result column="type" jdbcType="BIGINT" property="type"/>
<collection property="functionBeans" ofType="com.kingyon.common.models.shortcut.ShortcutKeyFunctionBean"
select="com.kingyon.core.repository.ShortcutKeyMapper.getShortcutKeyFunction" column="id">
</collection>
</resultMap><select id="findShortcutKeyByClassID" resultMap="BaseResultMapClass">
select * from t_shortcut_key_class where id=#{classID} ;
</select>第二步查詢
第二層查詢,并將第二層的id傳遞到第三層當(dāng)條件查詢 column="funID" 是別名
<resultMap id="baseShortcutKey" type="com.kingyon.common.models.shortcut.ShortcutKeyFunctionBean">
<id column="id" jdbcType="INTEGER" property="funID"/>
<result column="classID" jdbcType="VARCHAR" property="classID"/>
<result column="describe" jdbcType="VARCHAR" property="describe"/>
<result column="sort" jdbcType="VARCHAR" property="sort"/>
<result column="className" jdbcType="VARCHAR" property="className"/>
<collection property="shortcutKeyBean" ofType="com.kingyon.common.models.shortcut.ShortcutKeyBean"
select="com.kingyon.core.repository.ShortcutKeyMapper.getShortcutKey" column="funID">
</collection>
</resultMap><select id="getShortcutKeyFunction" resultMap="baseShortcutKey">
select fun.id as funID,fun.classID,fun.describe,fun.sort from t_shortcut_key_function as fun where fun.classID=#{classID} order by sort DESC ;
</select>第三步查詢(第三層查詢)
<resultMap id="shortcutKeyBean" type="com.kingyon.common.models.shortcut.ShortcutKeyBean">
<result property="id" column="keyID"/>
<result property="shortcut" column="shortcut"/>
<result property="details" column="details"/>
</resultMap><select id="getShortcutKey" resultMap="shortcutKeyBean">
select * from t_shortcut_key where funID=#{id};
</select>其實(shí)蠻好理解的,就是查詢一個(gè),然后把條件傳遞下步繼續(xù)查詢。。。 使用時(shí)調(diào)第一層,也就是從高到底。
最后附實(shí)體截圖,其實(shí)看json就可以了
第一層實(shí)體:

第二層實(shí)體:

第三層實(shí)體:

方式二(推薦)
<resultMap id="chapter" type="com.xx.xx.xx.xx.xxBean"> ? ? <id column="id" property="id"/> ? ? <result column="name" property="name"/> ? ? <collection property="chapterChildBeans" ? ? ? ? ? ? ? ? ofType="com.xx.xx.mode.xx.xxBean"> ? ? ? ? <id column="cId" property="id"/> ? ? ? ? <result column="cName" property="name"/> ? ? </collection> </resultMap>
<select id="selectChapter" resultMap="chapter">
? ? SELECT c.id,c.name,cc.id as cId,cc.name as cName from t_chapter c,t_chapter_child cc WHERE c.id=cc.chapterID and c.subjectID=#{subjectID}
</select>mybatis多層(三層)嵌套查詢
java 實(shí)體描述
/**
* <p>
* 家庭表
* </p>
*
* @author lohas
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("t_family_info")
@ApiModel(value = "FamilyInfoEntity對(duì)象", description = "家庭表")
public class FamilyInfoEntity extends Model {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主鍵")
@TableId(value = "id", type = IdType.INPUT)
private String id;
@ApiModelProperty(value = "家庭名稱")
private String familyName;
@ApiModelProperty(value = "家庭頭像url")
private String headUrl;
@ApiModelProperty(value = "國(guó)家")
private String country;
@ApiModelProperty(value = "城市")
private String city;
@ApiModelProperty(value = "地址")
private String address;
@ApiModelProperty(value = "經(jīng)度")
private BigDecimal longitude;
@ApiModelProperty(value = "緯度")
private BigDecimal latitude;
@ApiModelProperty(value = "租戶ID")
private String tenantId;
@ApiModelProperty(value = "是否刪除(0:正常;低于0的數(shù)字:已刪除)")
private String deleteFlag;
@ApiModelProperty(value = "創(chuàng)建人ID")
private String creatorId;
@ApiModelProperty(value = "創(chuàng)建時(shí)間")
@JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class)
private LocalDateTime createTime;
@ApiModelProperty(value = "更新人ID")
private String updateId;
@ApiModelProperty(value = "更新時(shí)間")
@JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class)
private LocalDateTime updateTime;
}/**
* @author lohas
* @description
*/
@Data
@ApiModel(value = "RoomDeviceInfoVo對(duì)象", description = "房間設(shè)備信息實(shí)體")
public class RoomDeviceInfoVo implements Serializable {
@ApiModelProperty(value = "房間id")
private String roomId;
@ApiModelProperty(value = "房間名稱")
private String roomName;
@ApiModelProperty(value = "設(shè)備數(shù)量")
private Integer deviceNum;
@ApiModelProperty(value = "設(shè)備信息列表")
private List<String> deviceIds;
}/**
* @author lohas
* @description
*/
@Data
@ApiModel(value = "FamilyRoomInfoVo對(duì)象", description = "家庭房間信息對(duì)象實(shí)例")
public class FamilyRoomInfoVo extends FamilyInfoEntity {
@ApiModelProperty(value = "房間設(shè)備信息列表")
private List<RoomDeviceInfoVo> roomDeviceInfoVoList;
}mybatis xml
<?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="com.lohas.mapper.FamilyInfoMapper">
<select id="getFamilyRoomInfoVoByUserId" resultMap="familyMap">
SELECT *
FROM (
SELECT tfi.*,
trf."id" AS r_room_id, --要加上r因?yàn)閏olumnPrefix="r_"(如果字段唯一,可以不加)
trf.room_name AS r_room_name, --要加上r因?yàn)閏olumnPrefix="r_"
trd.device_id AS r_d_device_id --要加上r因?yàn)閏olumnPrefix="r_",加上d因?yàn)閏olumnPrefix="d_"
FROM t_user_family tuf
LEFT JOIN t_family_info tfi ON tfi.ID = tuf.family_id
LEFT JOIN t_family_room tfr ON tuf.family_id = tfr.family_id
LEFT JOIN t_room_info trf ON tfr.room_id = trf.ID
LEFT JOIN t_room_device trd ON tfr.room_id = trd.room_id
WHERE tuf.user_id = #{userId}
ORDER BY tfi.create_time DESC
) AS fr,
(
SELECT trf."id" AS r_room_id, --要加上r因?yàn)閏olumnPrefix="r_"
COUNT(trd.device_id) AS r_device_num --要加上r因?yàn)閏olumnPrefix="r_"
FROM t_user_family tuf
LEFT JOIN t_family_info tfi ON tfi.ID = tuf.family_id
LEFT JOIN t_family_room tfr ON tuf.family_id = tfr.family_id
LEFT JOIN t_room_info trf ON tfr.room_id = trf.
ID
LEFT JOIN t_room_device trd ON tfr.room_id = trd.room_id
WHERE tuf.user_id = #{userId}
GROUP BY trf."id"
) AS rd
WHERE fr.r_room_id = rd.r_room_id
</select>
<resultMap id="familyMap" type="com.lohas.vo.FamilyRoomInfoVo">
<!-- 一層: 家庭信息-->
<id column="id" jdbcType="VARCHAR" property="id"/>
<result column="family_name" jdbcType="VARCHAR" property="familyName"/>
<result column="head_url" jdbcType="VARCHAR" property="headUrl"/>
<result column="country" jdbcType="VARCHAR" property="country"/>
<result column="city" jdbcType="VARCHAR" property="city"/>
<result column="address" jdbcType="VARCHAR" property="address"/>
<result column="longitude" jdbcType="NUMERIC" property="longitude"/>
<result column="latitude" jdbcType="NUMERIC" property="latitude"/>
<result column="delete_flag" jdbcType="CHAR" property="deleteFlag"/>
<result column="creator_id" jdbcType="VARCHAR" property="creatorId"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_id" jdbcType="VARCHAR" property="updateId"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/>
<!-- 如果字段唯一,可以不加columnPrefix="r_"-->
<collection property="roomDeviceInfoVoList" columnPrefix="r_" resultMap="roomMap"/>
</resultMap>
<resultMap id="roomMap" type="com.lohas.vo.RoomDeviceInfoVo">
<!-- 二層: 房間信息-->
<result column="room_id" jdbcType="VARCHAR" property="roomId"/>
<result column="room_name" jdbcType="VARCHAR" property="roomName"/>
<result column="device_num" jdbcType="VARCHAR" property="deviceNum"/>
<!-- 如果字段唯一,可以不加columnPrefix="d_"-->
<collection property="deviceIds" columnPrefix="d_" resultMap="deviceMap"/>
</resultMap>
<resultMap id="deviceMap" type="string">
<!-- 三層: 設(shè)備信息-->
<result column="device_id" jdbcType="VARCHAR"/>
</resultMap>
</mapper>調(diào)用方法
public interface FamilyInfoMapper extends BaseMapper<FamilyInfoEntity> {?
?? ?List<FamilyRoomInfoVo> getFamilyRoomInfoVoByUserId(@Param("userId") String userId); ??
}注意總結(jié)
如果你的字段唯一,columnPrefix="r_" 和 columnPrefix="d_",可以不加,如果你加上了columnPrefix記得在字段上拼接上,否則查詢不出數(shù)據(jù),拼接要有前后順序拼接例如:
<collection property="roomDeviceInfoVoList" columnPrefix="r_" resultMap="roomMap"/> <collection property="deviceIds" columnPrefix="d_" resultMap="deviceMap"/> r_d_device_id(要加上r因?yàn)閞oomMap columnPrefix="r_",加上d因?yàn)閐eviceMap columnPrefix="d_")
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中字符數(shù)組和字符串與StringBuilder和字符串轉(zhuǎn)換的講解
今天小編就為大家分享一篇關(guān)于Java中字符數(shù)組和字符串與StringBuilder和字符串轉(zhuǎn)換的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Java實(shí)現(xiàn)將PDF轉(zhuǎn)為圖片格式的方法詳解
PDF文件和圖片文件,這是兩種完全不一樣的格式,可是有的時(shí)候這兩種格式卻是有相互轉(zhuǎn)換的需要,本文將介紹如何通過(guò)Java應(yīng)用程序快速高效地將PDF轉(zhuǎn)為圖片格式。一起來(lái)看看吧2023-03-03
java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)詳解
在本篇文章中小編給大家分享了關(guān)于java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)的相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。2019-04-04
詳解SpringBoot開(kāi)發(fā)案例之整合定時(shí)任務(wù)(Scheduled)
本篇文章主要介紹了詳解SpringBoot開(kāi)發(fā)案例之整合定時(shí)任務(wù)(Scheduled),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
關(guān)于kafka-consumer-offset位移問(wèn)題
這篇文章主要介紹了關(guān)于kafka-consumer-offset位移問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理
這篇文章主要介紹了JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理 的相關(guān)資料,需要的朋友可以參考下2016-07-07
springboot整合企微webhook機(jī)器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機(jī)器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

