Hibernate调用存储过程
Hibernate調(diào)用存儲過程
Hibernate調(diào)用存儲過程方法一:
?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調(diào)用存儲過程方法二:
?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調(diào)用mysql存儲過程
在mysql中創(chuàng)建兩個存儲過程,如下:
?
1、根據(jù)id查找某條數(shù)據(jù):
?
1 CREATE PROCEDURE `findEmpById`(IN id INTEGER(11))
2 begin
3????? select * from emp where empId=id;
4 end;
2、根據(jù)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;
在存儲過程的參數(shù)列表里面,in修飾的參數(shù)代表輸入?yún)?shù),out修飾的代表輸出參數(shù)。
?
使用hibernate調(diào)用上面兩個存儲過程:
?
(1)調(diào)用第一個存儲過程
?
?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 調(diào)用存儲過程 {
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 }
?? 調(diào)用存儲過程的sql語句為:call 存儲過程名(參數(shù)...),不過在java中調(diào)用存儲過程一般都加{}。調(diào)用存儲過程使用的是CallableStatement。
?
(2)調(diào)用第二個存儲過程
?
?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 調(diào)用存儲過程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); //設(shè)置輸出參數(shù)
22???????? cs.registerOutParameter(2, java.sql.Types.VARCHAR); //設(shè)置第二個參數(shù)為輸出參數(shù)
23???????? cs.execute(); //調(diào)用存儲過程
24???????? String name = cs.getString(2);//獲取輸出參數(shù)
25???????? System.out.println(name);
26???? }
27
28 }
============================================================
如何通過hibernate去調(diào)用存儲過程?
說實話還真看不出來hibernate調(diào)用存儲過程有什么優(yōu)勢
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傳統(tǒng)的xml映射方式去調(diào)用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>調(diào)用方法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來實現(xiàn)個人比較喜歡這種方法
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, 參數(shù));??? rs = call.executeQuery();? CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 參數(shù)); rs = call.executeQuery();Java代碼? SQLQuery query = session.createSQLQuery("{Call proc(?)}");?
? query.setString(0, 參數(shù));??? List list =query.list();
總結(jié)
以上是生活随笔為你收集整理的Hibernate调用存储过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: w3cschool教程之jQuery U
- 下一篇: 在网页中插入百度地图