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

有人能告诉我是否第一个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 (?,?,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","password")) {

    try (PreparedStatement stmt = connection.prepareStatement("INSERT INTO PUBLISHER (CODE,?)")) {
        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,?)");
        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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...