java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用
觸發器和存儲過程是為了提高SQL的運行效率。
SQL語句先編譯、后執行,而觸發器與存儲過程都會提前預編譯完成,且只編譯一次,供反復調用。
隨著時代的進步,硬件與帶寬的提升,觸發器和存儲過程提升效率并不明顯,所以在傳統或并發量低的項目中已經很少用到了。
1.觸發器
簡單的作用示意:用于增刪改的時候,表關聯的連貫操作(具體根據需求的表設計定義)。以前會有人說可以用來做日志統計,現實開發中,其實很少有人用庫表做日志。
創建:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW exesql
注釋:
trigger_name 觸發器名稱
trigger_time? 觸發時間,值:BEFORE、AFTER
trigger_event 觸發事件,值:INSERT、DELETE、UPDATE
tb_name 表名稱,觸發器建立在哪個表的基礎上
exesql 觸發器條件滿足時,執行的sql或函數
列子:
DELIMITER $$drop trigger if existsms.trigger_test;create trigger ms.trigger_test after insert
on ms.master foreach rowbegin
INSERT INTO slave (s_id, s_content) VALUES(new.m_id,new.m_content);end$$
注:
DELIMITER $$ 定義結束符$$,意味SQL語句以$$結束,mysql默認;分號結束。
new表示記錄更新后的值,更新前的值用old
該腳本不可以在視圖工具Navicat或dbvisual里執行。
必須如圖執行
2.存儲過程
簡單描述:存儲過程是一個特定的SQL語句集,在數據庫中只需編譯一次,重復使用。一般項目不建議使用存儲過程,維護麻煩。
優點:重復使用、減少網絡流量、防止SQL注入(關鍵)
缺點:應用層程序員調試麻煩、可移植性低、可擴展性差
CREATE PROCEDURE PROCEDURE_NAME (PROCEDURE_MODE PARAM_NAME PARAM_TYPE) EXE_SQL
注釋:
PROCEDURE_NAME 存儲過程名字
PROCEDURE_MODE 存儲過程類型,有IN、OUT、INOUT
PARAM_NAME 參數引用名稱
PARAM_TYPE ?參數類型(int、varchar、datetime等等)
EXE_SQL ? 執行sql語句
IN例子:
DELIMITER $$DROP PROCEDURE IF EXISTSms.in_procedure;CREATE PROCEDURE ms.in_procedure(IN param int)BEGIN
SELECTparam;SET param=3;SELECTparam;END$$SET @param=1;
CALL ms.in_procedure(@param);SELECT @param;
$$
注:
DELIMITER $$ 定義結束符$$,意味SQL語句以$$結束,mysql默認;分號結束。
該腳本不可以在視圖工具Navicat或dbvisual里執行。
必須如圖執行
OUT例子:
DELIMITER $$DROP PROCEDURE IF EXISTSms.out_procedure;CREATE PROCEDURE ms.out_procedure(OUT param int)BEGIN
SELECTparam;SET param=3;SELECTparam;END$$SET @param=1;
CALL ms.out_procedure(@param);SELECT @param;
$$
注:
DELIMITER $$ 定義結束符$$,意味SQL語句以$$結束,mysql默認;分號結束。
該腳本不可以在視圖工具Navicat或dbvisual里執行。
必須如圖執行
INOUT例子
DELIMITER $$DROP PROCEDURE IF EXISTSms.inout_procedure;CREATE PROCEDURE ms.inout_procedure(INOUT param int)BEGIN
SELECTparam;SET param=3;SELECTparam;END$$SET @param=1;
CALL ms.inout_procedure(@param);SELECT @param;
$$
注:
DELIMITER $$ 定義結束符$$,意味SQL語句以$$結束,mysql默認;分號結束。
該腳本不可以在視圖工具Navicat或dbvisual里執行。
必須如圖執行
3.java調用存儲過程
packagecom.nginx.session.test;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.SQLException;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.jdbc.core.CallableStatementCallback;importorg.springframework.jdbc.core.CallableStatementCreator;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTestpublic classJDBCTest {
@AutowiredprivateJdbcTemplate jdbcTemplate;
@Testpublic voidtest(){
Integer value= jdbcTemplate.execute(newCallableStatementCreator() {
@Overridepublic CallableStatement createCallableStatement(Connection con) throwsSQLException {
String storedProc= "{call ms.inout_procedure (?)}";
CallableStatement cs=con.prepareCall(storedProc);
cs.setInt(1,1);returncs;
}
},new CallableStatementCallback() {
@Overridepublic Integer doInCallableStatement(CallableStatement cs) throwsSQLException {
cs.execute();return cs.getInt(1);
}
});
System.out.println(value);
}
}
總結
以上是生活随笔為你收集整理的java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 24点游戏java_24点游戏动态规划解
- 下一篇: mysql k,mysql事务有关概念-