有人能告诉我是否第一个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
原文地址:https://www.jb51.cc/java/126924.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。