日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用

發布時間:2024/1/23 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。