javahibernate调用存储过程
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
存储过程,没有返回结果集的