2013-01-15 25 views
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。如何在java中編寫查詢以使用MySql插入外鍵數據

SQL查詢:

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

有了這個場景我怎麼會寫與同一查詢的java的代碼。

+1

這個問題太廣泛了。你在使用某種ORM或持久性框架嗎?或者你想要低級別的JDBC? –

+0

@Traroth我想要低級別的JDBC。 –

回答

1

首先,您需要一個java.sql.Connection的實例。根據上下文的不同,有多種獲取方法,但是如果您使用某種類型的Java EE容器(例如Tomcat),則需要使用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(); 

然後一個java.sql.Statement中,用於執行SQL語句類:

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