使用AES/CBC/PKCS7Padding方式加解密
一、儲存過程和函式
儲存過程和函式是在資料庫中定義一些SQL語句的集合,然後直接呼叫這些儲存過程和函式來執行已經定義好的SQL語句。
儲存過程和函式可以避免開發人員重複的編寫相同的SQL語句。而且,儲存過程和函式是在MySQL伺服器中儲存和執行的,可以減少客戶端和伺服器端的資料傳輸。
1.儲存過程
(1)基本語法:
CREATE PROCEDURE proc_name ( [proc_parameter] ) [characteristics ...] routine_body
CREATE PROCEDURE:用來建立儲存函式的關鍵字;proc_name:為儲存過程的名稱;預設在當前資料庫中建立。
避免與MySQL的內建函式的名字一樣。
proc_parameter:指定儲存過程的引數列表;列表的形式如下:
[IN | OUT | INOUT ] param_name type
1)IN:輸入引數;
2)OUT:輸出引數;
3)INOUT:即可以輸入也可以輸出;
4)param_name:表示引數名稱;
5)type:表示引數的型別,可以是MySQL資料庫中的任意型別。
Characteristic:儲存過程的某些特徵設定,分別介紹:
1)COMMENT'string': 用於對儲存過程的描述,其中string為描述內容,comment為關鍵字。
2)LANGUAGE SQL: 指明編寫這個儲存過程的語言為SQL語言。這個選項可以不指定。
- No sql:表示不包含sql語句
- Reads sql data :表示儲存過程只包含讀資料的語句
- Modifies sql data :表示儲存過程只包含寫資料的語句
5)sql security:這個特徵用來指定儲存過程使用建立該儲存過程的使用者(definer)的許可來執行,還是使用呼叫者(invoker)的許可來執行。預設是definer.
Routine_body:儲存過程的主體部分,包含了在過程呼叫的時候必須執行的sql語句。以BEGIN開始,以END結束。
如果儲存過程體中只有一條sql語句,可以省略begin-end標誌。
1.2 資料準備
mysql>CREATE TABLE t_user -> ( -> USER_ID INT NOT NULL AUTO_INCREMENT, -> USER_NAME CHAR(30) NOT NULL, -> USER_PASSWORD CHAR(10) NOT NULL, -> USER_EMAIL CHAR(30) NOT NULL, -> PRIMARY KEY (USER_ID), -> INDEX IDX_NAME (USER_NAME) -> ) -> ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入資料:
INSERT INTO t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL) VALUES (1,'林炳文','1234567@','[email protected]'), (2,'123','123','fff'), (3,'1214gbdb','123456','[email protected]'), (4,'fsjdjhihi','1234567','[email protected]'), (5,'fajkjiiuhi','123456','[email protected]'), (6,'hiouoewh','12345678','[email protected]'), (7,'fdasfdsaf','1234567','[email protected]'), (8,'林林之間','123456','[email protected]'), (9,'林炳文Evan...','123456','ling2008@com'), (10,'ff23e林','123456@','[email protected]');
1. 3 IN、OUT、INOUT引數
帶IN的儲存過程
mysql> CREATE PROCEDURE SP_SEARCH(IN p_name CHAR(20)) -> BEGIN -> IF p_name is null or p_name='' THEN -> SELECT * FROM t_user; -> ELSE -> SELECT * FROM t_user WHERE USER_NAME LIKE p_name; -> END IF; -> END -> //
因為;會衝突,因此將//設定為結束執行符號。
mysql> delimiter //
PS:可以使用“DELIMITER;” 恢復預設結束符;DELIMITER也可定義其他符號作為結束符,但避免使用反斜槓“\”,因為“\”是SQL中的轉義字元。
呼叫:
//呼叫並輸出結果 CALL SP_SEARCH('林炳文')
帶OUT的儲存過程
mysql> CREATE PROCEDURE SP_SEARCH2(IN p_name CHAR(20),OUT p_int INT) -> BEGIN -> IF p_name is null or p_name='' THEN -> SELECT * FROM t_user; -> ELSE -> SELECT * FROM t_user WHERE USER_NAME LIKE p_name; -> END IF; -> SELECT FOUND_ROWS() INTO p_int; -> END//
呼叫輸出:統計帶林開頭的人數;
mysql> CALL SP_SEARCH2('林%',@p_num); -> SELECT @p_num;
帶INOUT的儲存過程
mysql> CREATE PROCEDURE sp_inout(INOUT p_num INT) -> BEGIN -> SET p_num=p_num*10; -> END//
//呼叫並輸出結果
mysql> SET @p_num=2; -> call sp_inout(@p_num); -> SELECT @p_num; -> //
2、 儲存過程體
儲存過程體中可以使用各種sql語句和過程式語句的組合,來封裝資料庫應用中複雜的業務邏輯和處理規則,以實現資料庫應用的靈活程式設計。
下面主要介紹幾個用於構造儲存過程體的常用語法元素。
2.1 區域性變數
在儲存過程體中可以宣告區域性變數,用來儲存儲存過程體中臨時結果。
DECLARE var_name[,…] type [DEFAULT value] Var_name:指定區域性變數的名稱 Type:用於宣告區域性變數的資料型別 default子句:用於為區域性變數指定一個預設值。若沒有指定,預設為null.
如:
Declare cid int(10);
使用說明:
區域性變數只能在儲存過程體的begin…end語句塊中宣告。
區域性變數必須在儲存過程體的開頭處宣告。
區域性變數的作用範圍僅限於宣告它的begin..end語句塊,其他語句塊中的語句不可以使用它。
區域性變數不同於使用者變數,兩者區別:區域性變數宣告時,在其前面沒有使用@符號,並且它只能在begin..end語句塊中使用;
而使用者變數在宣告時,會在其名稱前面使用@符號,同時已宣告的使用者變數存在於整個會話之中。
2.2 set語句
使用set語句為區域性變數賦值
Set var_name=expr
Set cid=910;
2.3 select... into 語句
把選定列的值直接儲存到區域性變數中,語法格式
Select col_name[,…] into var_name[,…] table_expr Col_name:用於指定列名 Var_name:用於指定要賦值的變數名 Table_expr:表示select語句中的from字句及後面的語法部分
說明:儲存過程體中的select…into語句返回的結果集只能有一行資料。
2.4 定義處理程式
是事先定義程式執行過程中可能遇到的問題。並且可以在處理程式中定義解決這些問題的辦法。這種方式可以提前預測可能出現的問題,並提出解決方法。
DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement handler_type:CONTINUE | EXIT | UNDO Condition_value:Sqlwarning | not found | sqlexception
3. 儲存過程和函式的區別
儲存過程,儲存過程實現的功能比較複製,功能強大,可以執行包括修改表等一系列資料庫操作。
儲存函式,實現的功能針對性比較強。
返回值上的不同
儲存過程:可以返回多個值,也可以不返回值,只是實現某種效果或動作。
儲存函式:必須有返回值,而且只能有一個返回值。
引數不同
儲存過程:儲存過程的引數型別有三種,in,out,inout。
儲存函式:引數型別只有一種,類似於in引數,呼叫函式時需要按照引數的型別指定值即可。
語法結構
儲存過程,儲存過程宣告時不需要指定返回型別。
儲存函式,函式宣告時需要指定返回型別,且在函式體中必須包含一個有效的return語句。
呼叫方式
儲存過程,用call
語句進行呼叫
儲存函式,嵌入在sql
中使用的,可以在select
中呼叫
4. 事務
事務必須滿足的四個條件:
- atomicity原子性
- consistency一致性
- lsolation隔離性
- durability永續性
控制事務處理
rollback
,回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改
commit
,會提交事務,並使已對資料庫進行的所有修改稱為永久性的
savepoint identifier
,允許在事務中建立一個儲存點,一個事務中可以有多個savepoint
rollback to identifier
,把事務回滾到標記點
事務處理主要有兩種方法
用begin, rollback, commit
來實現
begin,start transaction
開始一個事務rollback
事務回滾commit
事務確認
直接用set來改變mysql的自動提交模式
set autocommit = 0
禁止自動提交set autocommit = 1
開始自動提交
4.1 innodb使用事務
從Mysql5.5版本開始,InnoDB是預設的表儲存引擎。
innodb
是事務型資料庫的首選引擎,支援事務安全表。
MySql中 delimiter
預設下,delimiter是分號,在命令列客戶端中,如果有一行命令以分號結束,那麼回車後,mysql將會執行該命令。
(告訴mysql直譯器,該段命令是否已經結束了,mysql是否可以執行了。)
什麼是儲存引擎:資料庫儲存引擎是資料庫底層軟體元件。資料庫管理系統使用資料引擎進行建立,查詢,更新和刪除資料的操作。
mysql
的核心就是儲存引擎。
innodb
儲存引擎
- 它為
mysql
提供了具有提交,回滾和崩潰恢復能力的事務安全儲存引擎。 - 對於處理巨大資料量的資料擁有很好的效能
innodb
儲存引擎支援外來鍵完整性約束innodb
被用在眾多需要高效能的大型資料庫站點上
設定儲存引擎:
- 設定伺服器的儲存引擎
- 在配置檔案my.ini中的mysqld下面設定需要的儲存引擎
default-storage-engine=InnoDB
- 重啟mysql伺服器
建立表(單個)設定儲存引擎 create table mytest( id int primary key, name varchar(10) ) engine = innodb default charset = utf8;
altertabletablenameengine=engineName
5. 管理與維護
管理使用者
USE mysql; select user from user;
許可權表:儲存賬號的許可權資訊表:user,db,host,tables_priv,columns_priv
和procs_priv 。
各個許可權表的作用
tables_priv
表用來對錶設定操作許可權;columns_priv
表用來對錶的某一列設定許可權;procs_priv
表可以對儲存過程和儲存函式設定操作許可權。
使用CREATE USER語句建立新使用者
語法格式:
CREATE USER “user”@“host” [IDENTIFIED BY “password”];
使用DROP USER 語句刪除使用者
語法格式:
DROP USER user[, user]; 例:使用DROP USER刪除賬戶"rose"@"localhost": DROP USER "rose"@"localhost";
示例:
檢視日誌檔案的路徑 show variables like 'log_error'; 建立新的日誌資訊表 flush logs; 建立新的日誌資訊表 mysqladmin -uroot -p flush-logs