-1

このチュートリアルに従って、Spring Framework での JDBC の使用を研究しています: http://www.tutorialspoint.com/spring/spring_jdbc_example.htm

したがって、MySql DB に Student という名前の次のテーブルがあります。

mysql> describe Student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| ID    | int(11)     | NO   | PRI | NULL    | auto_increment |
| NAME  | varchar(20) | NO   |     | NULL    |                |
| AGE   | int(11)     | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

チュートリアルのリンクでわかるように、私の DAO オブジェクトのこの Student テーブルに対する CRUD 操作を記述するStudentDAOという名前のインターフェイスがあります。

さて、 StudentJDBCTemplateクラスを見てみましょう。これはStudentDAOインターフェースの実装であるため、このクラスでは、CRUD メソッドのすべての実装がインターフェース内で宣言されています。

わかりました...このクラスの JDBC メソッドの意味について疑問があります。

たとえば、次のようなものがある場合:

public void create(String name, Integer age) {
    String SQL = "insert into Student (name, age) values (?, ?)";

    jdbcTemplateObject.update(SQL, name, age);
    System.out.println("Created Record Name = " + name + " Age = " + age);
    return;
}

わかりました...このメソッドは、Student テーブルに新しいレコードを作成すると思います。

SQL 変数には、クエリを表す文字列が含まれており、ここで最初の疑問があります

私が持っているとき:

String SQL = "生徒 (名前、年齢) の値 (?, ?) に挿入";

正確にはどういう意味ですか?これは、私の create() の 2 つの入力パラメーターが、この文字列の「名前」と「年齢」の代わりになることを意味しますか?

うーん...これは文字列のように見えるので、私には奇妙に聞こえます(実際には ""の中にあります)

2 番目の疑いは、次の行に関連しています。

jdbcTemplateObject.update(SQL, name, age);

SQL 文字列内に SQL クエリがある場合、変数名と年齢も渡す必要があるのはなぜですか?

JDBC がどのように機能するかをよく理解するのを手伝ってくれませんか?

TNX

アンドレア

4

2 に答える 2

1

私が持っているとき:

String SQL = "生徒 (名前、年齢) の値 (?, ?) に挿入";

正確にはどういう意味ですか?これは、私の create() の 2 つの入力パラメーターが、この文字列の「名前」と「年齢」の代わりになることを意味しますか?

JDBC は、2 つの?プレースホルダーを適切な値に置き換えます。これは、SQL インジェクションの防止に役立つため、優れた方法と見なされています。

于 2013-02-19T12:23:03.003 に答える
1

これ

insert into Student (name, age) values (?, ?)

Studentは、名前と年齢を (順番に) 指定して、 table にレコード (行) を挿入していることを意味します。各 '?' は順番に指定された列名を参照するため、最初の「?」は、名前の値などのプレースホルダーです。レコードを挿入して (制約が許す限り) 列のサブセットのみを指定できることに注意してください。そのため、名前年齢、またはその列が存在する場合は他の何かを指定することができます。

nameこのプレースホルダー (?) メカニズムが存在するため、値をエスケープしたり、連結/置換によって無効な SQL ステートメントを生成したりすることを心配する必要はありません。プレースホルダーを使用すると、引用符や SQL コメントなどを気にせずに名前に任意の文字列を挿入できます。これは、連結を使用して単純に文字列を作成した場合に問題を引き起こす可能性があります。

String sql = "insert into Student... " + name + ", " + age;

名前と年齢に注意

jdbcTemplateObject.update(SQL, name, age);

テーブルの列名ではなく、Java 変数を参照してください。彼らは同じくらい簡単にできる

jdbcTemplateObject.update(SQL, x, y);

内部では、SPring はPreparedStatementsを使用しており、これらについて読むことは有益です。

于 2013-02-19T12:11:26.510 に答える