java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用
觸發(fā)器和存儲(chǔ)過(guò)程是為了提高SQL的運(yùn)行效率。
SQL語(yǔ)句先編譯、后執(zhí)行,而觸發(fā)器與存儲(chǔ)過(guò)程都會(huì)提前預(yù)編譯完成,且只編譯一次,供反復(fù)調(diào)用。
隨著時(shí)代的進(jìn)步,硬件與帶寬的提升,觸發(fā)器和存儲(chǔ)過(guò)程提升效率并不明顯,所以在傳統(tǒng)或并發(fā)量低的項(xiàng)目中已經(jīng)很少用到了。
1.觸發(fā)器
簡(jiǎn)單的作用示意:用于增刪改的時(shí)候,表關(guān)聯(lián)的連貫操作(具體根據(jù)需求的表設(shè)計(jì)定義)。以前會(huì)有人說(shuō)可以用來(lái)做日志統(tǒng)計(jì),現(xiàn)實(shí)開(kāi)發(fā)中,其實(shí)很少有人用庫(kù)表做日志。
創(chuàng)建:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW exesql
注釋:
trigger_name 觸發(fā)器名稱
trigger_time? 觸發(fā)時(shí)間,值:BEFORE、AFTER
trigger_event 觸發(fā)事件,值:INSERT、DELETE、UPDATE
tb_name 表名稱,觸發(fā)器建立在哪個(gè)表的基礎(chǔ)上
exesql 觸發(fā)器條件滿足時(shí),執(zhí)行的sql或函數(shù)
列子:
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 $$ 定義結(jié)束符$$,意味SQL語(yǔ)句以$$結(jié)束,mysql默認(rèn);分號(hào)結(jié)束。
new表示記錄更新后的值,更新前的值用old
該腳本不可以在視圖工具Navicat或dbvisual里執(zhí)行。
必須如圖執(zhí)行
2.存儲(chǔ)過(guò)程
簡(jiǎn)單描述:存儲(chǔ)過(guò)程是一個(gè)特定的SQL語(yǔ)句集,在數(shù)據(jù)庫(kù)中只需編譯一次,重復(fù)使用。一般項(xiàng)目不建議使用存儲(chǔ)過(guò)程,維護(hù)麻煩。
優(yōu)點(diǎn):重復(fù)使用、減少網(wǎng)絡(luò)流量、防止SQL注入(關(guān)鍵)
缺點(diǎn):應(yīng)用層程序員調(diào)試麻煩、可移植性低、可擴(kuò)展性差
CREATE PROCEDURE PROCEDURE_NAME (PROCEDURE_MODE PARAM_NAME PARAM_TYPE) EXE_SQL
注釋:
PROCEDURE_NAME 存儲(chǔ)過(guò)程名字
PROCEDURE_MODE 存儲(chǔ)過(guò)程類型,有IN、OUT、INOUT
PARAM_NAME 參數(shù)引用名稱
PARAM_TYPE ?參數(shù)類型(int、varchar、datetime等等)
EXE_SQL ? 執(zhí)行sql語(yǔ)句
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 $$ 定義結(jié)束符$$,意味SQL語(yǔ)句以$$結(jié)束,mysql默認(rèn);分號(hào)結(jié)束。
該腳本不可以在視圖工具Navicat或dbvisual里執(zhí)行。
必須如圖執(zhí)行
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 $$ 定義結(jié)束符$$,意味SQL語(yǔ)句以$$結(jié)束,mysql默認(rèn);分號(hào)結(jié)束。
該腳本不可以在視圖工具Navicat或dbvisual里執(zhí)行。
必須如圖執(zhí)行
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 $$ 定義結(jié)束符$$,意味SQL語(yǔ)句以$$結(jié)束,mysql默認(rèn);分號(hào)結(jié)束。
該腳本不可以在視圖工具Navicat或dbvisual里執(zhí)行。
必須如圖執(zhí)行
3.java調(diào)用存儲(chǔ)過(guò)程
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);
}
}
總結(jié)
以上是生活随笔為你收集整理的java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 24点游戏java_24点游戏动态规划解
- 下一篇: mysql k,mysql事务有关概念-