2

Java と SQL をよりよく学習するための Web ページを作成しようとしています。私の質問は、Java で一般的な SQL 選択ステートメントを作成する方法はありますか? 例えば:

SELECT var1 FROM var2 WHERE var3=var4 

またはそのようなもの。

var私の考えは、Web ページからユーザーが選択したアイテムで sを埋めることです。メソッドを使用してPHPでこれを実行できることは知っていますが、PHPは使用しPostていません。また、Java の Prepared Statement について読んだことがありますが、比較演算子の後に使用する場合にのみ機能するようです。元:

SELECT * FROM table Where attr = ? &

また、ハードコードされたバージョンを実行できることは知っていますが"SELECT " + var1 + "FROM " + var2 + "WHERE attr = " + var3 + " "、それは非常に一般的ではなく、多くのエラーが発生しやすいようです。

  • Incase: HTML と JSP を使用してこのテスト ページを作成しようとしています。
4

5 に答える 5

3

でやっていること?は、クエリをパラメータ化することです。クエリは、テーブルまたは列の名前ではなく、値に対してのみパラメーター化できます。

クエリを実行するたびに。データベースはクエリ プランを作成する必要があります。同じクエリを何度も実行している場合は、PreparedStatement. を最初に実行PreparedStatementすると、クエリ プランが生成されます。その後の実行では、同じプランが再利用されます。

ここでの同じクエリとは、where 句や式などで使用される値を除いて、すべての点で同一であることを意味します。

列またはテーブルの名前を変更したり、クエリの構造を変更したりすると、それは別のクエリになり、別のクエリ プランが必要になります。この場合、PreparedStement は役に立ちません。前述のハードコーディングされたバージョンに固執する必要があります。このため、 でテーブル名または列名をパラメータ化しようとすると、エラーが発生しますPreparedStement

そうは言っても。クエリに対してこのような一般的なアプローチを取ることはお勧めできません。クエリがそれほど単純であれば、ORM ツールの恩恵を受けることができます。SQL を 1 行も維持する必要はありません。複雑なクエリの場合、ORM 固有のクエリ言語、JPQL、またはネイティブ SQL を使用するオプションがあります。JPA + Hibernateを探します

于 2012-07-05T04:49:02.103 に答える
0

目的を達成するために使用できPreparedStatementます。

例えば ​​-

String query = "SELECT * FROM table Where attr = ?";
PreparedStatement pt = con.prepareStatement(query);
pt.setString(1, attribete);
pt.executeUpdate();
于 2012-07-05T05:09:19.903 に答える
0

単一のメソッドを使用して、クエリ文字列内のテーブル、列名、およびクエリ パラメータ値を置換する、SQL パッケージ クラスまたはその他のクラスのいずれにも、そのような直接的な規定はありません。

PreparedStatementString メソッドの両方といずれかreplace(...)に依存しreplaceFirst(...)、要件を達成する必要があります。

String sql = "Select $1, $2 from $3 where $4=? and $5=?";
sql = sql.replaceFirst( "$1", "col1_name" );
sql = sql.replaceFirst( "$2", "col2_name" );
sql = sql.replaceFirst( "$3", "table_name" );
sql = sql.replaceFirst( "$4", "col4_name" );
sql = sql.replaceFirst( "$5", "col5_name" );
// .. and so on

PreparedStatement pst = con.prepareStatement( sql );
// use relevant set methods to set the query parametrs.
pst.setXXX( 1, value_for_first_query_parameter ); // from a variable or literal
pst.setXXX( 2, value_for_second_query_parameter); // from a variable or literal
// ... and so on
于 2012-07-05T05:28:19.880 に答える
0

あなたの特定の使用法は JDBC によって許可されていません。準備済みステートメントを作成するときに、テーブル名をハードコーディングする必要があります。本当にそうしたい場合は、文字列連結を使用して SQL ステートメントを作成し、PreparedStatementwith パラメータを作成して where 部分を処理することをお勧めします。なぜ特定の解決策を気にするのか疑問に思っている場合はPreparedStatements、SQL インジェクションを避けるためです。

于 2012-07-05T03:35:57.313 に答える
-3

JDBCを使用している場合は、これを試すことができます

PreparedStatement statement = connection.prepareStatement("SELECT ? FROM ? WHERE ?=? ");

それから

statement.setString(1, "column_name");
statement.setString(2, "table_name");
statement.setString(3, "column_name");
statement.setBigDecimal(4, 123);

HibernateやJPAなどの他のORMを使用している場合は、それを行う方法もあると思います。

于 2012-07-05T03:55:36.680 に答える