查询此表某个id=4028ab535e370cd7015e37835f52014b(公司1)下的所有数据

正常情况下,我们采用递归算法查询,如下

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区域编写存储过程内容

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层只需要调用一次该 存储过程,就可以返回自己想要的数据,存储过程中创建的临时表随着链接的释放自动删除

用mysql存储过程代替递归查询的更多相关文章

  1. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  2. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  3. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  4. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  5. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  6. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  7. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  8. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  9. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

随机推荐

  1. layui 日期插件onchange事件失效的方法

    laydate.render({ elem:'#text1',//制定元素 type:'date', //range:true,//开启左右面板 min:'2017-09-1',// max:'201 ...

  2. C# 测试代码段性能耗时

     一:              DateTime BeginTime = System.DateTime.Now;            //代码            DateTime EndTi ...

  3. Lab 3-3

    Execute the malware found in the file Lab03-03.exe while monitoring it using basic dynamic analysis ...

  4. javaweb课程信息管理系统

    1.DBUtil包连接数据库 2.Bin包设计成员函数及方法 3.Dao包设计sql语句 4.servlet包增删改查方法 5.service连接servlet 6.设计jsp增删改查页面 7.连接各 ...

  5. p2751 Job Processing

    如果单单只安排过程1的时间最短,很容易算出来.用优先队列取最小,加上增量后再放回就行.对过程2也进行这样的操作.将过程1第一个完成的在过程2最后一个完成.以样例来说,过程1:1,1,2,2,3,过程2 ...

  6. VS Code插件

    VS Code下载地址: https://code.visualstudio.com/ 1.view in browser   和  Open-In-Browser  安装可在编辑器中打开html,在 ...

  7. Luffy之Xadmin以及首页搭建(轮播图,导航)

    1. 首页 1.1 轮播图 admin站点配置支持图片上传 pip install Pillow 默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径.我们可以将上传的文件保存 ...

  8. Android BottomNavigationBar底部导航控制器的使用(包含默认postion的设置)

    转载请标明出处:http://blog.csdn.net/u010046908/article/details/50962081本文出自:[李东的博客] 最近Google在自己推出的Material ...

  9. Non-UTF-8 code starting with '\xbb' in file

    一.错误问题 错误问题:Non-UTF-8 code starting with '\xbb' in file,如图所示: 二.分析问题 原因:程序文件夹中出现中文,运行的时候出现如下错误,导致出错的 ...

  10. 廖雪峰网站:学习python基础知识—循环(四)

    一.循环 1.for names = ['Michal', 'Bob', 'tracy'] for name in names: print(name) sum = 0 for x in [1, 2, ...