用mysql存储过程代替递归查询
查询此表某个id=4028ab535e370cd7015e37835f52014b(公司1)下的所有数据
正常情况下,我们采用递归算法查询,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public void findCorpcompanyListByParentId(List<UapcompanyVo> vos,String parentId){ UapcompanyParam param = new UapcompanyParam(); param.setParentid(parentId); List<Uapcompany> companyList = uapcompanyDao.finduapcompanyList(param); UapcompanyVo uapcompanyVo = null ; for (Uapcompany uapcompany : companyList){ uapcompanyVo = new UapcompanyVo(); uapcompanyVo = new UapcompanyVo(); uapcompanyVo.setId(uapcompany.getId()); uapcompanyVo.setName(uapcompany.getName()); uapcompanyVo.setParentid(uapcompany.getParentid()); vos.add(uapcompanyVo); this .findCorpcompanyListByParentId(vos, uapcompany.getParentid()); } } |
递归查询也能实现该需求,但是这样有两个缺点:一,性能很差 ,因为每递归一次至少调用一次数据链接;二,如果数据量很大的话,可能会导致溢出,当然可以修改虚拟机参数,不过这也是治标不治本的方法
接下来,我们看一下存储过程实现查询:
选择函数-->右键-->选择新建函数
选择过程
添加入参参数,如下图所示
完成,如下图所示
在begin end区域编写存储过程内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
BEGIN #声明一个flag变量,默认值为-99 DECLARE flag INT DEFAULT -99; #创建companyTempTabl_Qurey临时表 CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_Qurey ( id VARCHAR (32) NOT NULL , ` name ` VARCHAR (100), attr VARCHAR (30), parentId VARCHAR (32) ); TRUNCATE TABLE companyTempTabl_Qurey; #创建companyTempTabl_Result临时表 CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_Result ( id VARCHAR (32) NOT NULL , ` name ` VARCHAR (100), attr VARCHAR (30), parentId VARCHAR (32) ); TRUNCATE TABLE companyTempTabl_Result; #根据参数 parentId 查询数据,并插入companyTempTabl_Qurey临时表 INSERT INTO companyTempTabl_Qurey ( id, ` name `, attr, parentId ) SELECT uapcompany.id, uapcompany.` name `, uapcompany.attr, uapcompany.parentId FROM uapcompany WHERE uapcompany.parentId = `parentId`; #根据参数 parentId 查询数据,并插入companyTempTabl_Result临时表 INSERT INTO companyTempTabl_Result ( id, ` name `, attr, parentId ) SELECT uapcompany.id, uapcompany.` name `, uapcompany.attr, uapcompany.parentId FROM uapcompany WHERE uapcompany.parentId = `parentId`; #根据参数 parentId 统计查询总数,并赋值给变量flag SELECT count (1) INTO flag FROM uapcompany WHERE uapcompany.parentId = `parentId`; #如果flag 大于 0,则进行循环 WHILE flag > 0 DO #创建companyTempTabl_temp 临时表 CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_temp ( id VARCHAR (32) NOT NULL , ` name ` VARCHAR (100), attr VARCHAR (30), parentId VARCHAR (32) ); TRUNCATE TABLE companyTempTabl_temp; #数据库表uapcompany关联临时表companyTempTabl_Qurey查询,并将查询结果插入 临时表companyTempTabl_temp INSERT INTO companyTempTabl_temp (id, ` name `, attr, parentId) SELECT uapcompany.id, uapcompany.` name `, uapcompany.attr, uapcompany.parentId FROM uapcompany, companyTempTabl_Qurey WHERE uapcompany.parentId = companyTempTabl_Qurey.id; #删除临时表companyTempTabl_Qurey数据 DELETE FROM companyTempTabl_Qurey; #将临时表companyTempTabl_temp的数据 插入companyTempTabl_Qurey临时表,用作下一个循环的条件 INSERT INTO companyTempTabl_Qurey (id, ` name `, attr, parentId) SELECT companyTempTabl_temp.id, companyTempTabl_temp.` name `, companyTempTabl_temp.attr, companyTempTabl_temp.parentId FROM companyTempTabl_temp; #将临时表companyTempTabl_temp的数据 插入到companyTempTabl_Result临时表(该表的数据也是我们最终要返回的数据) INSERT INTO companyTempTabl_Result (id, ` name `, attr, parentId) SELECT companyTempTabl_temp.id, companyTempTabl_temp.` name `, companyTempTabl_temp.attr, companyTempTabl_temp.parentId FROM companyTempTabl_temp; #删除companyTempTabl_temp数据 DROP TABLE companyTempTabl_temp; #数据库表uapcompany关联 临时表companyTempTabl_Qurey查询统计,并将结果赋值给变量flag SELECT count (1) INTO flag FROM uapcompany, companyTempTabl_Qurey WHERE uapcompany.parentId = companyTempTabl_Qurey.id; END WHILE; SELECT id ,` name `,attr,parentId FROM companyTempTabl_Result; END |
然后保存
测试一下,点击运行
输入参数,点击确定,结果如下图所示
我们在dao层只需要调用一次该 存储过程,就可以返回自己想要的数据,存储过程中创建的临时表随着链接的释放自动删除