曾經有過一個兩層構架的時代,前臺就是介面,後臺就是儲存過程,儲存過程把業務邏輯和資料操作一手包辦了。
用儲存過程寫東西比較複雜,大部分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);
}
}
}