论坛首页 Java企业应用论坛

Hibernate调用执行存储过程

浏览 2229 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-01-09  

    项目中需要采用存储过程使用代码:

 

/**
  * 执行存储过程的方法(存储过程仅仅支持输入参数的使用,并且无返回值的以后扩展信息)
  *
  * @param procedureName
  *            存储过程的名称
  * @param paramList
  *            备注:Map<String, Object> paramList 其中String 参数: Object输入的参数对象
  *            存储过程参数的信息
  */
 public void executeProcedure(String procedureName, final Map<String, Object> paramList) {
  if (StringUtils.isNotBlank(procedureName)) {
   int length = 0;
   if (MapUtils.isNotEmpty(paramList)) {
    length = paramList.size();
   }
   final String executeProcedure = generationExcuteProdure(procedureName, length);
   this.getHibernateTemplate().execute(new HibernateCallback() {
    @SuppressWarnings("deprecation")
    @Override
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
     boolean flag = false;
     Transaction trans = session.beginTransaction();
     try {
      CallableStatement cstmt = session.connection().prepareCall(executeProcedure);
      if (MapUtils.isNotEmpty(paramList)) {
       Set<Entry<String, Object>> entrys = paramList.entrySet();
       for (Entry<String, Object> entry : entrys) {
        cstmt.setObject(entry.getKey(), entry.getValue());
       }
      }
      flag = cstmt.execute();
      trans.commit();
     } catch (RuntimeException e) {
      trans.rollback();
      flag = false;
      logger.error(e);
     }
     return flag;
    }
   });
  } else {
   throw new RuntimeException(" the procedureName is not null!");
  }
 }

 

 

 /**
  * 生成存储过程的方法
  *
  * @param procedureName
  *            存储过程的名称
  * @param length
  *            参数的个数
  * @return 生成的执行的存储过程
  */
 private String generationExcuteProdure(String procedureName, int length) {
  StringBuilder sql = new StringBuilder();
  sql.append("{ call ");
  sql.append(StringUtils.trim(procedureName));
  if (length > 0) {
   sql.append("(");
   for (int i = 0; i < length; i++) {
    sql.append("?");
    if (i != length - 1) {
     sql.append(",");
    }
   }
   sql.append(")");
  }
  sql.append("}");
  logger.info("executeProcedure", sql.toString());
  return sql.toString();
 }

 

备注:项目中采用注解希望大家指点一下,有没有更加简单的方法或采用注解方式:

@SQLInsert,@SQLUpdate,怎么使用希望大家拍砖!!

好像可以但是不知道怎么使用?请教高人支持!!!!

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics