PreparedStatement statement = connection.prepareStatement(sql);和 Statement statement = connection.createStatement()有什么区别
时间: 2024-04-18 09:31:00 浏览: 85
PreparedStatement statement = connection.prepareStatement(sql) 和 Statement statement = connection.createStatement() 有以下区别:
1. 参数化查询:PreparedStatement 允许使用参数化查询,可以通过占位符(?)来动态设置查询参数的值。这样可以防止 SQL 注入攻击,并且提高了代码的安全性。
2. 编译查询:PreparedStatement 在创建时会将 SQL 语句编译成预编译状态,然后将其发送到数据库。这样可以提高查询的执行效率,特别是对于需要多次执行的查询语句。
3. 可读性和维护性:PreparedStatement 使得 SQL 语句与代码分离,易于阅读和维护。你可以将 SQL 语句放在一个单独的字符串中,并使用占位符来表示参数,而不需要在代码中拼接字符串。
4. 执行效率:由于 PreparedStatement 的查询语句在创建时已经编译过,所以在执行时可以直接使用预编译的语句,而 Statement 需要每次执行都进行编译,这可能导致一些性能上的差异。
综上所述,PreparedStatement 在安全性、性能和代码可读性方面都优于 Statement。除非你有特殊的需求,一般情况下建议使用 PreparedStatement。
相关问题
改正程序。 con = DriverManager.getConnection(url, user, pwd); sql = con.createStatement(); String sqlStatement; sqlStatement = "SELECT * FROM student"; PreparedStatement pstm = con.prepareStatement(sqlStatement); rs = sql.executeQuery(sqlStatement); int count =0; while(rs.next()) { count++; } rs = sql.executeQuery(sqlStatement); Object[][] info=new Object[count][6]; String []title= {"学号","姓名","出生日期","性别","专业","宿舍楼"}; count=0; while(rs.next()) { info[count][0]=rs.getString("sno"); info[count][1]=rs.getString("sname"); info[count][2]=rs.getString("sbirth"); info[count][3]=rs.getString("ssex"); info[count][4]=rs.getString("sclass"); info[count][5]=rs.getString("saddress"); count++; }
改正后的程序如下:
```
con = DriverManager.getConnection(url, user, pwd);
String sqlStatement;
sqlStatement = "SELECT * FROM student";
PreparedStatement pstm = con.prepareStatement(sqlStatement);
rs = pstm.executeQuery();
int count = 0;
while(rs.next()) {
count++;
}
rs.beforeFirst();
Object[][] info = new Object[count][6];
String[] title = {"学号", "姓名", "出生日期", "性别", "专业", "宿舍楼"};
count = 0;
while(rs.next()) {
info[count][0] = rs.getString("sno");
info[count][1] = rs.getString("sname");
info[count][2] = rs.getString("sbirth");
info[count][3] = rs.getString("ssex");
info[count][4] = rs.getString("sclass");
info[count][5] = rs.getString("saddress");
count++;
}
```
修改的内容如下:
1. 将原来的 `sql` 对象改为 `pstm` 对象,并使用 `executeQuery()` 方法执行查询语句。
2. 在第一个 `while` 循环中统计查询结果的行数,并使用 `beforeFirst()` 方法将结果集指针返回到第一行。
3. 在第二个 `while` 循环中遍历查询结果,并将每行数据存储到 `info` 数组中。
public void deleteStudent(String name) { //实现删除学生的代码 SQL bd=new SQL(); Connection conn=bd.getConn(); try { nam = name; Statement stmt = conn.createStatement(); // 创建Statement对象 String sql = "delete from students where name=?;"; // 要执行的SQL // 使用占位符,避免SQL注入攻击 PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, nam); ps.executeUpdate(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace();
这段代码实现了删除学生的功能,通过传入学生姓名name,然后在数据库中查找到相应的学生记录,使用SQL语句进行删除操作。
具体实现步骤如下:
1. 首先创建一个SQL对象,获取数据库连接。
2. 接着通过传入的学生姓名name,使用SQL语句查询到要删除的学生记录,这里使用了占位符的方式,避免SQL注入攻击。
3. 创建PreparedStatement对象,将占位符替换成实际参数。
4. 调用executeUpdate()方法,执行删除操作。
5. 最后关闭Statement对象和数据库连接。
需要注意的是,如果这段代码在一个GUI界面中,需要将其封装在一个事件监听器中,当用户点击删除按钮时,调用该方法实现删除操作。同时,为了避免意外删除操作,最好要求用户再次确认是否要删除该学生记录。
阅读全文