2013-03-06 71 views
4

我正在使用Play框架1.2.5,我想通過創建存儲過程並使用它們來優化我的SQL查詢,但我不知道該怎麼做。創建和使用存儲過程與Pla​​y Framework和JPA

要通過Java代碼創建存儲過程該怎麼做?另外,我應該在@OnApplicationStart作業中執行此操作,以確保在應用程序啓動時創建和存儲過程?

之後,我該如何使用我的存儲過程?使用哪個功能?我怎樣才能將參數傳遞給我的程序?我如何檢索我的程序的結果? (通常結果將是一個SELECT查詢)最後,是否可以將我的過程的結果綁定到播放框架中的模型?

我有很多的問題,但我是新來與遊戲框架和JPA和我的存儲過程想確保我正確使用這些

謝謝您的幫助

回答

4

我不知道你應該如何創建它們。也許OnApplicationStart方法就是你需要的。在我的環境中,程序已經到位。我們只是使用Play來調用它們。要調用存儲過程,您應該查看Work接口。通過實現這個,你可以在數據庫中執行語句。

我們已經創建了一個基本OracleProcedure類:

public class CallOracleProcedure implements Work { 

    private String anonymousPLSQL; 
    private String[] parameters; 

    public CallOracleProcedure(String anonymousPLSQL, String[] parameters) { 
     this.anonymousPLSQL = anonymousPLSQL; 
     this.parameters = parameters.clone(); 
    } 

    /** 
    * Create a JDBC PreparedStatement and then execute the anonymous 
    * PL/SQL procedure. 
    */ 
    @Override 
    public void execute(Connection connection) { 
     PreparedStatement statement = null; 
     try { 
      statement = connection.prepareStatement("begin " + anonymousPLSQL + "; end;"); 

      if (parameters != null) { 
       int i = 1; 
       for (String param : parameters) { 
        statement.setString(i++, param); 
       } 
      } 
      statement.executeUpdate(); 
     } catch (SQLException e) { 
      Logger.error("Error performing anonymous pl/sql statement: '%s', with parameters: '%s' - catched error '%s'", anonymousPLSQL, parameters, e); 
     } finally { 
      if (statement != null) { 
       try { 
        statement.close(); 
       } catch (Exception e) { 
        Logger.error("Error closing statement: %s", e); 
       } 
      } 
     } 
    } 
} 

對於每一個特定的存儲過程,你可以擴展此類,並通過super()傳遞名稱和參數的構造器:

public class StoredProcedureCall extends CallOracleProcedure { 
    public StoredProcedureCall(String param) { 
     super("package.storedprocedure(?)", new String[] { orgname }); 
    } 
} 

在你的代碼你可以這樣稱呼它:

StoredProcedureCall procedure = new StoredProcedureCall("your parameter"); 
session.doWork(procedure); 

如果您需要調用一個過程,檢索一個返回值可以在​​方法使用CallableStatement

public class ProcedureWithReturnValue implements Work { 

    private final String parameter; 
    private String returnValue = null; 

    public ProcedureWithReturnValue (final String parameter) { 
     this.parameter = parameter; 
    } 

    @Override 
    public void execute(Connection connection) { 
     CallableStatement statement = null; 

     try { 
      statement = connection.prepareCall("begin ? := package.procedure(?); end;"); 
      statement.registerOutParameter(1, OracleTypes.VARCHAR); 
      statement.setString(2, parameter); 
      statement.execute(); 

      returnValue = statement.getString(1); 
     } catch (SQLException e) { 
      Logger.error("Error getting return value - catched error '%s'", e); 
     } 
    } 

    public String getReturnValue() { 
     return returnValue; 
    } 
} 
+0

謝謝!你知道如何從過程中檢索SELECT查詢的結果嗎? – 2013-03-06 12:21:03

+0

我已經添加了另一個返回值的例子。我希望那是你的意思。 – evandongen 2013-03-06 14:17:23

+0

謝謝你的回答。您的示例是否適用於返回多個結果的SELECT? – 2013-03-06 17:56:17

1

爲了回答您的問題之一:

你應該在直接創建存儲過程數據庫,他們確實沒有連接到你的應用程序。當它們存在於數據庫中時,可以從應用程序中調用它們。如何創建存儲過程取決於您使用的是哪個數據庫。

從此開始,爲您的需求之一創建一個存儲過程並確保其正常工作。然後進行下一步,並嘗試從您的應用程序調用它。

+0

謝謝您的信息! – 2013-03-06 12:20:38

0

看看evolutions(http://www.playframework.com/documentation/1.2.7/evolutions)創建存儲過程。

+1

僅鏈接答案根本不是答案。鏈接過時。將內容包含在答案中。 – 2014-01-21 20:13:57

+1

我不會複製/粘貼另一個網站Okuma的全部內容。我確實認爲對費邊來說,提及「演變」就足夠了。要實現這一點,您需要更多的評論。 – GStyler77 2014-01-22 15:04:40