`
qcyycom
  • 浏览: 193241 次
社区版块
存档分类
最新评论

Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)

    博客分类:
  • java
阅读更多

 

一:事务

首先看一下什么是事务:

 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。 
然后看一下事务要遵循的ISO/IEC
所制定的ACID原则

ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

1.事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。

2.一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。

3.隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

4.持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。 

看一下一些准备知识:

1.T-SQL使用下列语句来管理事务:

开始事务:BEGIN TRANSACTION

提交事务:COMMIT TRANSACTION

回滚(撤销)事务:ROLLBACK TRANSACTION

一旦事务提交或回滚,则事务结束。

2.判断某条语句执行是否出错:

使用全局变量@@ERROR

@@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计

            如: SET @errorSum=@errorSum+@@error

了解一下事务的分类:

显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型

隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务

自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚

使用事务解决经典银行转账事务问题

T-SQL语句:

 

  1. BEGIN TRANSACTION   
  2. /*--定义变量,用于累计事务执行过程中的错误--*/  
  3. DECLARE @errorSum INT   
  4. SET @errorSum=0  --初始化为0,即无错误  
  5. /*--转账:张三的账户少1000元,李四的账户多1000元*/  
  6. UPDATE bank SET currentMoney=currentMoney-1000  
  7.    WHERE customerName='张三'  
  8. SET @errorSum=@errorSum+@@error  
  9. UPDATE bank SET currentMoney=currentMoney+1000  
  10.    WHERE customerName='李四'  
  11. SET @errorSum=@errorSum+@@error  --累计是否有错误  
  12. IF @errorSum<>0  --如果有错误  
  13.   BEGIN  
  14.     print '交易失败,回滚事务'  
  15.     ROLLBACK TRANSACTION   
  16.   END    
  17. ELSE  
  18.   BEGIN  
  19.     print '交易成功,提交事务,写入硬盘,永久的保存'  
  20.     COMMIT TRANSACTION     
  21.   END  
  22. GO  
  23. print '查看转账事务后的余额'  
  24. SELECT * FROM bank    
  25. GO   



 

Javaj调用数据库事务方法在ava程序员从笨鸟到菜鸟之(七)一—java数据库操作

已经提到过了。在此就不在陈述了

 

二:索引

首先看一下什么事索引(以sqlserver为例):

SQL Server中的数据也是按页( 4KB )存放

索引:是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据 

索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页

索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能

然后看一下索引的类型:

1.唯一索引:唯一索引不允许两行具有相同的索引值

2.主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空

3.聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个

4.非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249

示例:利用企业管理器创建索引


使用T-SQL语句创建索引的语法:

CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]  

    INDEX   index_name

     ON table_name (column_name)

      [WITH FILLFACTOR=x]

注:UNIQUE表示唯一索引,可选

CLUSTEREDNONCLUSTERED表示聚集索引还是非聚集索           引,可选

FILLFACTOR表示填充因子,指定一个0100之间的值,

该值指示索引页填满的空间所占的百分比

创建索引示例:

  1. USE stuDBGOIF EXISTS (SELECT name FROM sysindexes           WHERE name = 'IX_writtenExam')   DROP INDEX stuMarks.IX_writtenExam  /*--笔试列创建非聚集索引:填充因子为30%--*/CREATE NONCLUSTERED INDEX IX_writtenExam     ON stuMarks(writtenExam)      WITH FILLFACTOR= 30GO/*-----指定按索引 IX_writtenExam 查询----*/SELECT * FROM stuMarks  with (INDEX=IX_writtenExam)    WHERE writtenExam BETWEEN 60 AND 90  



 

索引的优缺点:

优点:1.加快访问速度2.加强行的唯一性

缺点:1.带索引的表在数据库中需要更多的存储空间

2.操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新

三:视图

首先还是先看一下什么事视图:

视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上。视图中并不存放数据,而是存放在视图所引用的原始表(基表)中同一张原始表,根据不同用户的不同需求,可以创建不同的视图

使用企业管理器创建视图:


使用T-SQL语句创建视图的语法:

CREATE VIEW view_name  

   AS

    <select语句>

示例:创建方便教员查看成绩的视图

 

  1. <span style="color:#000000;">IF EXISTS (SELECT * FROM sysobjects WHERE  
  2.                          name = 'view_stuInfo_stuMarks')  
  3.      DROP VIEW view_stuInfo_stuMarks  
  4. GO  
  5. CREATE VIEW view_stuInfo_stuMarks  
  6.   AS  
  7.     SELECT 姓名=stuName,学号=stuInfo.stuNo,  
  8.       笔试成绩 =writtenExam,  机试成绩=labExam,  
  9.             平均分=(writtenExam+labExam)/2   
  10.                FROM stuInfo LEFT JOIN stuMarks   
  11.                      ON stuInfo.stuNo=stuMarks.stuNo  
  12. GO  
  13. SELECT * FROM view_stuInfo_stuMarks</span>  



 

四:存储过程:

首先还是来看一下什么事存储过程:

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程(procedure)类似于Java语言中的方法

用来执行管理任务或应用复杂的业务规则

存储过程可以带参数,也可以返回结果

存储过程的有点:

执行速度更快

允许模块化程序设计 

提高系统安全性

减少网络流通量

存储过程分类:

1.系统存储过程

由系统定义,存放在master数据库中,类似Java语言类库中的方法。

系统存储过程的名称都以“sp_”开头或“xp_”开头

2.用户自定义存储过程

由用户在自己的数据库中创建的存储过程,类似Java语言中用户自定义的方法

常用的系统存储过程


定义存储过程的语法

    CREATE  PROC[EDURE]  存储过程名 

              @参数1  数据类型 默认值 OUTPUT,

              …… ,

             @参数n  数据类型 默认值 OUTPUT

             AS

            SQL语句

    GO

Java语言的方法一样,参数可选

参数分为输入参数、输出参数 

输入参数允许有默认值

先给出一个不带输入参数的存储过程的例子:

  1. CREATE PROCEDURE proc_stu   //proc_stu为存储过程的名称  
  2.   AS    DECLARE @writtenAvg float,@labAvg float //笔试平均分和机试平均分变量     SELECT @writtenAvg=AVG(writtenExam),           @labAvg=AVG(labExam)  FROM stuMarks    print '笔试平均分:'+convert(varchar(5),@writtenAvg)      print '机试平均分:'+convert(varchar(5),@labAvg)    IF (@writtenAvg>70 AND @labAvg>70)       print '本班考试成绩:优秀'    ELSE       print '本班考试成绩:较差'    print '--------------------------------------------------'    print '           参加本次考试没有通过的学员:'    SELECT stuName,stuInfo.stuNo,writtenExam,labExam       FROM  stuInfo  INNER JOIN stuMarks ON            stuInfo.stuNo=stuMarks.stuNo                 WHERE writtenExam<60 OR labExam<60 GO  


 

执行存储过程的语法:

调用的语法

EXEC  过程名  [参数]

存储过程的参数分两种:1.输入参数2.输出参数

输入参数:用于向存储过程传入值,类似Java带参方法

输出参数:用于在调用存储过程后,返回结果

带输入参数的存储过程:

修改上例子:由于每次考试的难易程度不一样,每次笔试和机试的及格线可能随时变化(不再是60分),这导致考试的评判结果也相应变化

调用上面的存储过程:

 

  1. CREATE PROCEDURE proc_stu   @writtenPass int,  //输入参数:笔试及格线  @labPass int    //输入参数:机试及格线  AS    print '--------------------------------------------------'     print '           参加本次考试没有通过的学员:'    SELECT stuName,stuInfo.stuNo,writtenExam,       labExam  FROM  stuInfo          INNER JOIN stuMarks ON               //查询没有通过考试的学员             stuInfo.stuNo=stuMarks.stuNo                 WHERE writtenExam<@writtenPass                        OR labExam<@labPass GO  



 

EXEC proc_stu 60,55  

--或这样调用:

EXEC proc_stu @labPass=55,@writtenPass=60

扩展:设置输入的默认值:

--或这样调用:

EXEC proc_stu

 @labPass=55,

@writtenPass=60

CREATE PROCEDURE proc_stu 

  @writtenPass int=60,  

  @labPass int=60    

  AS

。。。。。。

调用带参数默认值的存储过程

EXEC proc_stu   --都采用默认值 

EXEC proc_stu 64  --机试采用默认值 

EXEC proc_stu 60,55   --都不采用默认值 

--错误的调用方式:希望笔试采用默认值,机试及格线55

EXEC proc_stu  ,55 

--正确的调用方式:

EXEC proc_stu @labPass=55

如果希望调用存储过程后,返回一个或多个值,这时就需要使用输出(OUTPUT)参数了

 

[html] view plaincopy
  1. CREATE PROCEDURE proc_stu   @notpassSum int OUTPUT, //输出(返回)参数:表示没有通过的人数  @writtenPass int=60,     @labPass int=60    AS    ……     SELECT stuName,stuInfo.stuNo,writtenExam,        labExam FROM  stuInfo   INNER JOIN stuMarks          ON stuInfo.stuNo=stuMarks.stuNo            WHERE writtenExam<@writtenPass              OR labExam<@labPass     SELECT @notpassSum=COUNT(stuNo)    //统计并返回没有通过考试的学员人数       FROM stuMarks  WHERE writtenExam<@writtenPass            OR labExam<@labPass GO  



 

调用带输出参数的存储过程

更多信息请查看 java进阶网 http://www.javady.com

  1. /*---调用存储过程----*/DECLARE @sum int   EXEC proc_stu @sum OUTPUT ,64  //调用时必须带OUTPUT关键字 ,返回结果将存放在变量@sum中     print '--------------------------------------------------'IF @sum>=3     //后续语句引用返回结果  print '未通过人数:'+convert(varchar(5),@sum)+ '人,         超过60%,及格分数线还应下调'ELSE  print '未通过人数:'+convert(varchar(5),@sum)+ '人,        已控制在60%以下,及格分数线适中'GO   
分享到:
评论

相关推荐

    JAVA程序员 从笨鸟到菜鸟.pdf

    曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...

    无需编写任何代码即可创建应用程序:Deepseek-R1 和 RooCode AI 编码代理.pdf

    deepseek最新资讯、配置方法、使用技巧,持续更新中

    Heric拓扑并网离网仿真模型:PR单环控制,SogIPLL锁相环及LCL滤波器共模电流抑制技术解析,基于Heric拓扑的离网并网仿真模型研究与应用分析:PR单环控制与Sogipll锁相环的共模电流抑

    Heric拓扑并网离网仿真模型:PR单环控制,SogIPLL锁相环及LCL滤波器共模电流抑制技术解析,基于Heric拓扑的离网并网仿真模型研究与应用分析:PR单环控制与Sogipll锁相环的共模电流抑制效能,#Heric拓扑并离网仿真模型(plecs) 逆变器拓扑为:heric拓扑。 仿真说明: 1.离网时支持非单位功率因数负载。 2.并网时支持功率因数调节。 3.具有共模电流抑制能力(共模电压稳定在Udc 2)。 此外,采用PR单环控制,具有sogipll锁相环,lcl滤波器。 注:(V0004) Plecs版本4.7.3及以上 ,Heric拓扑; 离网仿真; 并网仿真; 非单位功率因数负载; 功率因数调节; 共模电流抑制; 共模电压稳定; PR单环控制; sogipll锁相环; lcl滤波器; Plecs版本4.7.3及以上,Heric拓扑:离网并网仿真模型,支持非单位功率因数与共模电流抑制

    培训机构客户管理系统 2024免费JAVA微信小程序毕设

    2024免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    基于SMIC 40nm工艺库的先进芯片技术,SMIC 40nm工艺库技术细节揭秘:引领半导体产业新革命,smic40nm工艺库 ,smic40nm; 工艺库; 芯片制造; 纳米技术,SMIC 40nm

    基于SMIC 40nm工艺库的先进芯片技术,SMIC 40nm工艺库技术细节揭秘:引领半导体产业新革命,smic40nm工艺库 ,smic40nm; 工艺库; 芯片制造; 纳米技术,SMIC 40nm工艺库:领先技术驱动的集成电路设计基础

    2013年上半年软件设计师上午题-真题及答案解析

    2013年上半年软件设计师上午题-真题及答案解析

    淮南市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    ROS下的移动机器人路径规划算法:基于强化学习算法DQN、DDPG、SAC及TD3的实践与应用,ROS系统中基于强化学习算法的移动机器人路径规划策略研究:应用DQN、DDPG、SAC及TD3算法,RO

    ROS下的移动机器人路径规划算法:基于强化学习算法DQN、DDPG、SAC及TD3的实践与应用,ROS系统中基于强化学习算法的移动机器人路径规划策略研究:应用DQN、DDPG、SAC及TD3算法,ROS下的移动机器人路径规划算法,使用的是 强化学习算法 DQN DDPG SAC TD3等 ,ROS; 移动机器人; 路径规划算法; DQN; DDPG; SAC; TD3,ROS强化学习移动机器人路径规划算法研究

    粒子群优化算法精准辨识锂电池二阶RC模型参数:高仿真精度下的SOC估计铺垫,粒子群优化算法精准辨识锂电池二阶RC模型参数:仿真验证与SOC估计铺垫,使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参

    粒子群优化算法精准辨识锂电池二阶RC模型参数:高仿真精度下的SOC估计铺垫,粒子群优化算法精准辨识锂电池二阶RC模型参数:仿真验证与SOC估计铺垫,使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码) 使用粒子群优化算法来辨识锂离子电池二阶RC模型的参数。 将粒子群优化算法寻找到的最优参数代入二阶RC模型进行仿真,经过验证,端电压的估计误差小于0.1%,说明粒子群优化算法辨识得到的参数具有较高的精度,为锂离子电池SOC的估计做铺垫。 ,关键词:粒子群优化算法(PSO); 锂电池二阶RC模型参数辨识; MATLAB代码; 端电压估计误差; 锂离子电池SOC估计。,PSO算法优化锂电池二阶RC模型参数:高精度仿真与MATLAB代码实现

    selenium环境搭建-谷歌浏览器驱动

    selenium环境搭建-谷歌浏览器驱动

    35页-华为智慧社区商业解决方案.pdf

    在当今科技日新月异的时代,智慧社区的概念正悄然改变着我们的生活方式。它不仅仅是一个居住的空间,更是一个集成了先进科技、便捷服务与人文关怀的综合性生态系统。以下是对智慧社区整体解决方案的精炼融合,旨在展现其知识性、趣味性与吸引力。 一、智慧社区的科技魅力 智慧社区以智能化设备为核心,通过综合运用物联网、大数据、云计算等技术,实现了社区管理的智能化与高效化。门禁系统采用面部识别技术,让居民无需手动操作即可轻松进出;停车管理智能化,不仅提高了停车效率,还大大减少了找车位的烦恼。同时,安防报警系统能够实时监测家中安全状况,一旦有异常情况,立即联动物业进行处理。此外,智能家居系统更是将便捷性发挥到了极致,通过手机APP即可远程控制家中的灯光、窗帘、空调等设备,让居民随时随地享受舒适生活。 视频监控与可视对讲系统的结合,不仅提升了社区的安全系数,还让居民能够实时查看家中情况,与访客进行视频通话,大大增强了居住的安心感。而电子巡更、公共广播等系统的运用,则进一步保障了社区的治安稳定与信息传递的及时性。这些智能化设备的集成运用,不仅提高了社区的管理效率,更让居民感受到了科技带来的便捷与舒适。 二、智慧社区的增值服务与人文关怀 智慧社区不仅仅关注科技的运用,更注重为居民提供多元化的增值服务与人文关怀。社区内设有互动LED像素灯、顶层花园控制喷泉等创意设施,不仅美化了社区环境,还增强了居民的归属感与幸福感。同时,社区还提供了智能家居的可选追加项,如空气净化器、远程监控摄像机等,让居民能够根据自己的需求进行个性化选择。 智慧社区还充分利用大数据技术,对居民的行为数据进行收集与分析,为居民提供精准化的营销服务。无论是周边的商业信息推送,还是个性化的生活建议,都能让居民感受到社区的智慧与贴心。此外,社区还注重培养居民的环保意识与节能意识,通过智能照明、智能温控等系统的运用,鼓励居民节约资源、保护环境。 三、智慧社区的未来发展与无限可能 智慧社区的未来发展充满了无限可能。随着技术的不断进步与创新,智慧社区将朝着更加智能化、融合化的方向发展。比如,利用人工智能技术进行社区管理与服务,将能够进一步提升社区的智能化水平;而5G、物联网等新技术的运用,则将让智慧社区的连接更加紧密、服务更加高效。 同时,智慧社区还将更加注重居民的体验与需求,通过不断优化智能化设备的功能与服务,让居民享受到更加便捷、舒适的生活。未来,智慧社区将成为人们追求高品质生活的重要选择之一,它不仅是一个居住的空间,更是一个融合了科技、服务、人文关怀的综合性生态系统,让人们的生活更加美好、更加精彩。 综上所述,智慧社区整体解决方案以其科技魅力、增值服务与人文关怀以及未来发展潜力,正吸引着越来越多的关注与认可。它不仅能够提升社区的管理效率与居民的生活品质,更能够为社区的可持续发展注入新的活力与动力。

    PowerSettingsExplorer.rar

    PowerSettingsExplorer.rar 电脑的电源管理软件,明白的不多说。自己搜索即可知道。

    2025年开源人工智能:关键参与者与预测.pdf

    deepseek最新资讯,配置方法,使用技巧,持续更新中

    DeepSeek 发布 Janus Pro AI 图像生成器 – 开源且免费.pdf

    deepseek最新资讯、配置方法、使用技巧,持续更新中

    消息中间件rabbitmq-server

    RabbitMQ 是一个开源的消息代理(Message Broker),实现了 AMQP(Advanced Message Queuing Protocol) 协议,用于在分布式系统中实现高效、可靠的消息传递。

    西门子S7-1200与汇川PLC新通信选择:Ethernet IP通信的突破与优势,功能安全及精准同步的创新实践 ,西门子S7-1200与汇川PLC通信新选择:Ethernet IP通信方案亮相,替代

    西门子S7-1200与汇川PLC新通信选择:Ethernet IP通信的突破与优势,功能安全及精准同步的创新实践。,西门子S7-1200与汇川PLC通信新选择:Ethernet IP通信方案亮相,替代Modbus TCP实现更高级功能与安全控制。,西门子PLC和汇川PLC新通信选择-西门子S7-1200 1500系列PLC也开始支持Ethernet IP通信了。 这为西门子系列的PLC和包括汇川AM400 600等Codesys系PLC的通信提供了新的解决方案。 当前两者之间的通信大多采用ModBus TCP通信。 Modbus TCP和EtherNet IP的区别主要是应用层不相同,ModbusTCP的应用层采用Modbus协议,而EtherNetIP采用CIP协议,这两种工业以太网的数据链路层采用的是CSMACCD,因此是标准的以太网,另外,这两种工业以太网的网络层和传输层采用TCPIP协议族。 还有一个区别是,Modbus协议中迄今没有协议来完成功能安全、高精度同步和运功控制等,而EtherNet IP有CIPSatety、ClIP Sync和ClPMotion来

    自适应无迹卡尔曼滤波AUKF算法:系统估计效果展示与特性分析(含MATLAB代码与Excel数据),自适应无迹卡尔曼滤波AUKF算法:系统估计效果展示与特性分析(含MATLAB代码与Excel数据)

    自适应无迹卡尔曼滤波AUKF算法:系统估计效果展示与特性分析(含MATLAB代码与Excel数据),自适应无迹卡尔曼滤波AUKF算法:系统估计效果展示与特性分析(含MATLAB代码与Excel数据),自适应无迹卡尔曼滤波AUKF算法 配套文件包含MATLAB代码+excel数据+学习资料 估计效果与系统特性有关,图片展示为一复杂系统估计效果 ,AUKF算法; MATLAB代码; excel数据; 学习资料; 估计效果; 系统特性。,自适应无迹卡尔曼滤波AUKF算法:MATLAB代码与学习资料

    基于MATLAB Simscape的IGBT开关特性模型:揭示开关损耗、米勒平台及瞬态行为的分析工具,IGBT开关特性模型与MATLAB Simscape模拟:深入理解开关行为及损耗数据,IGBT开关

    基于MATLAB Simscape的IGBT开关特性模型:揭示开关损耗、米勒平台及瞬态行为的分析工具,IGBT开关特性模型与MATLAB Simscape模拟:深入理解开关行为及损耗数据,IGBT开关特性模型,MATLAB Simscape模型。 该模型展示了IGBT的详细的开关模型,用于创建开关损耗列表数据。 有助于理解IGBT米勒平台、瞬态开关行为。 也可以用于MOOSFET。 ,IGBT开关模型; MATLAB Simscape; 开关损耗; 米勒平台; 瞬态开关行为; MOOSFET。,MATLAB Simscape中IGBT精细开关模型:揭示米勒平台与瞬态行为

Global site tag (gtag.js) - Google Analytics