java - 如何在java中编写查询以使用MySql插入带有外键的数据

标签 java mysql insert foreign-keys

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/

相关文章:

c# - 如何为列表中的每个项目添加新对象

mysql - 插入大量数据时选择缓慢(MYSQL)

mysql - 我需要为新语言准备一个新表吗?

java - 即使在单独的线程中实现 sleep 后,GUI 执行也不会延迟

java - 在对象B中,如何访问创建了对象B的对象A?

java - 识别 Windows AD 远程用户 Spring Boot + Waffle

mysql - 通过附加新列加入两个不同的 MySQL 结果查询

mysql - 错误 : function crashed. 详细信息:连接 ECONNREFUSED/cloudsql/<实例连接名称>>

mysql - 如何使用mysql中的variable选项将表中某一列的多条记录复制到列中的另一个表

java - 使用 BottomNavigationView 时只加载一次数据