/**
* 作者:guoyzh
* 时间:2019/11/29 14:38
* 功能:StoredProcedure 存储过程调用工具类
*/
public class SPUtils {
private static SPUtils instance;
public static SPUtils getInstance() {
if (instance == null) {
synchronized (SPUtils.class) {
if (instance == null) {
instance = new SPUtils();
}
}
}
return instance;
}
private SPUtils() {
}
/**
* 调用存储过程
*
* @param entityManager 实体控制类
* @param procedureName 存储过程名称
* @param params 参数值
* @return
*/
public StoredProcedureQuery callStoredProcedure(EntityManager entityManager, String procedureName, List<ParamBean> params) {
if (ObjectUtils.isEmpty(params)) {
return null;
}
StoredProcedureQuery query = entityManager.createStoredProcedureQuery(procedureName);
for (ParamBean param : params) {
// 注册参数
query.registerStoredProcedureParameter(param.getParamName(), String.class, param.getParamMode());
if (!ObjectUtils.isEmpty(param.getParamValue())) {
// 设置参数的值
query.setParameter(param.getParamName(), param.getParamValue());
}
// 将使用过的参数对象转换为null 方便循环结束后手动调用gc进行回收
param = null;
}
// 调用gc将使用过的对象进行回收
System.gc();
return query;
}
/**
* 测试期间打印本次请求存储过程日志
*/
public String getQueryParams(StoredProcedureQuery query) {
ProcedureParamBindings bindings = (ProcedureParamBindings) ReflectUtils.getBeanFieldValue(query, "paramBindings");
// 请求参数名称
Collection<QueryParameter> parameters = bindings.getParameterMetadata().getNamedParameters();
// 获取调用存储过程的名称
String procedureName = bindings.getProcedureCall().getProcedureName();
// 请求参数对应的值 map
HashMap<ProcedureParameterImpl, ParameterBindImpl> bindingMap = (HashMap) ReflectUtils.getBeanFieldValue(bindings, "bindingMap");
// 保存数据
StringBuilder sb = new StringBuilder();
sb.append("exec ").append(procedureName).append(" ");
// 填充返回结果
parameters.stream().forEach(bean -> {
int isContain = 0;
for (Map.Entry<ProcedureParameterImpl, ParameterBindImpl> entry : bindingMap.entrySet()) {
ProcedureParameterImpl key = entry.getKey();
ParameterBindImpl value = entry.getValue();
if (key.getName().equals(bean.getName())) {
isContain++;
sb.append("'").append(value.getValue().toString()).append("'").append(",");
}
}
// 如果结果集中不包含当前key 增加一条空消息
if (isContain == 0) {
sb.append("''").append(",");
}
});
if (sb.length() > 0) {
// 去除最后一个逗号
sb.deleteCharAt(sb.length() - 1);
}
return JsonUtils.toJson(sb.toString());
}
@Data
@AllArgsConstructor
public static class ParamBean {
// 参数名称
private String paramName;
/*// 参数类型
private Class paramType;*/
// 调用存储过程时候输入还是输出字段
private ParameterMode paramMode;
// 参数的值
private Object paramValue;
}
}
Java调用存储过程的工具类 调用存储过程封装 打印存储过程调用参数
猜你喜欢
转载自blog.csdn.net/u010838785/article/details/103510339
今日推荐
周排行