日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate调用存储过程

發布時間:2025/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate调用存储过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hibernate調用存儲過程

Hibernate調用存儲過程方法一:
?List<?> list = new ArrayList<HibernateProcedureObject>();
try {
session = getCurrentSession(entityClass);
SQLQuery query = session.createSQLQuery(procedure);
query.setString(0, requestId);
list = query.list();
} catch (HibernateException e) {
e.printStackTrace();
logger.log(RMTManagementLevel.ERROR, e);
} finally {
this.closeConnection();
}
return list;

SQLQuery query=this.getSession().createSQLQuery("{call procName(?,?,?)}");
query.setString(0,x);
query.setString(1,xxx);
query.setString(2,xxxx);
List list = query.list();
Hibernate調用存儲過程方法二:
?Session session =HibernateSessionFactory.getSession();?
Connection conn = session.connection();?
ResultSet rs =null;?
CallableStatement call = conn.prepareCall("{Call proc()}");?
rs = call.executeQuery();?
rs.close();?
session.close();?


===================================================


hibernate調用mysql存儲過程

  在mysql中創建兩個存儲過程,如下:
?
1、根據id查找某條數據:
?
1 CREATE PROCEDURE `findEmpById`(IN id INTEGER(11))
2 begin
3????? select * from emp where empId=id;
4 end;

2、根據id查找某個字段,并返回
?
1 CREATE PROCEDURE `getNameById`(in id integer(11),out eName varchar(50))
2 begin
3????? select empName into eName from emp where empId=id;
4 end;
  在存儲過程的參數列表里面,in修飾的參數代表輸入參數,out修飾的代表輸出參數。
?
使用hibernate調用上面兩個存儲過程:
?
  (1)調用第一個存儲過程
?


?1 package com.test;
?2
?3 import java.sql.CallableStatement;
?4 import java.sql.Connection;
?5 import java.sql.ResultSet;
?6 import java.sql.SQLException;
?7
?8 import org.hibernate.Session;
?9 import org.hibernate.SessionFactory;
10 import org.hibernate.cfg.Configuration;
11
12
13 public class 調用存儲過程 {
14
15???? /**
16????? * @param args
17????? * @throws SQLException
18????? */
19???? public static void main(String[] args) throws SQLException {
20???????? Configuration cfg = new Configuration().configure();
21???????? SessionFactory factory = cfg.buildSessionFactory();
22???????? Session session = factory.openSession();
23???????? Connection con = session.connection();
24???????? String sql = "{call findEmpById(?)}";
25???????? CallableStatement cs = con.prepareCall(sql);
26???????? cs.setObject(1, 2);
27???????? ResultSet rs = cs.executeQuery();
28???????? while(rs.next()){
29???????????? int id = rs.getInt("empId");
30???????????? String name = rs.getString("empName");
31???????????? System.out.println(id+"\t"+name);
32???????? }
33???? }
34
35 }


??  調用存儲過程的sql語句為:call 存儲過程名(參數...),不過在java中調用存儲過程一般都加{}。調用存儲過程使用的是CallableStatement。
?
  (2)調用第二個存儲過程
?


?1 package com.test;
?2
?3 import java.sql.CallableStatement;
?4 import java.sql.Connection;
?5 import java.sql.SQLException;
?6
?7 import org.hibernate.Session;
?8 import org.hibernate.SessionFactory;
?9 import org.hibernate.cfg.Configuration;
10
11 public class 調用存儲過程1 {
12
13????
14???? public static void main(String[] args) throws SQLException {
15???????? Configuration config = new Configuration().configure();
16???????? SessionFactory sessionFactory = config.buildSessionFactory();
17???????? Session session = sessionFactory.openSession();
18???????? Connection conn = session.connection();
19???????? String sql = "{call getNameById(?,?)}";
20???????? CallableStatement cs = conn.prepareCall(sql);?
21???????? cs.setObject(1, 3); //設置輸出參數
22???????? cs.registerOutParameter(2, java.sql.Types.VARCHAR); //設置第二個參數為輸出參數
23???????? cs.execute(); //調用存儲過程
24???????? String name = cs.getString(2);//獲取輸出參數
25???????? System.out.println(name);
26???? }
27
28 }
============================================================

如何通過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();

總結

以上是生活随笔為你收集整理的Hibernate调用存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。