SpringJDBC 호출 저장 프로세스

프로젝트 중 지구층은 Spring JDBC를 사용하는데 저장 프로세스를 호출할 때 인터넷에서 대체적으로 검색을 해서 스스로 정리했다.
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);
		}
	}

좋은 웹페이지 즐겨찾기