3

私が JDBC アプリケーションを作成しているとき、私が通常行っていることは、「SQL ステートメント」を Java プログラムにハードコーディングすることです。例として

ResultSet rs = st.execute("select * from Users")

しかし、このアプローチは良いソフトウェア エンジニアリングの概念ではないと聞いたことがあります。これらのSQL文はすべて「ストアドプロシージャ」としてデータベースに残し、JDBCはそれらにアクセスする必要があると言う人もいます。これらの 2 つのアプローチから、優れたソフトウェア エンジニアリングの概念として分類できるのはどれですか? 助けてください!

4

6 に答える 6

4

これについてはコンセンサスが得られないでしょう、と私は予測します。

ストアド プロシージャは、複雑なデータベース ロジックとクエリをカプセル化するのに役立ちますが、並べ替え/フィルター/クエリなどのためにデータベースからデータを転送することを回避します。

欠点は、ビジネス ロジックがストアド プロシージャに忍び込んでいることがよくあることですが、それはアプリケーション自体に残る可能性が高いということです。

そのため、このロジックをどこに置くべきか、ストアド プロシージャをどのように使用するかについて、開発者/データベース管理者などの間でしばしば綱引きが行われます。実用的であることをお勧めします。SQL クエリをローカライズして、SQL (テーブル名など) を変更するときに、コードベース全体で何かを変更する必要がないようにします。パフォーマンスのためにストアド プロシージャを使用し、コードが複雑でデータベースにとっては些細なことを行う場合に使用します。

于 2012-08-02T08:34:20.637 に答える
2

すべてのSQLクエリを定数として保存したいと思います。

public static final String sqlEmpInsert = "SELECT EMP_NAME FROM EMPLOYEES";

別のJavaクラスで。モジュールごとに個別の「定数」クラスファイルがあり、一部のモジュールではSQLクエリを個別のプロパティファイルに保存しているため、Javaクラスファイルから分離されます。

于 2012-08-02T11:33:03.187 に答える
2

Hibernate http://www.hibernate.org/(または別のORM)を使用して、それほど多くのSQLステートメントを維持する必要がないようにします。HibernateはほとんどのSQLをバックグラウンドで生成するため、SQLステートメントの保守について心配する必要はありません。

TopLinkやOpenJPAなどの他のORMも利用できます

于 2012-08-02T08:49:17.297 に答える
2

データベースで関数またはストアド プロシージャを使用しSYS_REFCURSORて、Java からこれらを返し、呼び出すことをお勧めします。CallableStatement

Oracle データベースを使用している場合は、次のことを試すことができます。

データベース機能

CREATE OR REPLACE FUNCTION my_func (p_deptno IN number,p_emp_no IN varchar2)
   RETURN SYS_REFCURSOR
AS
   p_cursor   SYS_REFCURSOR;
BEGIN
   OPEN p_cursor FOR
      select *
        from emp
        where deptno = p_deptno and emp_number=p_emp_no;
   RETURN p_cursor;
END;
/

ジャワ

        callablestatement = 
                connection.prepareCall("begin ? :=my_func(?,?); end;");
callablestatement.registerOutParameter(1, OracleTypes.CURSOR);
callablestatement.setString(2, param);
callablestatement.setString(3, param);
            callablestatement.execute();
            resultSet = ((OracleCallableStatement)callablestatement).getCursor(1);

このアプローチを使用すると、Java での SQL ステートメントのハード コーディングを回避できます。

于 2012-08-02T08:46:08.623 に答える
2

ハードコードされた文字列を使用して渡すことStatementは、ソフトウェア エンジニアリングの良い方法ではありません。

常に使用する必要がありますPreparedStatement

例:

String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = ?";
PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL);
preparedStatement.setInt(1, 1001);
ResultSet rs = preparedStatement.executeQuery(selectSQL ); 

ストアド プロシージャも良い方法です。ほとんどの場合、クエリは最初の実行を除いて事前にコンパイルされるため、ストアド プロシージャはパフォーマンスの観点から使用されます。

于 2012-08-02T08:35:34.077 に答える
1

SQLステートメントをハードコーディングする場合、データベースで何かを変更するたびに、ソースコードでSQLステートメントを変更しなければならない場合があります。

ストアドプロシージャを使用することで、これらを変更するだけで済み、Javaプログラムのソースコードを変更する必要はありません。

したがって、ストアドプロシージャを使用することをお勧めします。

于 2012-08-02T08:20:29.853 に答える