vhr部门管理数据库设计与编程

项目地址:https://github.com/lenve/vhr

好了,那我们本文主要来看看数据库的设计与存储过程的编写。

部门数据库整体来说还是比较简单,如下:

都是常规字段,脚本可以在项目中下载。depPath是为了查询方便,isParent表示该条是否是父部门。为了简化程序中的逻辑,depPath的设置和isParent的设置我都在存储过程中完成。

添加部门存储过程

添加部门存储过程如下:

DELIMITER $$

USE `vhr`$$

DROP PROCEDURE IF EXISTS `addDep`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `addDep`(in depName varchar(32),in parentId int,in enabled boolean,out result int,out result2 int)
begin
  declare did int;
  declare pDepPath varchar(64);
  insert into department set name=depName,parentId=parentId,enabled=enabled;
  select row_count() into result;
  select last_insert_id() into did;
  set result2=did;
  select depPath into pDepPath from department where id=parentId;
  update department set depPath=concat(pDepPath,'.',did) where id=did;
  update department set isParent=true where id=parentId;
end$$

DELIMITER ;

关于这个存储过程,我说如下几点:

1.该存储过程接收五个参数,三个输入参数分别是部门名称、父部门Id,该部门是否启用,两个输出参数分别表示受影响的行数和插入成功后id的值。

2.存储过程首先执行插入操作,插入完成后,将受影响行数赋值给result。

3.然后通过last_insert_id()获取刚刚插入的id,赋给result2。

4.接下来查询父部门的depPath,并且和刚刚生成的id组合后作为刚刚插入部门的depPath。

5.将父部门的isParent字段更新为true。

将这些逻辑写在存储过程中,可以简化我们代码中的逻辑。

删除部门存储过程

删除部门也被我写成了存储过程,主要是因为删除过程也要做好几件事,核心代码如下:

DELIMITER $$

USE `vhr`$$

DROP PROCEDURE IF EXISTS `deleteDep`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `deleteDep`(in did int,out result int)
begin
  declare ecount int;
  declare pid int;
  declare pcount int;
  select count(*) into ecount from employee where departmentId=did;
  if ecount>0 then set result=-1;
  else 
  select parentId into pid from department where id=did;
  delete from department where id=did and isParent=false;
  select row_count() into result;
  select count(*) into pcount from department where parentId=pid;
  if pcount=0 then update department set isParent=false where id=pid;
  end if;
  end if;
end$$

DELIMITER ;

关于这个存储过程,我说如下几点:

1.一个输入参数表示要删除数据的id,一个输出参数表示删除结果。

2.如果该部门下有员工,则该部门不能被删除。

3.删除该部门时注意加上条件isParent=false,即父部门不能被删除,这一点我在前端已经做了判断,正常情况下父部门的删除请求不会被发送,但是考虑到前端的数据不能被信任,所以后台我们也要限制。

4.删除成功之后,查询删除部门的父部门是否还有其他子部门,如果没有,则将父部门的isParent修改为false。

其他一些琐碎的技术就不值得介绍了,大家在源码中自行研究,有问题欢迎留言讨论。

本文分享自微信公众号 - 玩转JavaEE(gh_d1ca11234a30)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

重置多说配置后的问题,这是不让我从良的节奏啊(附禁用谷歌在线字体的方法)!

本想今天发文从良,金盆洗手,从此不再折腾博客,安心写文章的。结果,发现多说又不能同步服务器评论到本地了!特么真是怕什么来什么啊!想来这金盆暂时用不着了。。。 想...

43550
来自专栏沃趣科技

使用pg_stat_statement监控pgsql遇到的问题

pg_stat_statements是PG中监控数据库活动的重要插件,通过它可以获得SQL的统计信息,例如该SQL被调用了多少次,返回了多少记录,在读写数据上...

40750
来自专栏沃趣科技

【QMonitor新特性】SQL性能历史跟踪及SQL执行计划变更历史

业界通常把DBA分为系统DBA和应用DBA两种。对于系统DBA来说,主要的职责是确保数据库系统的稳定和高效的运行。而应用DBA主要是优化应用,以求得一种“更经济...

37050
来自专栏张戈的专栏

超简单的MySQL主从复制配置步骤

MySQL 估计就是俺的主战场了,看来得多收藏一些 MySQL 的技术教程才行。正愁没啥东西可以写,就先转载一篇超简单的 MySQL 主从复制的配置教程好了。 ...

48850
来自专栏沃趣科技

oracle 查询转换初探

Oracle‍‍查询转换初探 作者‍:邱大龙‍‍ 概述 Oracle查询转换器的作用是把原始sql重写为语义相同的语句,目的是为了获得更高效的sql。 ...

40050
来自专栏沃趣科技

PostgreSQL中删除的数据能否恢复

问题的提出 有人问PostgreSQL数据库中刚刚删除的数据能否被恢复? 或更进一步,如果如要在一个事务中做了一系列的更新、删除、插入的操作后,把这个事务提交之...

71480
来自专栏沃趣科技

基于Oracle的私有云架构探析(连载一)@【DTCC干货分享】

云是当今最为热门的一个话题或者说技术,在数据库界也一样,Oracle 12G这个名字不硬生生被掰弯成了Oracle 12C,数据库云在我看来能给企业带来的第一价...

49750
来自专栏沃趣科技

ASM 翻译系列第二弹:ASM 12C 版本新特性

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 随着Oracle 12c的发布,也就意味着全新版本的ASM面世了。已知的重大新...

39740
来自专栏人称T客

IBM中国思变 Cognos源码授权卖给元年为哪般?

T客汇官网:tikehui.com 撰文 | 人称T客 窦悦怡 自从将PC业务出售给联想起就开启了IBM的售卖之旅,随后相继出售了服务器业务,芯片业务,IBM ...

42630
来自专栏沃趣科技

Oracle并行基础

Oracle并行基础 概述 ? Oracle企业版有一项非常厉害的技术:并行查询,也就是说一个语句可以雇佣多个服务器进程(parallel slaves也叫PX...

52470

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励