MyBatis樹形結(jié)構(gòu)查詢的實(shí)現(xiàn)示例
前言
對(duì)于樹形結(jié)構(gòu)的數(shù)據(jù)庫設(shè)計(jì)通常是基于繼承關(guān)系設(shè)計(jì)的,也就是通過父ID關(guān)聯(lián)來實(shí)現(xiàn)的,還有就是基于左右值編碼設(shè)計(jì)。本文以繼承關(guān)系設(shè)計(jì)的樹形結(jié)構(gòu)來討論下MyBatis樹形結(jié)構(gòu)查詢。以深度為二的樹為例,要將這種結(jié)構(gòu)的數(shù)據(jù)查詢出來,通常的做法是先查詢一級(jí)數(shù)據(jù),再查詢二級(jí)數(shù)據(jù),然后在程序里組裝起來,想了下,其實(shí)還可以更簡單,不用分開兩次,就能將不同級(jí)別數(shù)據(jù)一次性查詢映射出來。
1.數(shù)據(jù)準(zhǔn)備
以區(qū)域表為例,數(shù)據(jù)如下
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for area
-- ----------------------------
DROP TABLE IF EXISTS `area`;
CREATE TABLE `area` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'PK',
`area_name` varchar(50) NOT NULL COMMENT '地區(qū)名稱',
`parent_id` int(11) NOT NULL COMMENT '父Id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7668 DEFAULT CHARSET=utf8 COMMENT='地區(qū)表';
-- ----------------------------
-- Records of area
-- ----------------------------
INSERT INTO `area` VALUES ('1', '廣東省', '0');
INSERT INTO `area` VALUES ('2', '深圳市', '1');
INSERT INTO `area` VALUES ('3', '廣州市', '1');
INSERT INTO `area` VALUES ('4', '湖南省', '0');
INSERT INTO `area` VALUES ('5', '長沙市', '4');
INSERT INTO `area` VALUES ('6', '株洲市', '4');
2.實(shí)體類
public class Area {
private Integer id;
private String areaName;
private Integer parentId;
List<Area> children;
//getter setter
}
3.查詢sql
SELECT
t_top.id AS id1,
t_top.area_name AS area_name1,
t_top.parent_id AS parent_id1,
t_second.id AS id2,
t_second.area_name AS area_name2,
t_second.parent_id AS parent_id2
FROM
(
SELECT
id,
area_name,
parent_id
FROM
area
WHERE
parent_id = 0
) AS t_top
INNER JOIN (
SELECT
id,
area_name,
parent_id
FROM
area
WHERE
parent_id IN (
SELECT
id
FROM
area
WHERE
parent_id = 0
)
) AS t_second ON t_top.id = t_second.parent_id
基本思路就是將一級(jí)區(qū)域查詢出來作為臨時(shí)表t_top,將二級(jí)區(qū)域查詢出來作為臨時(shí)表t_second,然后將兩張表做inner join操作,查詢結(jié)果:

4.ResultMap映射
<resultMap id="TreeResultMap" type="com.domain.Area" >
<id column="id1" property="id" jdbcType="INTEGER" />
<result column="area_name1" property="areaName" jdbcType="VARCHAR" />
<result column="parent_id1" property="parentId" jdbcType="INTEGER" />
<collection property="children" ofType="com.domain.Area">
<id column="id2" property="id" jdbcType="INTEGER" />
<result column="area_name2" property="areaName" jdbcType="VARCHAR" />
<result column="parent_id2" property="parentId" jdbcType="INTEGER" />
</collection>
</resultMap>
單元測(cè)試結(jié)果:

到此這篇關(guān)于MyBatis樹形結(jié)構(gòu)查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis樹形結(jié)構(gòu)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA maven compile報(bào)錯(cuò)OutOfMemoryError(內(nèi)存溢出)解決及jvm分析
遇到Maven編譯時(shí)報(bào)OutOfMemoryError錯(cuò)誤通常因?yàn)槟J(rèn)的堆內(nèi)存大小不足,本文就來介紹一下OutOfMemoryError(內(nèi)存溢出)解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-10-10
IDEA無法創(chuàng)建JDK1.8版本的Springboot項(xiàng)目問題解決(2種方法)
本文主要介紹了IDEA無法創(chuàng)建JDK1.8版本的Springboot項(xiàng)目問題解決,包含兩種解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
spring和Mybatis逆向工程的實(shí)現(xiàn)
本文主要介紹了使用Spring和MyBatis進(jìn)行逆向工程,幫助開發(fā)者自動(dòng)生成數(shù)據(jù)庫相關(guān)的代碼,提高開發(fā)效率和代碼質(zhì)量,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07

