项目中需要采用存储过程使用代码:
/**
* 执行存储过程的方法(存储过程仅仅支持输入参数的使用,并且无返回值的以后扩展信息)
*
* @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,怎么使用希望大家拍砖!!
好像可以但是不知道怎么使用?请教高人支持!!!!