关于java判断sql是否执行成功

本文深入探讨了SQL语句的使用,包括PrepareStatement的执行及其返回值理解,以及利用select @@rowcount获取影响记录的行数。内容涵盖数据库操作的基础知识与高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一。PrepareStatement.executeUpdate();看它的返回值 1成功 0失败;

    二。select @@rowcount  返回影响记录的行数




  

### JavaSQL 注入检测工具类的实现方式 为了防止 SQL 注入攻击,Java 开发者可以通过构建一个专门的工具类来过滤潜在危险的输入。这种工具类通常会结合正则表达式或其他字符串操作技术,识别并移除可能引发 SQL 注入的关键字或特殊字符。 以下是基于现有引用内容以及常见实践的一种实现方案: #### 使用 `StringEscapeUtils` 处理 SQL 输入 Apache Commons Lang 提供了一个名为 `StringEscapeUtils` 的实用工具类,能够有效转义 SQL 特殊字符。通过调用其静态方法 `escapeSql()` 可以确保传入数据库的参数不会包含恶意代码[^2]。 ```java import org.apache.commons.lang3.StringEscapeUtils; public class SqlInjectionPrevention { public static String escapeInput(String input) { if (input == null) { return ""; } return StringEscapeUtils.escapeSql(input); } public static void main(String[] args) { System.out.println(escapeInput("1' OR '1'='1; DROP TABLE test")); } } ``` 上述代码展示了如何利用第三方库 Apache Commons 来保护应用程序免受简单的 SQL 注入威胁。 #### 自定义关键字过滤器 如果希望进一步增强安全性,则可以创建自定义的方法来扫描用户提交的数据流,并剔除任何可疑模式。下面是一个基本示例,其中列举了一些常见的 SQL 关键词作为黑名单项[^4]: ```java import java.util.Arrays; import java.util.List; public class CustomSqlFilter { private static final List<String> BLACKLIST_KEYWORDS = Arrays.asList( "DROP", "DELETE", "INSERT INTO", "UPDATE", "--", ";" ); /** * Filters out potentially harmful keywords from the given string. * * @param rawInput The unfiltered user input. * @return A sanitized version of the original text. */ public static String cleanSqlKeyWords(String rawInput) { if (rawInput == null || rawInput.isEmpty()) { return ""; } String result = rawInput.toUpperCase(); for (String keyword : BLACKLIST_KEYWORDS) { result = result.replace(keyword, ""); } return result.trim(); // Remove leading/trailing whitespace after replacements. } public static void main(String[] args) { String userInput = "SELECT username FROM users WHERE id=1 UNION ALL SELECT password"; System.out.println(cleanSqlKeyWords(userInput)); } } ``` 这种方法虽然简单易懂,但在实际应用中可能存在漏网之鱼或者误报情况,因此建议仅将其视为辅助措施而非唯一防线。 #### 结合 PreparedStatement 技术 除了单独依赖于外部验证机制外,强烈推荐始终优先采用预编译语句 (`PreparedStatement`) 执行动态查询任务。这种方式从根本上杜绝了拼接原始字符串所带来的风险,因为所有的变量都会被自动处理成合适的格式再传递给底层引擎执行[^1]。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class SafeQueryExample { public static void safeRetrieveData(Connection conn, int userId) throws Exception { try (PreparedStatement pstmt = conn.prepareStatement("SELECT name, email FROM users WHERE id=?")) { pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.printf("%s (%s)%n", rs.getString("name"), rs.getString("email")); } } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } public static Connection getConnection() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/testdb?useSSL=false", "root", "password"); } public static void main(String[] args) throws Exception { try (Connection connection = getConnection()) { safeRetrieveData(connection, 789); // Replace with actual ID value provided by end-user. } } } ``` 以上片段说明了即使面对复杂场景下也能保持良好表现的最佳做法之一——即充分利用 JDBC API 内置功能完成必要的防护工作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值