當前位置:首頁 » 存儲配置 » javahibernate調用存儲過程

javahibernate調用存儲過程

發布時間: 2022-05-28 05:03:36

A. hibernate調用存儲過程

hibernate
3.0以上提供了兩種方式執行
存儲過程

第一種
:用JDBC
方式
Session
session
=HibernateSessionFactory.getSession();
//獲取hibernate會話
Connection
conn
=
session.
connection
();
//

session對象
獲取連接
ResultSet
rs
=null;
try
{
CallableStatement
call
=
conn.prepareCall("{Call
pro_getManager(?,?)}");
call.setString(1,
"admin");
call.setString(2,
"admin");
rs
=
call.executeQuery();
}
catch
(
Exception
e)
{
e.printStackTrace();
}finally
{
rs.close();//關閉
session.close();//關閉連接
HibernateSessionFactory.closeSession();
//關閉會話
}
這種方式本人感覺與hibernate結合不很緊密,還難以控制,還要自己控制關閉
第二種:
用hibernate中sqlQuery
介面執行,其實與執行sql沒有兩樣。
Session
session
=HibernateSessionFactory.getSession();
//獲取hibernate會話
String
procName="{Call
pro_getManager(?,?)
}";
SQLQuery
query
=
session.createSQLQuery(proc);
query.setString(0,
"admin");
query.setString(1,
"admin");
List
list
=query.list();
session.close();
HibernateSessionFactory.closeSession();

B. HIBERNATE調用有兩個返回值的oracle存儲過程怎麼做

= call fuctionName(?,?,?) 沒見過有兩個返回值的。。。 Connection conn = session.connection(); �0�2 ResultSet rs =null; �0�2 CallableStatement call = conn.prepareCall("{Call proc(?,?,?)}"); �0�2 call.setString(0,"abc"); call.registerOutParameter(1, Types.VARCHAR); call.registerOutParameter(2,Types.VARCHAR); rs = call.executeQuery(); �0�2 if(rs.next()){ System.out.println("存儲過程得到的第一個返回值是:"+rs.getString(1)); System.out.println("存儲過程得到的第二個返回值是:"+rs.getString(2)); } 2011-03-18 18:09 推薦: 0 次 有幫助? 請推薦java code Session session = HibernateSessionFactory.getSession(); Connection con =null; CallableStatement cstmt =null; ResultSet rs=null; Transaction tr =null; String backValue =""; String backStr; try{ tr = session.beginTransaction(); con = session.connection(); try { cstmt = con.prepareCall(" call ${SHOP88.Sp_aj001_iu(?,?,?,?,?,?,?,?,?,?,?,?,?)}"); cstmt.registerOutParameter(1, Types.NUMERIC); cstmt.registerOutParameter(2, Types.VARCHAR); cstmt.setBigDecimal(3, orderNum); cstmt.setBigDecimal(4, customId); cstmt.setDouble(5, allPrice); cstmt.setDouble(6,ACCTF_SEND_SCHD_AMT); cstmt.setString(7, "CD1"); cstmt.setString(8, "ITV"); cstmt.setDouble(9, CARD_APPR_AMT); cstmt.setDouble(10,ACCM_APPLY_AMT); cstmt.setDouble(11, CRDT_APPLY_AMT); cstmt.setDouble(12, PCARD_APPLY_AMT); cstmt.setString(13, "ITV"); rs = cstmt.executeQuery(); if(rs.next()){ System.out.println("存儲過程得到的第一個返回值是:"+rs.getString(1)); System.out.println("存儲過程得到的第二個返回值是:"+rs.getString(2)); } //backValue = cstmt.getString(1); //backStr = cstmt.getString(2); // System.out.println(cstmt.getString(1)+"===="); // if(backValue.equals(0) ){ // System.out.println("正常"); // return true; // } } catch (SQLException e) { e.printStackTrace(); } }catch(HibernateException e){ } 這個報錯 是什麼情況啊 Exception in thread "main" java.lang.NullPointerException at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:870) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:957) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329) at com.tuge.iptv.order..impl.OrderGoodsDAOImpl.orderStatus(OrderGoodsDAOImpl.java:117) 2011-03-23 09:54 推薦: 0 次 有幫助? 請推薦 自己先把它頂起來 2011-03-23 09:57 推薦: 0 次 有幫助? 請推薦 把存儲過程亮出了 2011-03-23 10:06 推薦: 0 次 有幫助? 請推薦SQL code Sp_aj001_iu ( an_rtn_code OUT NUMBER, --返回代碼,負數說明有錯誤av_rtn_msg OUT VARCHAR2, --返回信息an_ORD_ID IN tb_aj001.ord_id%TYPE, an_CUST_ID IN tb_aj001.cust_id%TYPE, an_TOT_ORD_AMT IN tb_aj001.tot_ord_amt%TYPE, an_acctf_send_schd_amt IN tb_aj001.acctf_send_amt%TYPE, av_SEND_BANK_CD IN tb_aj001.send_bank_cd%TYPE, av_SENDER IN tb_aj001.sender%TYPE, an_CARD_APPR_AMT IN tb_aj001.card_appr_amt%TYPE, an_ACCM_APPLY_AMT IN tb_aj001.accm_apply_amt%TYPE, an_CRDT_APPLY_AMT IN tb_aj001.crdt_apply_amt%TYPE, an_PCARD_APPLY_AMT IN tb_aj001.pcard_apply_amt%TYPE, av_etr_id INVARCHAR2 ) 存儲過程 2011-03-23 10:13 推薦: 0 次 有幫助? 請推薦 第一個和第二個 是返回值 像上面的代碼那樣寫有用嗎 2011-03-23 10:23 推薦: 0 次 有幫助? 請推薦 個人建議不要用hibernate調存儲過程,Hibernate的優勢是O-R映射和DML操作 2011-03-23 10:25 推薦: 0 次 有幫助? 請推薦 項目現在用的是Hibernate 再寫個jdbc來調用? 2011-03-23 10:29 推薦: 0 次 有幫助? 請推薦 你那個錯是空指針,debug會嗎?看哪個對象為空 2011-03-23 21:21 推薦: 0 次 有幫助? 請推薦 是call ${SHOP88.Sp_aj001_iu(?,?,?,?,?,?,?,?,?,?,?,?,?) 寫錯了 多了個$ 2011-04-15 16:02 推薦: 0 次 有幫助? 請推薦

C. 我用的是s2sh框架。hibernate怎樣調用存儲過程

匿名內部類,HibernateCallback中執行存儲過程
語法 {call 存儲過程名(?,?,?)} ?為參數佔位符
示例如下:
public void saveStoredProcere(final String partNum, final String partPopedomXML) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
SQLQuery sqlQuery = session.createSQLQuery("{call P_AddPartPopedom(?, ?)}");
sqlQuery.setString(0, partNum);
sqlQuery.setString(1, partPopedomXML);
sqlQuery.executeUpdate();
return null;
}
});

另外如果要設置返回參數的話,可以使用registerOutParameter方法

有問題再追問,good luck!~

D. hibernate調用存儲過程,connect需要關閉嗎

hibernate調用存儲過程,connect是不需要關閉的。
hibernate在電腦里是休眠的意思。
在使用休眠模式時,可以關閉計算機,並確信在回來時所有工作(包括沒來得及保存或關閉的程序和文檔)都會完全精確地還原到離開時的狀態。內存中的內容會保存在磁碟上,監視器和硬碟會關閉,同時也節省了電能,降低了計算機的損耗。一般來說,使計算機解除休眠狀態所需的時間要比解除等待狀態所需的時間要長,但休眠狀態消耗的電能更少。
如果工作時經常被打斷,如某些秘書職業,往往一邊要進行計算機處理一邊還得接聽電話等等,你就可以考慮將計算機設置為經過指定多少分鍾後進入自動休眠模式。休眠模式會將內存中的所有內容保存到硬碟,關閉監視器和硬碟,然後關閉計算機。
此外,Win7還有一種混合睡眠的模式。
混合睡眠是先把信息寫到硬碟的hiberfil.sys文件中,再進行睡眠。如果沒有終止外部供電,則睡眠,如終止外部供電,則再次開機時讀取hiberfil.sys進行恢復,可以說整合了兩者的優勢:比起睡眠有防掉電的功能,且比起休眠在不終止外部供電的情況下啟動速度更快。這一項可以在高級電源設置中調整。
如果用命令行禁用休眠,開始菜單的睡眠就相當於以前Windows XP的待機,沒有混合睡眠的功能以及設置項目了。

E. java中使用hibernate怎麼調用oracle中帶有out類型參數的存儲過程 如procere proc1(arg1 out number)

給你一段

一:無返回值的存儲過程
存儲過程為:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
  INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);
END TESTA;
然後呢,在java里調用時就用下面的代碼:
package com.hyq.src;

import java.sql.*;
import java.sql.ResultSet;

public class TestProcereOne {
public TestProcereOne() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    CallableStatement cstmt = null;

    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
      proc.setString(1, "100");
      proc.setString(2, "TestOne");
      proc.execute();
    }
    catch (SQLException ex2) {
      ex2.printStackTrace();
    }
    catch (Exception ex2) {
      ex2.printStackTrace();
    }
    finally{
      try {
        if(rs != null){
          rs.close();
          if(stmt!=null){
            stmt.close();
          }
          if(conn!=null){
            conn.close();
          }
        }
      }
      catch (SQLException ex1) {
      }
    }
}
}
當然了,這就先要求要建張表TESTTB,裡面兩個欄位(I_ID,I_NAME)。

二:有返回值的存儲過程(非列表)
存儲過程為:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
  SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
在java里調用時就用下面的代碼:
package com.hyq.src;

public class TestProcereTWO {
public TestProcereTWO() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
      proc.setString(1, "100");
      proc.registerOutParameter(2, Types.VARCHAR);
      proc.execute();
      String testPrint = proc.getString(2);
      System.out.println("=testPrint=is="+testPrint);
    }
    catch (SQLException ex2) {
      ex2.printStackTrace();
    }
    catch (Exception ex2) {
      ex2.printStackTrace();
    }
    finally{
      try {
        if(rs != null){
          rs.close();
          if(stmt!=null){
            stmt.close();
          }
          if(conn!=null){
            conn.close();
          }
        }
      }
      catch (SQLException ex1) {
      }
    }
}
}

}
注意,這里的proc.getString(2)中的數值2並非任意的,而是和存儲過程中的out列對應的,如果out是在第一個位置,那就是proc.getString(1),如果是第三個位置,就是proc.getString(3),當然也可以同時有多個返回值,那就是再多加幾個out參數了。

三:返回列表
由於oracle存儲過程沒有返回值,它的所有返回值都是通過out參數來替代的,列表同樣也不例外,但由於是集合,所以不能用一般的參數,必須要用pagkage了.所以要分兩部分,
1, 建一個程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE  AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2,建立存儲過程,存儲過程為:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游標(可以理解為一個指針),作為一個out 參數來返回值的。
在java里調用時就用下面的代碼:
package com.hyq.src;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;

public class TestProcereTHREE {
public TestProcereTHREE() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;

    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, "hyq", "hyq");

      CallableStatement proc = null;
      proc = conn.prepareCall("{ call hyq.testc(?) }");
      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
      proc.execute();
      rs = (ResultSet)proc.getObject(1);

      while(rs.next())
      {
          System.out.println("<tr><td>

F. 如何通過hibernate去調用存儲過程

說實話還真看不出來hibernate調用存儲過程有什麼優勢
Java代碼 CREATE TABLE `proctab` ( `id` int ( 11 ) NOT NULL auto_increment, `Name` varchar ( 20 ), `age` int ( 11 ), PRIMARY KEY (`id`) ) CREATE TABLE `proctab` ( `id` int ( 11 ) NOT NULL auto_increment, `Name` varchar ( 20 ), `age` int ( 11 ), PRIMARY KEY (`id`) )
簡單的存儲過程
Java代碼 create PROCEDURE proc() begin select * from proctab; end ; create PROCEDURE proc() begin select * from proctab; end ;
一種方法是通過hibernate傳統的xml映射方式去調用
Java代碼 <class name="com.test.User" table="proctab"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name" type="string" /> <property name="age" column="age" type="integer" /> </class> <sql-query name="getUser" callable="true"> <return alias="user" class="com.test.User"> <return-property name="id" column="id" /> <return-property name="name" column="name" /> <return-property name="age" column="age" /> </return> {call proc()} </sql-query> <class name="com.test.User" table="proctab"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name" type="string" /> <property name="age" column="age" type="integer" /> </class> <sql-query name="getUser" callable="true"> <return alias="user" class="com.test.User"> <return-property name="id" column="id" /><return-property name="name" column="name" /> <return-property name="age" column="age" /> </return> {call proc()} </sql-query>
調用方法
Java代碼 Session ss= HibernateSessionFactory.getSession() List li=ss.getNamedQuery("getUser").list(); ss.close(); Session ss= HibernateSessionFactory.getSession() List li=ss.getNamedQuery("getUser").list(); ss.close();
及其類似jdbc的方法
Java代碼 Session session =HibernateSessionFactory.getSession(); Connection conn = session.connection(); ResultSet rs =null; CallableStatement call = conn.prepareCall("{Call proc()}"); rs = call.executeQuery(); rs.close(); session.close(); Session session =HibernateSessionFactory.getSession(); Connection conn = session.connection(); ResultSet rs =null; CallableStatement call = conn.prepareCall("{Call proc()}"); rs = call.executeQuery(); rs.close(); session.close();
這種方法基本上就是jdbc

還有就是通過強大的createSQLQuery來實現
個人比較喜歡這種方法
Java代碼 Session session =HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("{Call proc()}"); List list =query.list(); session.close(); Session session =HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("{Call proc()}"); List list =query.list(); session.close();
如果沒有返回值 直接用execute的方法就可以了
還有一個重要的問題就是存儲過程的傳參問題
Java代碼 CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 參數); rs = call.executeQuery(); CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 參數); rs = call.executeQuery();
Java代碼 SQLQuery query = session.createSQLQuery("{Call proc(?)}"); query.setString(0, 參數); List list =query.list();

G. hibernate如何使用註解調用存儲過程接受return回來的值 例如oracle資料庫中有個存儲過程叫 pro_Test()

hibernate的映射關系記不太清了,但是針對sql而言,其實很容易的,例如你這個pro_Test()返回值是100的話,可以寫個查詢語句調用:
select pro_Test() value from al;
此時的結果:
value
-------
100
相信有了這樣的結果,你的java代碼就好寫了。

H. 關於hibernate調用存儲過程

調用存儲過程可以不寫配置文件,直接在類中搞定! 有問題可以網路Hi 我!~
例子
public void saveStoredProcere(final String adminId, final String menuId, final String toolbars) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
SQLQuery sqlQuery = session.createSQLQuery("{call P_SaveOperatorPopedom(?,?,?)}");
sqlQuery.setString(0, adminId);
sqlQuery.setString(1, menuId);
sqlQuery.setString(2, toolbarsXML);
sqlQuery.executeUpdate();
return null;
}
});
}

重點是這個寫法 session.createSQLQuery("{call P_SaveOperatorPopedom(?,?,?)}");
我這邊用的是spring提供的HibernateDaoSupport

I. java調用存儲過程是jdbc更快還是hibernate更快

論效率的話還是用JDBC快,如果要是考慮到做持久層,就用HIBERNATE

J. hibernate調用存儲過程問題 源碼:public String generateRoleCd(String warehs, String code, String pa

存儲過程,沒有返回結果集的

熱點內容
實測華為編譯器 發布:2024-09-19 23:50:52 瀏覽:821
linux匯總 發布:2024-09-19 23:46:39 瀏覽:452
阿里雲伺服器環境搭建教程 發布:2024-09-19 23:21:58 瀏覽:837
黃色文件夾圖標 發布:2024-09-19 23:19:22 瀏覽:684
mysql資料庫導出導入 發布:2024-09-19 23:00:47 瀏覽:183
lua腳本精靈 發布:2024-09-19 23:00:41 瀏覽:659
任務欄文件夾圖標 發布:2024-09-19 22:54:25 瀏覽:101
解壓來一波 發布:2024-09-19 22:46:36 瀏覽:933
mysqlpythonubuntu 發布:2024-09-19 22:46:27 瀏覽:501
伺服器請求獲取ip地址 發布:2024-09-19 22:33:25 瀏覽:515