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)文章
springboot如何獲取application.yml里值的方法
這篇文章主要介紹了springboot如何獲取application.yml里的值,文章圍繞主題相關(guān)自資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解
這篇文章主要介紹了Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例
遞歸算法的代碼比較簡(jiǎn)潔,可讀性較好;但是在實(shí)際的業(yè)務(wù)處理中會(huì)出現(xiàn)多次的重復(fù)調(diào)用,如果處理不好,很容易出現(xiàn)StackOverflowError報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-04-04
探索Java中的equals()和hashCode()方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了探索Java中的equals()和hashCode()方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
劍指Offer之Java算法習(xí)題精講鏈表與數(shù)組專項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
支付寶二面:使用?try-catch?捕獲異常會(huì)影響性能嗎(推薦)
這篇文章主要介紹了支付寶二面:使用?try-catch?捕獲異常會(huì)影響性能嗎,需要注意的是,JVM?中?異常處理的catch語(yǔ)句不再由字節(jié)碼指令來(lái)實(shí)現(xiàn)(很早之前通過(guò)?jsr和?ret指令來(lái)完成,需要的朋友可以參考下2023-03-03
MybatisPlus關(guān)聯(lián)查詢的完美實(shí)現(xiàn)方案
我們?cè)陧?xiàng)目開發(fā)的時(shí)候,難免會(huì)遇到連表查詢的操作,所以下面這篇文章主要給大家介紹了關(guān)于MybatisPlus關(guān)聯(lián)查詢的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12

