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 编写此代码。
最佳答案
首先,您需要一个 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 block 中执行此操作,以便确保它得到执行。最后,整个事情看起来像这样(未经测试的代码!):
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
关于java - 如何在java中编写查询以使用MySql插入带有外键的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342826/