JDBC 呼叫儲存過程程式碼示例

劍握在手發表於2013-12-06

曾經有過一個兩層構架的時代,前臺就是介面,後臺就是儲存過程,儲存過程把業務邏輯和資料操作一手包辦了。

用儲存過程寫東西比較複雜,大部分Java程式設計師或許都對此不太瞭解,因為我們如今的三層架構使用高階語言來充當中間的業務邏輯層。但是這種東西關鍵時候還是很有用的,下面是一個簡單例子:

 

DELIMITER $$  #分隔符重新定義

DROP PROCEDURE IF EXISTS `world`.`addUser`$$ /* 如果儲存過程存在就將其刪掉 */
CREATE PROCEDURE `world`.`addUser` (in pname varchar(45), in birthday date,in money float,out pid int)
BEGIN
    insert into user(name,birthday,money)values(pname,birthday,money);
    #last_insert_id()是MySql自帶的系統方法,可以將當前執行緒最後一次插入的資料的id拿出來
    select last_insert_id() into pid;

END $$

DELIMITER ;

 

下面的程式碼呼叫該儲存過程

 

 

public class PsTest {

    /**
     * @param args
     * @throws SQLException
     */
    public static void main(String[] args) throws SQLException {
        ps();
    }

    static void ps() throws SQLException {
        Connection conn = null;
        CallableStatement cs = null;//儲存過程需要使用的statement繼承自PreparedStatement
        ResultSet rs = null;
        try {
            // 2.建立連線
            conn = JdbcUtils.getConnection();
            // conn = JdbcUtilsSing.getInstance().getConnection();
            // 3.建立語句

            String sql = "{ call addUser(?,?,?,?) } ";//呼叫名為addUser的儲存過程
            cs = conn.prepareCall(sql);
            cs.registerOutParameter(4, Types.INTEGER);//註冊輸出引數的位置和型別
            cs.setString(1, "ps name");
            cs.setDate(2, new java.sql.Date(System.currentTimeMillis()));
            cs.setFloat(3, 100f);

            cs.executeUpdate();

            int id = cs.getInt(4);

            System.out.println("id=" + id);
        } finally {
            JdbcUtils.free(rs, cs, conn);
        }
    }

}

相關文章