SpringJDBC 호출 저장 프로세스
public class StoredService extends BaseService {
private Map<String, Object> param = new HashMap<String, Object>();
{
param.put("c_id", "234");
param.put("c_name", "dddd");
}
public void test1() {
PersonPostResult result = getQuickSupportDao().getQuickJdbcTemplate().execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(Connection con) throws SQLException {
String storedProc = "{call proc_test(?,?,?,?)}";//
CallableStatement cs = con.prepareCall(storedProc);
cs.setString(1, "111");
cs.setString(2, "mingzi");
cs.registerOutParameter(3, java.sql.Types.VARCHAR);
cs.registerOutParameter(4, java.sql.Types.VARCHAR);
return cs;
}
}, new CallableStatementCallback<PersonPostResult>() {
public PersonPostResult doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.execute();
String status = cs.getString(5);
String msg = cs.getString(6);
PersonPostResult tempResult = new PersonPostResult(status, msg);
return tempResult;
}
});
System.out.println(result);
}
public void test() {
StoredProcedureTemplate t = new StoredProcedureTemplate(
getQuickSupportDao().getQuickJdbcTemplate(), "proc_test");
t.setValue("c_id", "111");
t.setValue("c_name", "mingZi");
t.setVarcharParam("c_id");
t.setVarcharParam("c_name");
t.setVarcharOutParam("status");
t.setVarcharOutParam("msg");
Map map = t.execute();
System.out.println(map);
}
public void test2() {
SimpleJdbcCall call = new SimpleJdbcCall(getQuickSupportDao().getQuickJdbcTemplate());
call.withProcedureName("proc_test").declareParameters(new SqlParameter[]{
new SqlParameter("c_id", Types.VARCHAR),
new SqlParameter("c_name", Types.VARCHAR),
new SqlOutParameter("status", Types.VARCHAR),
new SqlOutParameter("msg", Types.VARCHAR)
}).returningResultSet("message", ParameterizedBeanPropertyRowMapper.newInstance(Message.class));
Map<String, Object> ming = call.execute(param);
System.out.println(ming);
}
public void test3() {
SimpleJdbcCall call = new SimpleJdbcCall(getQuickSupportDao().getQuickJdbcTemplate());
call.withProcedureName("proc_test").declareParameters(new SqlParameter[]{
new SqlParameter("c_id", Types.VARCHAR),
new SqlParameter("c_name", Types.VARCHAR),
new SqlOutParameter("status", Types.VARCHAR),
new SqlOutParameter("msg", Types.VARCHAR)
});
String ming = call.executeObject(String.class, param);
//Message message = call.executeObject(Message.class, param);
System.out.println(ming);
}
class Message{
private String status;
private String msg;
public void setStatus(String status) {
this.status = status;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getStatus() {
return status;
}
public String getMsg() {
return msg;
}
@Override
public String toString() {
return "Message{" +
"status='" + status + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
}
테스트 1은 jdbc Temple의excute 방법을 사용하고 테스트 방법은 추상적인 클래스stored Procedure를 계승하여 최종적으로 사용하는 것인지 jdbc Temple의call 방법을 사용하는 것인지,
test2는SimpleJdbcCall의execute를 사용합니다.
test3의executeObject, 원래 대상을 나에게 직접 되돌려줄 수 있다고 생각했는데 오류 메시지가 발생했습니다.String은 *** 대상으로 바꿀 수 없습니다. 첫 번째 되돌려주는 값만 얻을 수 있다는 뜻입니다.
10:11:03,267 WARN CallMetaDataContext:251 - Accessing single output value when procedure has more than one output parameter
public String getScalarOutParameterName() {
if (isFunction()) {
return getFunctionReturnName();
}
else {
if (this.outParameterNames.size() > 1) {
logger.warn("Accessing single output value when procedure has more than one output parameter");
}
return (this.outParameterNames.size() > 0 ? this.outParameterNames.get(0) : null);
}
}