API使用不当:Java JDBC连接与操作错误示例
在Java中使用JDBC(Java Database Connectivity)进行数据库连接和操作时,常见的错误包括资源泄露、SQL注入、异常处理不当等。以下是一些错误示例和正确的做法:
错误示例1:资源泄露错误代码:
javaConnection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, user, password);
String sql = "SELECT * FROM users WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,1);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
错误原因:没有在finally
块中关闭Connection
、PreparedStatement
和ResultSet
,导致资源泄露。
正确做法:javaConnection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, user, password);
String sql = "SELECT * FROM users WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,1);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
###错误示例2:SQL注入错误代码:javaString userId = request.getParameter("userId");
String sql = "SELECT * FROM users WHERE id = '" + userId + "'";
PreparedStatement pstmt = conn.prepareStatement(sql);
错误原因:直接将用户输入拼接到SQL语句中,导致SQL注入风险。
正确做法:javaString userId = request.getParameter("userId");
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userId);
###错误示例3:异常处理不当错误代码:javatry {
// JDBC操作} catch (SQLException e) {
System.out.println("数据库操作失败");
}
错误原因:异常处理过于简单,没有提供足够的错误信息,不利于问题定位和解决。
正确做法:javatry {
// JDBC操作} catch (SQLException e) {
e.printStackTrace(); //打印堆栈跟踪,获取更多错误信息//可以进一步封装异常,提供更友好的错误信息给用户}
###错误示例4:使用自动提交错误代码:javaConnection conn = DriverManager.getConnection(url, user, password);
//没有显式关闭自动提交
错误原因: 默认情况下,Connection
对象的自动提交是开启的,这可能导致事务管理不当。
正确做法:javaConnection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); //显式关闭自动提交try {
//执行事务操作 conn.commit(); // 提交事务} catch (SQLException e) {
conn.rollback(); //回滚事务e.printStackTrace();
} finally {
conn.setAutoCommit(true); //恢复自动提交 conn.close();
}
这些示例展示了在使用JDBC时常见的错误和正确的做法,帮助避免资源泄露、SQL注入等安全问题,以及更合理地处理异常和事务。
还没有评论,来说两句吧...