mybatis mysql查询树形结构_MyBatis collection 集合嵌套查询树形节点
原標(biāo)題:MyBatis collection 集合嵌套查詢樹(shù)形節(jié)點(diǎn)
MyBatis collection 集合
MyBatis 是數(shù)據(jù)持久層框架,支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。尤其強(qiáng)大在于它的映射語(yǔ)句,比如高級(jí)映射中的 collection 集合。
collection 集合,集合常用的兩個(gè)場(chǎng)景是集合的嵌套查詢、集合的嵌套結(jié)果。集合的嵌套結(jié)果就是查詢結(jié)果對(duì)應(yīng)嵌套子對(duì)象。這里就是利用 collection 集合嵌套查詢樹(shù)形節(jié)點(diǎn)。下面來(lái)一一實(shí)現(xiàn)。
查詢樹(shù)形節(jié)點(diǎn) Web 案例 創(chuàng)建數(shù)據(jù)庫(kù)表
節(jié)點(diǎn)表:
CREATE TABLE `node` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`parent_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='節(jié)點(diǎn)表'
簡(jiǎn)單的節(jié)點(diǎn)父子關(guān)系設(shè)計(jì),下面插入幾條數(shù)據(jù):
INSERT INTO node (name, parent_id) VALUES ('一級(jí)節(jié)點(diǎn)A', 0);
INSERT INTO node (name, parent_id) VALUES ('一級(jí)節(jié)點(diǎn)B', 0);
INSERT INTO node (name, parent_id) VALUES ('一級(jí)節(jié)點(diǎn)C', 0);
INSERT INTO node (name, parent_id) VALUES ('二級(jí)節(jié)點(diǎn)AA', 1);
INSERT INTO node (name, parent_id) VALUES ('二級(jí)節(jié)點(diǎn)aa', 1);
INSERT INTO node (name, parent_id) VALUES ('二級(jí)節(jié)點(diǎn)BB', 2);
INSERT INTO node (name, parent_id) VALUES ('三級(jí)級(jí)節(jié)點(diǎn)AAA', 4);
INSERT INTO node (name, parent_id) VALUES ('三級(jí)級(jí)節(jié)點(diǎn)aaa', 4);
INSERT INTO node (name, parent_id) VALUES ('三級(jí)級(jí)節(jié)點(diǎn)BBB', 6);mybatis-collection-tree 工程
pom.xml 添加 mybatis 依賴:
4.0.0
springboot
mybatis-collection-tree
0.0.1-SNAPSHOT
MyBatis :: collection 集合嵌套查詢樹(shù)形節(jié)點(diǎn)
org.springframework.boot
spring-boot-starter-parent
1.5.1.RELEASE
1.2.0
5.1.39
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis-spring-boot}
mysql
mysql-connector-java
${mysql-connector}
junit
junit
4.12
在 application.properties 應(yīng)用配置文件,增加 Mybatis 相關(guān)配置:
## 數(shù)據(jù)源配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
## Mybatis 配置
mybatis.typeAliasesPackage=org.mybatis.domain
mybatis.mapperLocations=classpath:mapper/*.xml
mybatis.typeAliasesPackage 配置為 org.mybatis.domain,指向?qū)嶓w類(lèi)包路徑。mybatis.mapperLocations 配置為 classpath 路徑下 mapper 包下,* 代表會(huì)掃描所有 xml 文件。
重要的還是看 collection 在 xml 的映射實(shí)現(xiàn),NodeMapper.xml 代碼如下:
ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
id, name
SELECT
FROM node
WHERE parent_id = #{id}
SELECT
FROM node
WHERE parent_id = 0
在 dao 層,我們只調(diào)用 getNodeTree方法, parent_id=0代表頂級(jí)節(jié)點(diǎn)。然后通過(guò) collection 節(jié)點(diǎn)繼續(xù)調(diào)用 getNextNodeTree方法進(jìn)行循環(huán)調(diào)用。
ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
以下是關(guān)鍵的知識(shí)點(diǎn):
column 代表會(huì)拿父節(jié)點(diǎn) id ,作為參數(shù)獲取 next 對(duì)象
javaType 代表 next 對(duì)象是個(gè)列表,其實(shí)可以省略不寫(xiě)
ofType 用來(lái)區(qū)分 JavaBean 屬性類(lèi)型和集合包含的類(lèi)型
select 是用來(lái)執(zhí)行循環(huán)哪個(gè) SQL
工程代碼地址:https://github.com/JeffLi1993/myabtis-learning-example工程演示后的結(jié)果如圖所示:
思考小結(jié)
這樣的實(shí)現(xiàn)原理,嵌套 SQL 執(zhí)行,這里就存在一個(gè)性能上的問(wèn)題。比如 10 萬(wàn)條數(shù)據(jù),需要執(zhí)行 10 萬(wàn)次 SELECT 語(yǔ)句。所以不推薦數(shù)據(jù)量級(jí)大的樹(shù)形結(jié)構(gòu)。
如果結(jié)構(gòu)不經(jīng)常改變,數(shù)量級(jí)還行,可以考慮加緩存。這樣,讀取的數(shù)據(jù)庫(kù)的次數(shù)大大減少,比如省市區(qū)。
還有一種常用的樹(shù)形節(jié)點(diǎn)實(shí)現(xiàn)是,讀取幾次,內(nèi)存處理。這樣的好處就是減少對(duì)數(shù)據(jù)庫(kù)查詢次數(shù),內(nèi)存處理速度很快,性能大大提升。
參考文獻(xiàn):http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
快掃一掃支持下
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的mybatis mysql查询树形结构_MyBatis collection 集合嵌套查询树形节点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: mysql数据库定点任务_MySQL数据
- 下一篇: mysql dataset_数据库 da
