下面三种方式,哪种是推荐的写法 方法一: stmt=conn.createStatement(); stmt.execute("select * from tab1 where id=" + id); 方法二: String sql="delete from jdbc_users where id=?"; pstmt=conn.prepareStatement(sql); pstmt.setInt(1, id); 方法三: String sql="delete from jdbc_users where id=" + id; pstmt=conn.prepareStatement(sql);
时间: 2024-01-22 08:01:38 浏览: 130
推荐使用方法二:
```
String sql = "delete from jdbc_users where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
```
原因如下:
1. 方法一存在SQL注入的风险,因为直接将参数拼接到SQL语句中,如果参数中包含特殊字符,就可能导致SQL注入攻击。
2. 方法二使用了预编译语句,将SQL语句和参数分开处理,更加安全,并且可以提高SQL执行的效率。
3. 方法三虽然也是将参数拼接到SQL语句中,但是与方法一不同的是,使用了预编译语句,可以避免SQL注入攻击,但是效率不如方法二。
相关问题
import java.sql.*; public class TableMonitor { public static void main(String[] args) { try { // 加载数据库驱动程序 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=GD2030", "sa", "root"); // 创建扩展事件会话 Statement stmt = conn.createStatement(); String createSessionSql = "CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE object_name = 'Client')"; stmt.execute(createSessionSql); // 启动扩展事件会话 String startSessionSql = "ALTER EVENT SESSION MyTableChanges ON SERVER STATE = START"; stmt.execute(startSessionSql); // 监听扩展事件会话 String listenSql = "SELECT * FROM sys.fn_xe_file_target_read_file('C:\\MyTableChanges.xel', null, null, null)"; PreparedStatement pstmt = conn.prepareStatement(listenSql); ResultSet rs = pstmt.executeQuery(); // 处理扩展事件 while (rs.next()) { String event = rs.getString(1); System.out.println(event); } // 关闭连接 rs.close(); pstmt.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } },把这段代码改成java8能运行,并且SQL版本是SQLSERVER2008R2
为了让这段代码能在 Java 8 运行并且连接 SQL Server 2008 R2,你需要对代码进行以下修改:
1. 更改 JDBC 驱动程序的版本:将 "com.microsoft.sqlserver.jdbc.SQLServerDriver" 更改为 "com.microsoft.sqlserver.jdbc.SQLServerDriver:sqljdbc4.0"。这是 SQL Server 2008 R2 支持的 JDBC 驱动程序版本。
2. 更改连接字符串:将连接字符串中的 SQL Server 端口号从 1433 更改为 SQL Server 2008 R2 实例的端口号。
修改后的代码如下:
```
import java.sql.*;
public class TableMonitor {
public static void main(String[] args) {
try {
// 加载数据库驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver:sqljdbc4.0");
// 连接数据库
Connection conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1434;DatabaseName=GD2030", "sa", "root");
// 创建扩展事件会话
Statement stmt = conn.createStatement();
String createSessionSql = "CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE object_name = 'Client')";
stmt.execute(createSessionSql);
// 启动扩展事件会话
String startSessionSql = "ALTER EVENT SESSION MyTableChanges ON SERVER STATE = START";
stmt.execute(startSessionSql);
// 监听扩展事件会话
String listenSql = "SELECT * FROM sys.fn_xe_file_target_read_file('C:\\MyTableChanges.xel', null, null, null)";
PreparedStatement pstmt = conn.prepareStatement(listenSql);
ResultSet rs = pstmt.executeQuery();
// 处理扩展事件
while (rs.next()) {
String event = rs.getString(1);
System.out.println(event);
}
// 关闭连接
rs.close();
pstmt.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
请注意,这个修改仅适用于 SQL Server 2008 R2 和 Java 8,如果你要连接其他版本的 SQL Server 或使用其他版本的 Java,可能需要根据实际情况进行修改。
package text9; import java.sql.*; public class BooksDatabase { private Connection conn; public BooksDatabase() { try { conn = DriverManager.getConnection("jdbc:sqlite:Books.db"); Statemen
t stmt = conn.createStatement(); String sql = "CREATE TABLE IF NOT EXISTS Books (\n" + " id integer PRIMARY KEY,\n" + " title text NOT NULL,\n" + " author text NOT NULL,\n" + " price real\n" + ");"; stmt.execute(sql); } catch (SQLException e) { System.out.println(e.getMessage()); } } }
这段代码是用来做什么的?
阅读全文