MyBatis樹形結(jié)構(gòu)查詢的實現(xiàn)示例
前言
對于樹形結(jié)構(gòu)的數(shù)據(jù)庫設計通常是基于繼承關系設計的,也就是通過父ID關聯(lián)來實現(xiàn)的,還有就是基于左右值編碼設計。本文以繼承關系設計的樹形結(jié)構(gòu)來討論下MyBatis樹形結(jié)構(gòu)查詢。以深度為二的樹為例,要將這種結(jié)構(gòu)的數(shù)據(jù)查詢出來,通常的做法是先查詢一級數(shù)據(jù),再查詢二級數(shù)據(jù),然后在程序里組裝起來,想了下,其實還可以更簡單,不用分開兩次,就能將不同級別數(shù)據(jù)一次性查詢映射出來。
1.數(shù)據(jù)準備
以區(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.實體類
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
基本思路就是將一級區(qū)域查詢出來作為臨時表t_top,將二級區(qū)域查詢出來作為臨時表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>
單元測試結(jié)果:

到此這篇關于MyBatis樹形結(jié)構(gòu)查詢的實現(xiàn)示例的文章就介紹到這了,更多相關MyBatis樹形結(jié)構(gòu)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Idea的選擇文件后定位瞄準器"Select Opened File"的功能
使用IntelliJ IDEA時,可能會發(fā)現(xiàn)"SelectOpenedFile"功能不見了,這個功能允許用戶快速定位到當前打開文件的位置,若要找回此功能,只需在IDEA的標題欄上右鍵,然后選擇"Always Select Opened File",這樣就可以重新啟用這個便捷的功能2024-11-11
Java把多個對象的list的數(shù)據(jù)合并的方法示例
在Java中合并多個List可以使用遍歷、Stream API或Apache Commons Collections,通過遍歷各個List并將元素添加到新List實現(xiàn)合并,Java 8提供了Stream API,使用Stream.of()和flatMap()可以簡潔地合并List,文中給出了多種方法示例,需要的朋友可以參考下2024-09-09
Springboot中登錄后關于cookie和session攔截問題的案例分析
這篇文章主要介紹了Springboot中登錄后關于cookie和session攔截案例,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

