Java JDBC 代码优化:使用 PreparedStatement 防止 SQL 注入
Java JDBC 代码优化:使用 PreparedStatement 防止 SQL 注入
这段代码展示了如何使用 PreparedStatement 来优化 Java JDBC 代码,防止 SQL 注入,并提高代码可读性和安全性。
原始代码:
try {
Class.forName(JDBC_DRIVER); // 注册 JDBC 驱动
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
String sql = 'SELECT * FROM rule_kv where model=' + '' + model + '' + ' AND device_name=' + '' + devicename + ''';
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while (rs.next()) {
// 通过字段检索
operation = rs.getString('operation');
defaultvalue = rs.getDouble('defaultvalue');
operation_num = rs.getInt('operation_num');
// System.out.println('operation:'+operation+' defaultvalue:'+defaultvalue+' operation_num:'+operation_num);
//判断是否超标产生告警的
ModelNumInfor(operation, property, defaultvalue, value);
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
优化后的代码:
try {
Class.forName(JDBC_DRIVER); // 注册 JDBC 驱动
String sql = 'SELECT * FROM rule_kv WHERE model = ? AND device_name = ?';
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, model);
stmt.setString(2, devicename);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String operation = rs.getString('operation');
double defaultvalue = rs.getDouble('defaultvalue');
int operation_num = rs.getInt('operation_num');
ModelNumInfor(operation, property, defaultvalue, value);
}
}
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
优化说明:
- 使用 PreparedStatement 代替 Statement,可以有效防止 SQL 注入攻击。
- 通过占位符
?代替直接拼接字符串的方式构建 SQL 语句,提高代码可读性和安全性。 - 使用 try-with-resources 语句,确保数据库资源能够及时释放。
总结:
使用 PreparedStatement 是 Java JDBC 代码优化的重要手段,可以有效提高代码的安全性、可读性和可维护性。建议在开发 Java 数据库应用时,优先使用 PreparedStatement 来构建 SQL 语句。
原文地址: https://www.cveoy.top/t/topic/nbhf 著作权归作者所有。请勿转载和采集!