国庆节10月1日
--


基于JDBC实现数据库查询操作,包括预编译SQL、ResultSet解析与SQL注入防护。
JDBC查询操作通过 PreparedStatement 执行 SELECT 语句,返回 ResultSet 结果集,遍历解析后获取数据。
1// 1. 获取连接2Connection conn = DriverManager.getConnection(3 "jdbc:mysql://localhost:3306/web", "root", "1234");4
5// 2. 创建预编译的PreparedStatement对象6PreparedStatement pstmt = conn.prepareStatement(7 "SELECT * FROM user WHERE username = ? AND password = ?");8
9// 3. 设置参数10pstmt.setString(1, "daqiao");11pstmt.setString(2, "123456");12
13// 4. 执行查询14ResultSet rs = pstmt.executeQuery();15
16// 5. 处理结果集17while (rs.next()) {18 int id = rs.getInt("id");19 String username = rs.getString("username");20 String password = rs.getString("password");21 String name = rs.getString("name");22 int age = rs.getInt("age");23}24
25// 6. 关闭资源26rs.close();27pstmt.close();28conn.close();1@ParameterizedTest2@CsvSource({"daqiao,123456"})3public void testJdbc(String _username, String _password) throws Exception {4 Connection conn = DriverManager.getConnection(5 "jdbc:mysql://localhost:3306/web", "root", "1234");6 PreparedStatement pstmt = conn.prepareStatement(7 "SELECT * FROM user WHERE username = ? AND password = ?");8 pstmt.setString(1, _username);9 pstmt.setString(2, _password);10 ResultSet rs = pstmt.executeQuery();11 while (rs.next()) {12 // 解析结果...13 }14 rs.close();15 pstmt.close();16 conn.close();17}1<dependency>2 <groupId>mysql</groupId>3 <artifactId>mysql-connector-java</artifactId>4 <version>8.0.30</version>5</dependency>6<dependency>7 <groupId>org.junit.jupiter</groupId>8 <artifactId>junit-jupiter</artifactId>9 <version>5.9.3</version>10 <scope>test</scope>11</dependency>ResultSet(结果集对象)封装了DQL查询语句查询的结果。
| 方法 | 说明 |
|---|---|
next() | 将光标从当前位置向前移动一行,返回 true(有效行)/ false(无效行) |
getXxx(列编号) | 按列索引获取数据 |
getXxx("列名") | 按列名获取数据(推荐) |
解析步骤:光标初始指向第0行 → 每次 next() 前移一行 → 有数据则用 getXxx 取值。
| 风格 | 示例 | 特点 |
|---|---|---|
| 静态SQL | "SELECT * FROM user WHERE username = 'daqiao'" | 参数硬编码,不安全 |
| 预编译SQL | "SELECT * FROM user WHERE username = ?" | 参数动态传递,推荐 |
SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
典型攻击输入:密码输入 ' or '1' = '1,拼接后SQL变为:
1SELECT * FROM user WHERE username = 'xxx' AND password = '' or '1' = '1'or '1'='1' 恒为真,导致绕过登录验证。
预编译SQL将 ' or '1'='1 整体作为字符串参数处理(转义为普通字符串),而非SQL逻辑的一部分,从而杜绝SQL注入。
预编译SQL在数据库端可缓存执行计划,同一SQL模板多次执行时性能更高。
PreparedStatement),禁止直接拼接SQL字符串。ResultSet、PreparedStatement、Connection 使用完毕后必须关闭,推荐使用 try-with-resources。executeQuery(),返回 ResultSet。如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


