当前位置: 首页 > 面试题库 >

PreparedStatement:如何使用JDBC将数据插入到多个表中

宇文梓
2023-03-14
问题内容

有人可以告诉我stmt.close();,以下JDBC代码中的第一个条件是否是针对两个不同的表执行两个不同的SQL查询?

public class MyService {
    private Connection connection = null;

    public void save(Book book) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");

            PreparedStatement stmt = connection.prepareStatement("INSERT INTO PUBLISHER (CODE, PUBLISHER_NAME) VALUES (?, ?)");
            stmt.setString(1, book.getPublisher().getCode());   
            stmt.setString(2, book.getPublisher().getName());           
            stmt.executeUpdate();

            stmt.close(); //1

            stmt = connection.prepareStatement("INSERT INTO BOOK (ISBN, BOOK_NAME, PUBLISHER_CODE) VALUES (?, ?, ?)");
            stmt.setString(1, book.getIsbn());  
            stmt.setString(2, book.getName());
            stmt.setString(3, book.getPublisher().getCode());
            stmt.executeUpdate();

            stmt.close(); //2       
        } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } 
        finally { connection.close(); }         
    }
}

问题答案:

在我的书中,我总是建议关闭已经打开的资源,以避免可能的泄漏。

一种更现代的方法是使用try-with-
resources

try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) {

    try (PreparedStatement stmt = connection.prepareStatement("INSERT INTO PUBLISHER (CODE, PUBLISHER_NAME) VALUES (?, ?)")) {
        stmt.setString(1, book.getPublisher().getCode());   
        stmt.setString(2, book.getPublisher().getName());           
        stmt.executeUpdate();
    }
    // stmt is auto closed here, even if SQLException is thrown

    try (PreparedStatement stmt = connection.prepareStatement("INSERT INTO BOOK (ISBN, BOOK_NAME, PUBLISHER_CODE) VALUES (?, ?, ?)");
        stmt.setString(1, book.getIsbn());  
        stmt.setString(2, book.getName());
        stmt.setString(3, book.getPublisher().getCode());
        stmt.executeUpdate();
    }
    // stmt is auto closed here, even if SQLException is thrown
}
// connection is auto closed here, even if SQLException is thrown


 类似资料:
  • 问题内容: 我创建了一个数据库名称movielibrarysystem,其中有3个表。 分别是类型,发布者和电影..​​.现在1个发布者可以有很多电影,而1个电影则有很多类型..在movie表中,发布者ID和typeid都充当外键。 我的问题是,如何在电影表中插入数据…我已经将数据插入到发行商和类型表中,但是我无法插入电影表中。 问题答案: 这就是你要做的。首先,发行人与电影之间的关系是一对多的-

  • 本文向大家介绍如何使用JDBC将二进制数据插入表中?,包括了如何使用JDBC将二进制数据插入表中?的使用技巧和注意事项,需要的朋友参考一下 SQL数据库在其中提供了一个名为Blob(二进制大对象)的数据类型,您可以存储诸如图像之类的大型二进制数据。 要将二进制(流)值存储到表中,JDBC在PreparedStatement接口中提供了一种称为setBinaryStream()的方法。 它接受一个整

  • 问题内容: 我想使用PreparedStatement将行插入表中。该表有3列(int,String,String)。关键是int列是AUTO_INCREMENT,所以我想将该变量保留为空,然后让数据库完成该工作(这是一个id)。还没有找到如何做! 这是一个MySQL数据库。 问题答案: 这是相对简单的,只需从列列表中删除自动增量列即可: 准备该语句,设置两个参数,然后在非查询模式下执行。

  • 我是新加入这个网站的。我有点小问题。我需要知道如何使用C#将数据插入多个SQL Server表。英语不是我的母语,所以如果有一些拼写错误,很抱歉。 这是我的C#代码 这是我运行此代码时遇到的错误。请帮助解决此问题

  • 问题内容: 这似乎是一个非常简单的问题,但是我无法弄清楚我的问题是什么。我有一个方法addTask,它将一些信息添加到我们的数据库中,如以下代码所示: 我的问题是prepareStatement.execute()始终返回false,表示该信息尚未添加到数据库中。我可以运行psql,这确认没有任何内容写入数据库。该连接肯定会连接到正确的数据库(我将其放置在其他一些printlns中进行检查)。我正

  • 问题内容: 我想使用Java一次将多行插入MySQL表中。行数是动态的。过去我在做… for (String element : array) { myStatement.setString(1, element[0]); myStatement.setString(2, element[1]); } 我想对此进行优化,以使用MySQL支持的语法: INSERT INTO table (col1,