當前位置:首頁 » 存儲配置 » hibernate存儲過程返回值

hibernate存儲過程返回值

發布時間: 2023-04-15 13:59:43

㈠ 最近幾天一直在搞Mybatis調用存儲過程的問題,用<select>標簽寫的那種!然後用java里寫調用函數

ibatis:sql需要自己寫
hibernate:sql自動生成
上面是最大的區別,下面是一些細節.
選擇Hibernate還是iBATIS都有它的道理:
Hibernate的特點:
Hibernate功能強大,資料庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。以資料庫欄位亂春塌一一對應映射得到的PO和Hibernte這種對象化映射得到的PO是截然不同的,本質區別在於這種PO是扁平化的,不像Hibernate映射的PO是可以表達立體的對象繼承,聚合等等關系的,這將會直接影響到你的整個軟體系統的設計思路。Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到資料庫表的映射關系,即可通過Hibernate 提供的方法完成持久層操作。程序員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 介面加以執行。Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行,但是Hibernate現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於iBATIS。
iBATIS的特點:
iBATIS入門簡單,即學即用,提供了資料庫查詢的自動對象綁定嘩圓功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。當系統屬於二次開發,無法對資料庫結構做到控制和修改,那iBATIS的靈活性將比Hibernate更適合。系統數據處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下iBATIS會有更好的可控性和表現。
對於實際的開發進行的比較:
1. iBATIS需要手寫sql語句,也可以生成一森弊部分,Hibernate則基本上可以自動生成,偶爾會寫一些Hql。同樣的需求,iBATIS的工作量比 Hibernate要大很多。類似的,如果涉及到資料庫欄位的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。
2. iBatis 可以進行細粒度的優化
比如說我有一個表,這個表有幾個或者幾十個欄位,我需要更新其中的一個欄位,iBatis 很簡單,執行一個sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用 Hibernate 的話就比較麻煩了,預設的情況下 hibernate 會更新所有欄位。 當然我記得 hibernate 有一個選項可以控制只保存修改過的欄位,但是我不太確定這個功能的負面效果。
例如:我需要列出一個表的部分內容,用 iBatis 的時候,這裡面的好處是可以少從資料庫讀很多數據,節省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情況下Hibernate 會把所有的欄位都選出來。比如說有一個上面表有8個欄位,其中有一兩個比較大的欄位,varchar(255)/text。上面的場景中我為什麼要把他們也選出來呢?用hibernate 的話,你又不能把這兩個不需要的欄位設置為lazy load,因為還有很多地方需要一次把整個 domain object 載入出來。這個時候就能顯現出ibatis 的好處了。如果我需要更新一條記錄(一個對象),如果使用 hibernate,需要現把對象 select 出來,然後再做 update。這對資料庫來說就是兩條sql。而iBatis只需要一條update的sql就可以了。減少一次與資料庫的交互,對於性能的提升是非常重要。
3. 開發方面:
開發效率上,我覺得兩者應該差不多。可維護性方面,我覺得 iBatis 更好一些。因為 iBatis 的 sql 都保存到單獨的文件中。而 Hibernate 在有些情況下可能會在 java 代碼中保sql/hql。相對Hibernate「O/R」而言,iBATIS 是一種「Sql Mapping」的ORM實現。 而iBATIS 的著力點,則在於POJO 與SQL之間的映射關系。也就是說,iBATIS並不會為程序員在運行期自動生成SQL 執行。具體的SQL 需要程序員編寫,然後通過映射配置文件,將SQL所需的參數,以及返回的結果欄位映射到指定POJO。使用iBATIS 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate會自動生成SQL 語句,而iBATIS 則要求開發者編寫具體的SQL 語句。相對Hibernate而言,iBATIS 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。
4. 運行效率
在不考慮 cache 的情況下,iBatis 應該會比hibernate 快一些或者很多。
上面是hibernate和ibatis的區別。
現在說一說對於手寫sql和存儲過程的支持:
這些東西其實我們都不需要擔心,這種框架能被大家接受就說明像這種功能那是必須的,一定要支持,否肯定被人扣板磚!
hibernate對手寫sql和存儲過程都有很好的支持,對於手寫sql有的時候還是有必要的,如對於非常復雜的sql語句,可能對於我們用hql語句是很難完成的,這個時候就需要我們用sql來完成,相對於hql,我們還是比較熟練sql的!存儲過程的支持也是必要的,和只需簡單的一句:CallableStatement cstmt = con.prepareCall(procere); 就能對已有存儲過程的調用。
ibatis這我就不多少了,一樣,都有很好的支持。
存在就有其合理性,對於不同的情況,我們會有不同的解決方案,所以不要輕易的說那個那個功能不好,沒准他就是你解決難題的殺手鐧!

㈡ hibernate 存儲過程問題 Caused by: java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: PLS-00905:

我想你java里定義的應該是float或者double類型吧?float是精確到小數點後6位,double是15位..所以你的222.00應該保存的比這個要更精確,而你的oracle里,只精確了兩位所以....就是這個錯誤了,其實如果要求不嚴的話,直接定義成number就行了,那麼接到的值是什麼精度什麼類型的他就自動存了.

㈢ hibernate獲取存儲過程返回值

當然是他內部做的。 適合所有資料庫。 追問: 大俠。可否講明白點。舉個例子? 小的愚笨。還望指點 回答: hibernate提供了在*.hbm.xml中配置調用存儲過程,並通過向用戶提供session.getNamedQuery("…")方法來調用配置的調用查詢相關的存儲過程的方法,另外,hibernate還提供了卜悄取得sql的connection的方法,從而能夠通過connection中存儲過程調用相關的方燃滾法來實皮弊余現存儲過程的調用。 注意這兩種存儲過程的調用方式是不同的,在Hiberante是方便了查詢,它可以在*.hbm.xml中配置存儲過程返回值的信息,然後通過配置,就可以把返回值封裝成對象的集合。而使用持久化的存儲過程,那就還是要直接使用到JDBC調用存儲過程的API即使用到 CallableStatement對象。 追問: 目前我存儲過程中的返回值是 1,結果集 2,int 3,String你的意思。我在hbm.xml中配置完返回值後。不需要在java代碼中。像jdbc那樣。指明返回值嗎? 也就是說。我只要在代碼中query.setXXX(0,XXX);這個。指明。輸入參數就可以了》?out參數。直接用 List list = query.list();就能得到所有的返回值嗎? 回答: 不出意外的話就應該出來了。 呵呵你測試一下。

㈣ hibernate 怎麼調用 帶返回參數的存儲過程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public String callFirstProceres(final long qyid, final int pdys) {
String procereSql = "{call get_qyaqdcpdjb(?,?,?)}";
Object pj = jdbcTemplate.execute(procereSql,
new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException {
cs.setLong(1, qyid);
cs.setInt(2, pdys);
//你需要注冊啟知一個輸出悄悔消參前拍數
cs.registerOutParameter(3, Types.VARCHAR);
cs.execute();
return cs.getString(3);
}
});
return HtmsUtils.formatObject(pj);
}

㈤ hibernate新增方法返回值

不野卜報錯,就是true,報錯就是孫段false
insert、update,成功就是1,否則是則脊譽0

㈥ hibernate調用存儲過程

hibernate3.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();

㈦ hibernate的增刪改的返回值是什麼

hibernate主要通過session對象進行增刪改查,


增刪改的如下三個方法:

session.update(obj)
session.save(obj)
session.delete(obj)

返回值都是void,如果發生增刪改的失敗,會拋出HibernateException,根據Hibernate框架設計,用戶應該用try...catch...處理,必要時進行事務的回滾(rollback)。

查詢的情況分多種,如:

session.load(class,obj)的處理與增刪改類似

而Queryquery=session.createQuery(HQLhql),如果是查詢語句錯誤,仍拋出HibernateException;

而如果資料庫沒有值,則然後用query.list()返回空列表;

如果有一些配置錯誤(如映射配置文件有錯),則query.list()會返回null,

所以仍應用try...catch統一處理保險一些。

㈧ java 接收存儲過程的return返回值


Connectionconn;
/*省略連接過程*/
CallableStatementstmt=con.prepareCall("{?=callp_函數1('type',1991,?)}");

stmt.registerOutParameter(1,Types.INTEGER);
stmt.registerOutParameter(2,Types.DECIMAL);

ResultSetrs=stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
}

System.out.println(stmt.getInt(1));
System.out.println(stmt.getDouble(2));

/*注意SQL語句的序號是從1個開始。*/
注冊返回參數
第一晌基余個問號就是整個執行結果的返回值。

第二個問號宴滾對應的是output參數的返回結果。

我自己設置的結果是返回值是int類型,output的參數的decimal(15,2),
然後取出鋒羨來是按照int和double來取出。

㈨ hibernate中調用存儲過程,如果返回了多個結果集,怎麼處理

過程如下:
public Boolean doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Transaction tr = session.beginTransaction();
SQLQuery query = session.createSQLQuery("{call CommandAdapter(?,?,?,?)}");
query.setString(0,"ls");
query.setInteger(1, machineid);
query.setString(2, param);
query.setInteger(3, 0); //
query.executeUpdate();
tr.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{

session.close();

}
}

使用hibernate調用帶參數返回值的存儲過程方法

在調用帶參數返回值的方法時,需使用到CallableStatement對象。因此,首先得設法獲取一個Connection。

獲取Connection 方法:

(1)session.connection();//此方法目前已被棄用

(2)SessionFactoryUtils.getDataSource(sessionFactory).getConnection()


過我在使用SessionFactoryUtils.getDataSource(sessionFactory)時,一直獲取的都是空值,為此參考
SessionFactoryUtils的源代碼直接利用ConnectionProvider對象來獲取一個Connection實例。

完整代碼:

SessionFactory sessionFactory=this.getSessionFactory();
if (sessionFactory instanceof SessionFactoryImplementor){
ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory).getConnectionProvider();
try {

CallableStatement statement = cp.getConnection().prepareCall(
"{call MachineDataQuery(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
statement.setInt(1, machineId);
statement.setInt(2, jobId);
statement.setInt(3, partTypeId);
statement.setInt(4, compentId);
statement.setInt(5, opId);
statement.setInt(6, roleId);
statement.setInt(7, userId);
statement.setString(8, sd);
statement.setString(9, ed);
statement.registerOutParameter(10, Types.FLOAT);
statement.registerOutParameter(11, Types.FLOAT);
statement.registerOutParameter(12, Types.FLOAT);
statement.registerOutParameter(13, Types.FLOAT);
statement.registerOutParameter(14, Types.FLOAT);
statement.execute();
System.out.println(statement.getFloat(10));
System.out.println(statement.getFloat(11));
System.out.println(statement.getFloat(12));
System.out.println(statement.getFloat(13));
System.out.println(statement.getFloat(14));
} catch (SQLException e) {
e.printStackTrace();
}finally{
cp.close();
}
}

ps:切記存儲過程中不可有多餘的print或select語句,否則會拋出異常「com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用於更新的結果集。」

㈩ Hibernate 調用存儲過程 該語句沒有返回結果集

修改存儲過程試試:
alter procere test()
as
SET NOCOUNT ON --加上這句話;有的出現這個問題,加上之後問題解決了;嘿嘿

熱點內容
java的job 發布:2025-02-12 23:38:43 瀏覽:892
我的世界伺服器授權指令 發布:2025-02-12 23:30:13 瀏覽:596
電腦伺服器號在哪裡找 發布:2025-02-12 23:22:29 瀏覽:12
linux查看系統是32位 發布:2025-02-12 23:17:29 瀏覽:989
從資料庫中隨機取資料庫數據 發布:2025-02-12 23:17:25 瀏覽:878
ftp下載軟體安卓 發布:2025-02-12 23:07:24 瀏覽:567
c搜索演算法 發布:2025-02-12 23:05:47 瀏覽:862
返回伺服器地址 發布:2025-02-12 23:05:45 瀏覽:181
我的世界推薦在線伺服器 發布:2025-02-12 23:00:18 瀏覽:462
什麼是解壓目錄 發布:2025-02-12 22:49:24 瀏覽:981