0
Table 1 :questions(qid,category,question);  PRIMARY KEY:qid,category  
Table 2 :choices(ch_id,qid1,category1,choice);  PRIMARY KEY: ch_id  

ここで qid、ch_id は AUTO_INCREAMENT を使用します。

SQL クエリ:

mysql>INSERT INTO choices(qid1,category1,choie)  
->SELECT qid,category,'Some Choice'  
->FROM questions 
WHERE qid1=qid AND category1=category;  

このシナリオでは、同じクエリで Java のこのコードをどのように記述しますか。

4

1 に答える 1

2

まず、java.sql.Connectionのインスタンスが必要です。コンテキストに応じて、取得する方法はさまざまですが、たとえばTomcatなどのJava EEコンテナーを使用している場合は、javax.sql.DataSourceを使用する必要があります(別の方法では、Java EEは使用しません)。サーバーは、java.sql.DriverManagerを使用しますが、効率は低下します)。データソースを取得するさまざまな方法もありますが、最も一般的な方法は次のようになります。

String jndiName = "java:comp/env/jdbc/myDB";
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(jndiName);

これは、Tomcat構成で設定したデータベース接続を使用します。

その後、接続が必要です。

Connection con = ds.getConnection();

次に、SQLステートメントの実行に使用されるクラスであるjava.sql.Statement:

Statement stmt = con.createStatement();

これで、SQLコードを実行できます。

stmt.execute("INSERT INTO choices(qid1,category1,choie) SELECT qid,category,'Some Choice' FROM questions WHERE qid1=qid AND category1=category;");

終わりましたか?いいえ、そうではありません。特定のコードと例外処理を追加してトランザクションを管理する必要があります。また、後で再利用できるように、使用しているさまざまなデータベースリソースを解放する必要があります。これはfinallyブロックで行うので、確実に実行されます。最後に、全体は次のようになります(テストされていないコード!):

try {
    String jndiName = "java:comp/env/jdbc/myDB";
    Context ctx = new InitialContext();
    DataSource ds = (DataSource)ctx.lookup(jndiName);
    Connection con = ds.getConnection();
    con.setAutoCommit(false); // Transaction are managed manually
    Statement stmt = con.createStatement();
    stmt.execute("INSERT INTO choices(qid1,category1,choie) SELECT qid,category,'Some Choice' FROM questions WHERE qid1=qid AND category1=category;");
    con.commit(); // Transaction OK
} catch (SQLException sqle) {
    con.rollback(); // Transaction not OK
} finally {  //Resource management
    if (stmt!=null) {
        stmt.close();
    }
    if (con != null) {
        con.close();
    }
}

Javadocを確認する必要があります。良い出発点:

http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html

于 2013-01-17T22:40:28.247 に答える