1. 程式人生 > >j ava程式設計師從笨鳥到菜鳥之(七)一—java資料庫操作

j ava程式設計師從笨鳥到菜鳥之(七)一—java資料庫操作

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

本文來自:曹勝歡部落格專欄。轉載請註明出處:http://blog.csdn.net/csh624366188

 

一:事務

首先看一下什麼是事務:

 通俗的理解,事務是一組原子操作單元,從資料庫角度說,就是一組

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 @[email protected][email protected]@error

瞭解一下事務的分類:

顯示事務:用BEGIN TRANSACTION明確指定事務的開始,這是最常用的事務型別

隱性事務:通過設定SET IMPLICIT_TRANSACTIONS ON 語句,將隱性事務模式設定為開啟,下一個語句自動啟動一個新事務。當該事務完成時,再下一個 T-SQL 語句又將啟動一個新事務

自動提交事務:這是 SQL Server 的預設模式,它將每條單獨的 T-SQL 語句視為一個事務,如果成功執行,則自動提交;如果錯誤,則自動回滾

使用事務解決經典銀行轉賬事務問題

T-SQL語句:

BEGIN TRANSACTION /*--定義變數,用於累計事務執行過程中的錯誤--*/DECLARE @errorSum INT SET @errorSum=0  --初始化為0,即無錯誤/*--轉賬:張三的賬戶少1000元,李四的賬戶多1000元*/UPDATE bank SET currentMoney=currentMoney-1000   WHERE customerName='張三'SET @[email protected][email protected]@errorUPDATE bank SET currentMoney=currentMoney+1000   WHERE customerName='李四'SET @[email protected][email protected]@error  --累計是否有錯誤IF @errorSum<>0  --如果有錯誤  BEGIN    print '交易失敗,回滾事務'    ROLLBACK TRANSACTION   END  ELSE  BEGIN    print '交易成功,提交事務,寫入硬碟,永久的儲存'    COMMIT TRANSACTION     ENDGOprint '檢視轉賬事務後的餘額'SELECT * FROM bank  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之間的值,

該值指示索引頁填滿的空間所佔的百分比

建立索引示例:

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語句>

示例:建立方便教員檢視成績的檢視

IF EXISTS (SELECT * FROM sysobjects WHERE                         name = 'view_stuInfo_stuMarks')     DROP VIEW view_stuInfo_stuMarksGOCREATE VIEW view_stuInfo_stuMarks  AS    SELECT 姓名=stuName,學號=stuInfo.stuNo,      筆試成績 =writtenExam,  機試成績=labExam,            平均分=(writtenExam+labExam)/2                FROM stuInfo LEFT JOIN stuMarks                      ON stuInfo.stuNo=stuMarks.stuNoGOSELECT * FROM view_stuInfo_stuMarks


四:儲存過程:

首先還是來看一下什麼事儲存過程:

儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

儲存過程(procedure)類似於Java語言中的方法

用來執行管理任務或應用複雜的業務規則

儲存過程可以帶引數,也可以返回結果

儲存過程的有點:

執行速度更快

允許模組化程式設計 

提高系統安全性

減少網路流通量

儲存過程分類:

1.系統儲存過程

由系統定義,存放在master資料庫中,類似Java語言類庫中的方法。

系統儲存過程的名稱都以“sp_”開頭或“xp_”開頭

2.使用者自定義儲存過程

由使用者在自己的資料庫中建立的儲存過程,類似Java語言中使用者自定義的方法

常用的系統儲存過程


定義儲存過程的語法

    CREATE  PROC[EDURE]  儲存過程名 

              @引數1  資料型別 預設值 OUTPUT,

              …… ,

             @引數n  資料型別 預設值 OUTPUT

             AS

            SQL語句

    GO

Java語言的方法一樣,引數可選

引數分為輸入引數、輸出引數 

輸入引數允許有預設值

先給出一個不帶輸入引數的儲存過程的例子:

CREATE PROCEDURE proc_stu   //proc_stu為儲存過程的名稱  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分),這導致考試的評判結果也相應變化

呼叫上面的儲存過程:

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)引數了

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


呼叫帶輸出引數的儲存過程

/*---呼叫儲存過程----*/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 



 本文來自:曹勝歡部落格專欄。轉載請註明出處:http://blog.csdn.net/csh624366188


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述