MySQL中存儲過程/觸發器/事務

  1. 存儲過程

存儲過程是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。

優點:
1允許模塊化程序設計(創建一次多次使用)
2允許更快執行
3減少網絡流量
4更好的安全機制

創建存儲過程格式:

DELIMITER //
CREATE PROCEDURE 儲存名([ IN ,OUT ,INOUT ]?參數名?數據類形...)
BEGIN
SQL語句
END //
DELIMITER ;

 

調用過程:

用call 過程名( )


查看所有的存儲過程show procedure status;
查看創建的存儲過程show create procedure 過程名;
刪除過程 drop procedure 過程名

 

In 表示參數從外部傳入到裏面使用(過程內部使用)
Out 表示參數從過程裏邊把數據保存到變量中,交給外部使用,所有傳入的必須是變量 如果說傳入的out變量本身在外部有數據,那麼在進入過程之後,第一件事就是被清空,設爲null
Inout 數據可以從外部傳入到過程內部使用,同時內部操作之後,又會將數據返回給外部

-------------------------------創建存儲過程---------------------------
DELIMITER //
CREATE PROCEDURE addUser
(IN uCode VARCHAR(50),IN uName VARCHAR(20),IN uRole INT,IN sex INT,IN tel VARCHAR(30))
BEGIN
INSERT INTO smbms_user (userCode,userName,userRole,gender,phone)
VALUES(uCode,uName,uRole,sex,tel);
END//
DELIMITER //

查看存儲過程 show procedure status;

<insert id="saveUser">
CALL addUser(#{userCode},#{userName},#{userRole},#{gender},#{phone})
</insert>

public int saveUser(
@Param("userCode") String userCode,
@Param("userName") String userName,
@Param("userRole") Integer userRole,
@Param("gender") Integer gender,
@Param("phone") String phone);

public List<User> findUserListPage(String queryUserName,
Integer queryUserRole,
Integer currentPageNo, Integer pageSzie);


public boolean saveUser(String userCode, String userName, Integer userRole,
Integer gender, String phone) {
SqlSession sqlSession = null;
int row = 0; // 受影響的行數
try {
sqlSession = MyBatisUtil.createSqlSession();
row = sqlSession.getMapper(UserMapper.class).saveUser(userCode, userName, userRole, gender, phone);
// 提交事務
sqlSession.commit();
} catch (Exception e) {
if (sqlSession != null) {
sqlSession.rollback();
}
row = 0;
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
if (row > 0) {
return true;
}
return false;
}


userService.saveUser("maoge", "毛哥", 1, 2, "123456");

2.觸發器

觸發器是一種特殊類型的存儲過程,它又不同於存儲過程,
觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。

觸發器是一種與表操作有關的數據庫對象,當創建了觸發器所在的表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。感覺類似於對錶註冊的各種回調(6種)函數。


作用:
1.可在寫入數據表前,強制檢驗或轉換數據
2.觸發器發生錯誤時,異動的結果會被撤銷

格式
DELIMITER //
Create trigger 觸發器名字 觸發時機 觸發事件 on 表 for each
row
Begin
操作的內容
End //
DELIMITER ;

觸發對象 :on 表 for each row 觸發器綁定實質是表中的所有行,因此當每一行發生改變的時候,就會觸發觸發器
觸發時機:每張表中對應的行都會有不同的狀態,當SQL 指令發生的時候,
都會令行中的數據發生改變,每一行總會有兩個狀態。操作數據之前(before),操作數據(after)之後
觸發事件:
Mysql中觸發器針對的目標是數據發生改變,對應的操作只有(增,刪,改)查詢不發生數據的改變,
所以查詢沒有觸發事件
注意事項:
一張表中,每一個觸發器綁定的觸發事件對應的觸發器類型只能有一個;
一張表中只能有一個after insert 觸發器 因此,一張表中最多的觸發器只能有六個

 

創建觸發器

在MySQL中,創建觸發器語法如下:

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:

trigger_name:標識觸發器名稱,用戶自行指定;
trigger_time:標識觸發時機,取值爲 BEFORE 或 AFTER;
trigger_event:標識觸發事件,取值爲 INSERT、UPDATE 或 DELETE;
tbl_name:標識建立觸發器的表名,即在哪張表上建立觸發器;
trigger_stmt:觸發器程序體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句。

由此可見,可以建立6種觸發器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

另外有一個限制是不能同時在一個表上建立2個相同類型的觸發器,因此在一個表上最多建立6個觸發器。

 

創建兩張表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
inv int
)

create table my_orders(
id int primary key auto_increment,
goods_id int not null,
goods_num int not null)


insert into my_goods values(null,'手機',1000),(null,'電腦',500),(null,'遊戲機',100);


DELIMITER //
CREATE TRIGGER a_i_o_t AFTER INSERT ON my_orders FOR EACH ROW
BEGIN
UPDATE my_goods SET inv =inv -new.goods_num WHERE id=new.goods_id;
END
//
DELIMITER ;


DELIMITER //
CREATE TRIGGER b_i_o_t BEFORE INSERT ON my_orders FOR EACH ROW
BEGIN
SELECT inv FROM my_goods WHERE id=new.goods_id INTO @inv;
IF @inv <new.goods_num THEN
INSERT INTO xxx VALUES('xx');
END IF;
END
//
DELIMITER //

 


測試 insert into my_orders values(null,3,5);

3.事務

事務(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin
 transaction和end transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。

事務是保存在項目裏的由用戶顯示設定,存儲過程是保存在數據庫裏的由用戶直接調用;

事務的編程語言(java,C++等),存儲過程中只有SQL語言。

事務的四大特徵(ACID)

  • 原子性(A):事務是最小單位,不可再分,整個事務的所有操作要麼全部執行完成,要麼失敗回滾;
  • 一致性(C):數據庫總是從一個一致性狀態轉爲另一個一致性狀態;
  • 隔離性(I):事務A和事務B之間具有隔離性,一個事務對數據庫所做的修改在最終提交成功之前對其它事務是不可見的;
  • 持久性(D):是事務的保證,事務終結的標誌(內存的數據持久到硬盤文件中),一旦事務提交,其對數據庫所做修改將永遠保持在數據庫之中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章