0

インターフェイスを取り、いくつかの機能を実行する次のクラスがあります。

public class MSSQLHandler {

    IMSSQLStatement statement;

    public MSSQLHandler(IMSSQLStatement statement) {
        this.statement = statement;
    }

    public void invoke() throws SQLException {
        statement.executeStatement();
    }

    public List<?> getDataList() throws SQLException {
        return statement.getDataList();
    }
}

インターフェイスは、抽象クラスによって実装されます。

public abstract class MSSQLStatement implements IMSSQLStatement {

    protected Connection conn = null;
    protected ResultSet rs = null;

    protected abstract String createStatement() throws SQLSyntaxErrorException;

    public MSSQLStatement(Connection conn) {    
       this.conn = conn;
    }

    public void executeStatement() throws SQLException {    
       Statement st = conn.createStatement();
       String sql = createStatement();
       if(sql != null) {
          rs = st.executeQuery(createStatement());
       } else {
          throw new SQLException("Method 'createStatement()' has to be implemented.");
       }
    }    
}

ハンドラー クラスに渡されるクラス (またはインターフェイス) は、上から抽象クラスを拡張します。

public class MSSQLTaskStatement extends MSSQLStatement {

    public MSSQLTaskStatement(Connection conn) {
    super(conn);
    }

    private String projectName = null;

    public void setProjectName(String projectName) {
    this.projectName = projectName;
    }

    protected String createStatement() throws SQLSyntaxErrorException {
      // Create SQL query
    }

    @Override
    public List<MyObjectData> getDataList() throws SQLException {
      // Wrap results into a data object and save it to an array list
      List<MyObjectData> l = new ArrayList<MyObjectData>()
      while(rs.next()) {
         MyObjectData o = new MyObjectData();
         o.setColumn1(rs.getString(1))
         l.add(o);
      }
      return l;
    }
}

MyObjectData問題は、オーバーライドされたメソッドの返されたリストのオブジェクト タイプ ( ) をgetDataList()クラスMSSQLTaskStatementからハンドラ クラスpublic List<?> getDataList() throws SQLExceptionメソッドに渡すことができるかどうかです。

よろしく、サンドロ

4

2 に答える 2

1

型パラメーター<T>or<T extends ObjectDataBaseClass>IMSSQLStatementandに追加しMSSQLStatement、IMSSQLStatement のメソッド getDataList をList<T> getDataList()and useに変更しますpublic class MSSQLTaskStatement extends MSSQLStatement<MyObjectData>

次に、あなたMSSQLHandlerが fieldを持っている場合IMSSQLStatement<MyObjectData> statement、それ自体getDataList()がタイプセーフに a を返すList<MyObjectData>ことができます (またはMSSQLHandler、 に基づいていないステートメントで使用したい場合は、ジェネリックにすることもできますMyObjectData)。

于 2013-03-07T11:52:32.863 に答える
0

Spring のJdbcTemplateクラスを参照してください。Springを全く使わなくても使える必須機能があります。または、独自の永続層の実装を構築するためのガイドとして使用することもできます。

于 2013-03-07T12:03:59.577 に答える