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。

查询:

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 的实例。根据上下文,有多种获取方法,但如果您使用某种 Java EE 容器,例如 Tomcat,您将需要使用 javax.sql.DataSource(另一种方法,没有 Java EE服务器,将使用 java.sql.DriverManager,但效率较低)。获取 DataSource 的方法也有多种,但最常见的如下所示:

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

于 2013-01-17T22:40:28.247 回答