`

Hibernate中配置公用的存储过程方法

阅读更多

public List<Map<String, Object>> executeProc(final String pkgName, final String procName, final List paraList)
throws Exception {
if (pkgName == null || procName == null || paraList == null)
throw new IllegalArgumentException("有空参数,无法执行!");

final StringBuilder query = new StringBuilder();
Object queryResult;

// 拼装存储过程
query.append("{call ");
query.append(pkgName);
query.append(".");
query.append(procName);
query.append("(?,?,?");
for (int i = 0; i < paraList.size(); i++) {
query.append(",?");
}
query.append(")}");

queryResult = (Object) HibernateUtil.getJdbcTemplate().execute(query.toString(), new CallableStatementCallback() {

public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.registerOutParameter(1, Types.INTEGER);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);

for (int i = 0; i < paraList.size(); i++) {
Object object = paraList.get(i);
if (object == null)
cs.setObject(3 + i + 1, null);
else if (object instanceof Integer)
cs.setInt(3 + i + 1, ((Integer) object).intValue());
else if (object instanceof String)
cs.setString(3 + i + 1, object.toString());
else if (object instanceof Date)
cs.setDate(3 + i + 1, new java.sql.Date(((Date) object).getTime()));
else
cs.setObject(3 + i + 1, object);
}
cs.execute();

int retcode = cs.getInt(1);
if (retcode != 0) {
return cs.getString(2);
}

ResultSet rs = (ResultSet) cs.getObject(3);
ResultSetMetaData metaHeader = rs.getMetaData();
int columnCount = metaHeader.getColumnCount();

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
while (rs.next()) {
HashMap<String, Object> entry = new HashMap<String, Object>();
for (int i = 1; i <= columnCount; i++) {
Object rsc = rs.getObject(i);
if (rsc instanceof TIMESTAMP) {
entry.put(metaHeader.getColumnName(i), new Date(rs.getTimestamp(i).getTime()));
} else {
entry.put(metaHeader.getColumnName(i), rsc);
}
}
list.add(entry);
}

return list;
}
});

if (queryResult instanceof String) {
// 抛出异常信息
throw BankServiceExceptionConverter.convert("存储过程" + query.toString() + "执行发生错误,原因:" + (String) queryResult);
} else if (queryResult instanceof List) {
return (List<Map<String, Object>>) queryResult;
} else {
throw BankServiceExceptionConverter.convert("存储过程" + query.toString() + "执行发生异常,结果集无法获取");
}
}

 

 

详细;存储过程中包含3个参数,包名,存储过程名,参数集合。默认返回3个参数,一个number; 一个varchar,一个cursor.

在第三个参数中,可以自定义需要输入的参数个数,存储过程会自动添加输入参数:

create or replace package body XXX is


   procedure GET_XXXX_QUERY(RETCODE   OUT NUMBER,
                          RETSTR    OUT NVARCHAR2,
                          P_CUR     OUT REF_CURSOR,
                          P_Par in varchar2) as
  begin
    RETCODE := 0;
    RETSTR  := '';
   
    open p_cur for
        select b.字段 as aa from table b where b.字段2=P_Par ;
  end;

end XXX;

 

调用例子:

List<String> paraList = new ArrayList<String>();
  paraList.add(1);
  paraList.add(2);
 

  List<Map<String, Object>> results = null;

       results = commonDao.executeProc("XXX", "GET_XXXX_QUERY", paraList);

   if (results != null && results.size() > 0) {
    Map<String, Object> result = results.get(0);

    aa= Integer.parseInt(result.get("aa") + "");

   }

 

 

可以根据实际情况自行调整存储过程

分享到:
评论

相关推荐

    无废话Hibernate技术实用笔记

    Hibernate 是一款强大的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中操作数据库的简便方法。ORM工具的主要目标是减少开发者与数据库之间的交互复杂性,使得程序更加关注业务逻辑而非底层数据访问。 ...

    Struts2.1.6实战课件精解_02

    本教程还提供了一个综合案例,演示如何从Excel文件中读取数据并批量插入数据库,同时调用存储过程进行分页查询。这涉及到使用JXL库读取Excel文件、创建序列和表、配置JNDI、创建工程和公用组件、DAO层、Service层、...

    jeecms freemarker快乐到家分析

    在Jeecms中,我们需要创建一个Dynamic Web Project,然后通过Hibernate Configuration视窗来配置数据库连接。对于MySQL,我们需要选择正确的驱动,然后创建一个新的Hibernate连接配置。此外,还需要生成`hibernate....

    案例课程B-S架构-1期 详细设计书8-个人计划模块.pdf

    - **Model层**:采用hibernate作为持久化框架,负责数据的存储和检索。 个人计划模块的主要功能包括: 1. **个人计划新增**:用户可以通过一个包含表单元素的页面(person_add.jsp)添加新的个人计划。控制层逻辑...

    ControleDeEstoque:软件MVC的公用程序控制程序

    在Java环境中,MVC框架如Spring MVC或Struts2可以简化开发过程,提供强大的工具来管理和协调这些组件。`ControleDeEstoque-main` 文件可能包含项目的主要源代码,包括模型类、控制器类、视图模板以及配置文件。 - *...

    java开发jar汇总

    Java开发中的JAR(Java Archive)文件是Java平台特有的打包格式,它允许将多个类文件、资源文件和其他元数据组合到一个单一的归档文件中,便于分发、存储和执行。SSH(Spring、Struts、Hibernate)和MySQL是Java Web...

    JEECG_v3开发指南v3.3

    - **演示系统**:为了帮助开发者更好地理解JEECG的使用方法,指南中提供了一个演示系统,其中包含了完整的示例项目和代码,通过实际操作可以更加直观地学习如何使用JEECG来进行开发。 - **示例代码**:指南中还提供...

    JSP通用分页框架

    为了避免在每个查询方法中都显式地传入这些参数,我们可以使用`ThreadLocal`来存储这些公用参数。`ThreadLocal`为每个线程提供了一个独立的变量副本,使得不同线程间的数据不会相互干扰。 首先,创建一个`...

    教务管理系统(概要设计及详细设计).docx

    在逻辑设计中,特别设计了班级报考表和班级成绩表,这两个表的设计旨在存储和管理班级及成绩相关的数据,为教务管理提供了必要的数据支持。 教务管理系统的开发与实施,将极大地推进学校信息化管理水平的提升,减轻...

    java面试题

    在Java中,可以通过`private static`变量存储单例实例,配合私有构造器防止外部实例化,通常采用`lazy initialization`(懒汉式)或`double-checked locking`(双重检查锁定)实现。 2. **JSP、Servlet、Filter**:...

Global site tag (gtag.js) - Google Analytics