Как убрать дублирование из кода котельной плиты CallableStatement? - PullRequest
0 голосов
/ 20 сентября 2019

У нас есть много хранимых процедур и функций, которые мы вызываем в нашей БД, и настройка для каждого вызова в нашем слое доступа к данным действительно многословна с настройкой входных данных, регистрацией выходных данных и т. Д. Есть ли лучшее решение для генерации, возможно,CallableStatement динамически для любой хранимой процедуры или функции с любыми типами / количествами параметров и типом вывода?

У нас есть решение для домашнего приготовления, и оно уродливо ... полно if / else, fors и whiles ... очень трудно читать и поддерживать.Мы также попытались централизовать общий шаблонный код для аналогичных вызовов функций.IE Все те, которые принимают Long и возвращают логическое значение, все используют один и тот же централизованный метод с динамической Long и строкой хранимой процедуры.

Код из памяти, пожалуйста, не обращайте слишком много внимания на синтаксис, это вопрос дизайна больше всего.

//Client usage in Controller class

certAwarded = PackageName.isCertAwardedFor(personIDToCheck);

//In class that mimics the interface of the database packages 
//There would be a method per public function
public static boolean isCertAwardedFor(Long personID){
    return PackageUtils.isMet(personID, "{? = call PACKAGE.is_met(?)}");
}

//In Package scoped Utility class 
//Attempt to centralize all single input param and return of boolean
//type of procedure calls.
static boolean isMet(Long personID, String proc){
    boolean met = false;
    try(AutoCloseableStatement stmt = new AutoCloseableStatement(proc)){
        CallableStatement callableStmt = stmt.createStatement();
        callableStmt.registerOutParameter(1, OracleTypes.VARCHAR2);
        callableStmt.setLong(2, personID);
        callableStmt.execute();
        met = convertYNtoBool(callableStmt.getString(1));
    }catch(SQLException ex){
        Logger.log(ex);
    }
return met;
}


///////////////////////////////////OR///////////////////////////////

//Client usage in Controller class

certAwarded = PackageName.isCertAwardedFor(personIDToCheck, CertPackageEnum);

//In class that mimics the interface of the database packages 
//There would be a method per public function
public static boolean isCertAwardedFor(Long personID, PackageProc procCall){
    return PackageUtils.call(personID, procCall.IS_CERT_AWARDED);
}

//In Package scoped Utility class 
//Attempt to centralize all single input param and return of boolean
//type of procedure calls.
static boolean isMet(Long personID, String proc){
    try(AutoCloseableStatement stmt = new AutoCloseableStatement(proc)){
        CallableStatement callableStmt = stmt.createStatement();
        LOTS OF CONDITIONS TO CHECK AND SET ALL POSSIBLE INPUTS AND OUTPUTS
    }catch(SQLException ex){
        Logger.log(ex);
    }
    return ?????
}
...