1.例子1:一個簡單的存儲過程的java調用:有參數無傳回值!
<1>.存儲過程的寫法:
/*寫一個簡單的存儲過程--如插入t_user表中的資料*/
DELIMITER //
CREATE PROCEDURE insert_test(
IN username VARCHAR(50),
IN address VARCHAR(50)
)
BEGIN
INSERT INTO t_user(username,address) VALUES(username,address);
END //
DELIMITER ;
/*調用該存儲過程*/
CALL insert_test('ok','chenc');
<2>.java調用存儲過程:
package com.hanchao.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* java調用存儲過程的測試
* @author hanlw
* 2012-07-09
*/
public class TestProcedure {
public static void main(String[] args) throws Exception {
/**
* 為什麼要使用存儲過程?
* 1.效率高;
*
* 2.在日程開發的過程中,當我們的SQL語句很複雜時,我們要考慮寫
* 一個存儲過程,以達到優化資料庫的過程!!
*
* 3.資料庫優化的幾個方法:
* ①不要連接配接不需要的表;
* ②不要用like等通配符,即使用也要放在最後。
* ③存儲過程的java調用!!
*/
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root");
//與以前不一樣的地方
CallableStatement cs = con.prepareCall("{call insert_test(?,?)}");
cs.setString(1, "tom");
cs.setString(2, "America");
int rows = cs.executeUpdate();
if(rows > 0) {
System.out.println("thank you !");
} else {
System.out.println("good bye !");
}
cs.close();
con.close();
}
}
2.無參數,隻有傳回結果集。(相當于全查詢)
/*全查詢*/
CREATE PROCEDURE find_test()
SELECT id,username,address FROM t_user;
CALL find_test();
import java.sql.ResultSet;
* java調用存儲過程
public class TestProcedure2 {
//注意:CallableStatement是java.sql.CallableStatement
CallableStatement cs = con.prepareCall("{call find_test}");
ResultSet rs = cs.executeQuery();
while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String address = rs.getString("address");
System.out.println(id+"\t"+username+"\t"+address);
rs.close();
* 注意:發現沒有,這和我們的JDBC的寫法幾乎沒有差別。
* 隻是把PreparedStatement換成了CallableStatement!!!
3.有傳回值參數的存儲過程;(獲得剛剛插入資料的ID号)
/*帶傳回值參數的存儲過程*/
CREATE PROCEDURE insert_getId(
IN username VARCHAR(20),
IN address VARCHAR(20),
OUT id INT
SELECT LAST_INSERT_ID() INTO id;
SELECT id;
CALL insert_getId('jack','USA',@id); <b></b>
/*比較一下這個存儲過程與上面的不同之處!以及調用的不同之處!!*/
CREATE PROCEDURE insert_getId12(
#SELECT id; /*體會一下這一句的不同!*/
CALL insert_getId12('jack1','USA1',@id);
SELECT @id;
import java.sql.Types;
public class TestProcedure3 {
//煮一下下面幾行
CallableStatement cs = con.prepareCall("{call insert_getId(?,?,?)}");
cs.setString(1, "hanchao");
cs.setString(2, "Canada");
cs.registerOutParameter(3, Types.INTEGER); //注意這一句的不同之處!!
cs.executeUpdate(); //執行
int id = cs.getInt(3);//注意:
System.out.println("剛剛插入的ID為:"+id);
怎麼樣,童鞋們知道如何使用java調用存儲過程了嗎??這隻是最簡單的,最基本的。往後的日子,我們一起繼續學習!O(∩_∩)O~
本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/926333,如需轉載請自行聯系原作者