如何通過hibernate呼叫儲存過程
用hibernate操作資料庫,可以通過獲取的session值,呼叫connection()方法獲取connection,從而呼叫儲存過程。
java呼叫儲存過程
什麼是hibernate?
hibernate是資料訪問層的框架,對jdbc進行了封裝,使用hibernate可以直接訪問物件,hibernate自動將此訪問轉換為sql執行,從而達到間接訪問資料庫的目的,簡化了資料訪問層的程式碼開發。
hibernate和mybatis對比:
共性:採用ORM思想解決了實體和資料庫對映的問題,對jdbc進行了封裝,遮蔽了jdbc api底層訪問細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作。
Hibernate是全自動化ORM的對映工具
mybatis是一個持久層框架,是apache下的開源專案,前身是itbatis,是一個不完全的ORM框架,mybatis提供輸入和輸出的對映,需要程式設計師自己寫sql語句,mybatis重點對
sql語句的靈活操作。
適合用於:需求變化頻繁, 資料模型不固定的專案,例如:網際網路專案。
如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置物件快取,不使用集合快取
5.一對多集合使用Bag,多對多集合使用Set
6.繼承類使用顯式多型
7.表字段要少,表關聯不要怕多,有二級快取撐腰
1.什麼是儲存過程?
儲存過程是指儲存在資料庫並在資料庫端執行的程式。儲存過程是為嵌入式SQL所設計
2.如何呼叫儲存過程?
try{ int age = 39; String poetName = “dylan thomas”; CallableStatement proc = connection.prepareCall(“{ call set_death_age(?, ?) }”); proc.setString(1, poetName); proc.setInt(2, age); cs.execute(); }catch (SQLException e){ // ….}
傳給prepareCall方法的字串是儲存過程呼叫的書寫規範。它指定了儲存過程的名稱,?代表了你需要指定的引數。
3.儲存過程可以有返回值
所以CallableStatement類有類似getResultSet這樣的方法來獲取返回值。當儲存過程返回一個值時,你必須使用registerOutParameter方法告訴JDBC驅動器該值的SQL型別是什麼。你也必須調整儲存過程呼叫來指示該過程返回一個值。
connection.setAutoCommit(false); CallableStatement proc = connection.prepareCall(“{ ? = call snuffed_it_when(?) }”); proc.registerOutParameter(1, Types.INTEGER); proc.setString(2, poetName); cs.execute(); int age = proc.getInt(2);
4.複雜的返回值
static void sendEarlyDeaths(PrintWriter out){ Connection con = null; CallableStatement toesUp = null; try { con = ConnectionPool.getConnection(); // PostgreSQL needs a transaction to do this… con. setAutoCommit(false); // Setup the call. CallableStatement toesUp = connection.prepareCall(“{ ? = call list_early_deaths () }”); toesUp.registerOutParameter(1, Types.OTHER); toesUp.execute(); ResultSet rs = (ResultSet) toesUp.getObject(1); while (rs.next()) { String name = rs.getString(1); int age = rs.getInt(2); out.println(name + ” was ” + age + ” years old.”); } rs.close(); } catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close(); } }
因為JDBC並不直接支援從儲存過程中返回遊標,我們使用Types.OTHER來指示儲存過程的返回型別,然後呼叫getObject()方法並對返回值進行強制型別轉換。