`
Supanccy2013
  • 浏览: 223807 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate 调用返回值的存储过程

阅读更多
注:原创作品,转载请注明出处。

     曾一度认为oracle的函数和存储过程的区别,就是function能返回值,存储过程不能返回值。但在项目中的很多存储过程都有返回值,仔细发现得出问题的窍门。
  
     存储过程的返回值是通过参数实现的,存储过程的参数有三种类型一种是 in,一种是 out
一种是既有in也有out类型。  out的参数就是返回数值的参数。

     下面是实例
     本实例需要环境:
     1,hibernate3.0
     2,oracle 10g
     3,创建一个TBL_ADDRESS,字段有id,name,info,remark且有一条记录

java代码:
package com.supan.test;
import com.supan.dao.imp.UserDaoImp;

public class hibernate1
{
	public static void main(String[] args)
	{
		UserDaoImp udi = new UserDaoImp();
		udi.getUserNameAndInfo();
	}
}


package com.supan.dao.imp;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.supan.dao.UserDao;
public class UserDaoImp extends HibernateDaoSupport implements UserDao
{
	public void getUserNameAndInfo()
	{
		//没有spring的注入,只有人工苦逼的注册sessionFactory属性
		Configuration cof = new Configuration().configure();
		this.setSessionFactory(cof.buildSessionFactory());
		
		//定义存放结果的结果map
		final Map<String,String> result = new HashMap<String, String>();
		getHibernateTemplate().execute(new HibernateCallback<Object>()
		{
			@Override
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException
			{
				session.doWork(new Work()
				{
					@Override
					public void execute(Connection conn) throws SQLException
					{
						CallableStatement proc = null;
						try
						{
							proc = conn.prepareCall("{call PROC_GETUSER_NAME_AGE(?,?,?)}");
							
							//注意:这里是注册输出参数
							proc.registerOutParameter(1, java.sql.Types.VARCHAR);
							proc.registerOutParameter(2, java.sql.Types.VARCHAR);
							//注意:这里是传递输入参数
							proc.setLong(3, 1L);
							
							//执行存储过程
							proc.execute();
							
							//获取执行完的存储过程的返回值
							result.put("name", proc.getString(1));
							result.put("age", proc.getString(2));
						}
						catch(Exception e)
						{
							//logger.error("访问数据库失败");
							e.printStackTrace();
							result.put("name", null);
							result.put("age", null);
						}
						finally
						{
							if(null != proc)
							{
								proc.close();
							}
						}
					}
				});
				
				return null;
			}
		});
		
		System.out.println(result.get("name"));
		System.out.println(result.get("age"));
	}
}


下面是oracle的存储过程
/*创建存储过程,该存储过程三个参数,前两个是输出参数
最后一个是输入参数*/
create or replace procedure PROC_GETUSER_NAME_AGE(userName out varchar2,
                                                  userAge  out varchar2,
                                                  userId   in long) 
AS
  --声明该存储过程为“自治事物单元”
  PRAGMA AUTONOMOUS_TRANSACTION;
  
  --定义两个变量
  v_userName varchar2(255);
  v_userAge  varchar2(255);

begin
  select name, info into v_userName, v_userAge from TBL_ADDRESS t where t.id = userId;
  userName := v_userName;
  userAge  := v_userAge;
  
  --注意最后并没有return语句返回,返回靠的是输出参数
end;


分享到:
评论

相关推荐

    hibernate query调用oracle存储过程

    在Hibernate中,调用存储过程通常通过Session对象的createNativeQuery()方法实现,这个方法用于创建原生SQL查询,可以方便地调用数据库的自定义SQL或者存储过程。以下是一个简单的示例,展示了如何调用一个不带参数...

    使用hibernate调用oracle的存储过程

    在hibernate中调用oracle中的存储过程的详细代码。可以借鉴使用,帮助学习。

    hibernate调用存储过程

    下面将详细解释Hibernate调用存储过程的相关知识点。 1. **存储过程的概念** 存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以接受参数、返回结果并执行特定的数据库操作。它们提高了数据库性能,减少...

    hibernate调用存储过程的方法调用

    本文将深入探讨如何使用Hibernate调用存储过程,并结合提供的资源文件——`proc.sql`、`hibernateProc.sql`和`hibernateProc.java`,来阐述具体的操作步骤和注意事项。 首先,我们理解存储过程的意义。存储过程可以...

    hibernate框架调用存储过程

    总结来说,Hibernate调用存储过程是通过`StoredProcedureQuery`对象实现的,提供了更简便的对象化API。对比JDBC,Hibernate更注重开发者体验,而JDBC则更适合对数据库操作有深度控制的需求。在实际开发中,根据项目...

    1、hibernate调用存储过程1

    本文将详细介绍如何使用Hibernate调用存储过程,包括不带参数返回值的存储过程和带参数返回值的存储过程。 1、调用不带参数返回值的存储过程 在提供的代码示例中,`doInHibernate` 方法展示了如何使用Hibernate...

    Hibernate3调用存储过程用法

    在Java的持久化框架Hibernate中,调用数据库的存储过程是一项常见的需求。本文将深入探讨在Hibernate3中如何实现这一功能,以及相关的知识点。 一、为什么要使用存储过程 存储过程是预编译的SQL语句集合,它们在...

    spring hibernate执行存储过程的例子

    结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...

    hibernate调用存储过程.docx

    总之,Hibernate不仅支持简单的ORM操作,还提供了调用存储过程和定义命名SQL查询的能力,使得开发者可以灵活地处理各种数据库交互需求,提高代码的灵活性和可维护性。在实际开发中,理解并熟练掌握这些特性,将有助...

    java-hibernate调用mysql过程和函数的方式知识.pdf

    Java-Hibernate 调用 MySQL 过程和函数的方式知识 Java-Hibernate 框架中调用 MySQL 数据库中的过程和函数是通过 CallableStatement 对象来实现的。下面将详细介绍如何调用 MySQL 中的过程和函数。 调用函数 在 ...

    hibernate 调用oracle函数

    总的来说,Hibernate调用Oracle函数涉及到了数据库设计、ORM框架的使用、原生SQL查询和结果映射等多个方面,熟练掌握这些技能对于开发高质量的企业级应用至关重要。希望这篇文章能帮助你更好地理解和应用这些知识。

    hibernate存储过程

    - 使用Hibernate调用存储过程可以保持代码的统一性,但也可能导致封装性降低,因为存储过程的逻辑不再完全在Java代码中。 - 在处理大量数据或性能敏感的场景下,使用存储过程可能带来性能提升。 综上所述,...

    java-hibernate调用mysql过程和函数的方式.pdf

    以下是Java-Hibernate调用MySQL过程和函数的详细步骤: 1. **调用函数** - 函数调用通常涉及到返回值和可能的输入参数。例如,调用名为`get_pname`的函数,该函数可能接受三个参数。使用`CallableStatement`创建一...

    java-hibernate调用mysql过程和函数的方式[归类].pdf

    下面将详细介绍如何在Java中利用Hibernate调用MySQL的存储过程和函数。 首先,我们需要理解CallableStatement接口,它是PreparedStatement的子接口,用于执行SQL存储过程。在Java中,我们通常使用CallableStatement...

    Hibernate --调用存储过程(全).docx

    - 如果存储过程没有返回值,只需要调用`execute`方法,无需使用`list`方法。 - 当传递参数时,注意参数的位置(通常是从1开始),并且确保参数类型与存储过程定义的参数类型匹配。 总的来说,Hibernate提供了多种...

    hibernate调存储过程的方法.txt

    ### Hibernate调用存储过程的方法 在Java开发中,Hibernate是一个非常强大的对象关系映射(ORM)框架,它简化了数据库操作,并提供了丰富的API来处理各种数据访问需求。其中一个常见的应用场景是通过Hibernate调用...

    存储过程- 06.在应用程序中调用存储过程

    - **ORM框架**:Object-Relational Mapping(ORM)框架如Hibernate和Entity Framework也支持调用存储过程,开发者可以在ORM的映射配置中指定存储过程,然后在代码中像调用普通方法一样调用它。 3. **参数传递** -...

    NHibernate调用存储过程全集,值.

    如果存储过程有多个输出参数或返回值,可以使用`NHibernateUtil`类的`GetType`方法指定输出参数的类型,并在调用后通过`GetResult`或`GetScalar`方法获取结果。 总结,调用存储过程在NHibernate中是一个实用的功能...

    存储过程学习经典[语法+实例+调用]

    Hibernate调用Oracle存储过程 Hibernate框架支持直接调用存储过程,通过配置映射文件或注解实现。 ##### 2. Java直接调用Oracle存储过程 使用Java JDBC API可以直接调用Oracle存储过程,通过`CallableStatement`...

Global site tag (gtag.js) - Google Analytics