天天看點

Java調用存儲過程------

 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,如需轉載請自行聯系原作者