Statement 的执行模式采用拼凑字符串的形式,不适合处理一些敏感性字符。
PreparedStatement 执行的是一个完整的具备特殊占位标记的 SQL 语句,并且可以动态地设置所需要的数据。
使用 PreparedStatement 的优点
代码拥有更好的可读性和可维护性。
尽可能提升性能。用Statement对象时,每次执行一个 SQL 命令,都会对它进行解析编译。而使用 PreparedStatement 时,数据库会对 SQL 语句进行预编译,下次执行相同的 SQL 语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率
极大地提高了安全性。传递给 PreparedStatement 对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。从安全性上来看, PreparedStatement 是通过 ? 来传递参数的,避免了拼 sql 而出现 sql 注入的问题,所以安全性较好。
import java.sql.*;
public class Main {
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL = "jdbc:mysql://localhost:3306/TEACH?characterEncoding=utf-8&useSSL=true";
private static final String DBUSER = "root";
private static final String DBPASSWORD = "newpass";
public static void main(String[] args) throws Exception{
// 加载数据库驱动程序
Class.forName(DBDRIVER);
// 连接数据库
Connection connection = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
System.out.println(connection);
String sql = "INSERT into ELECTIVE VALUES (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"100");
preparedStatement.setString(2,"D");
preparedStatement.setString(3,"99");
preparedStatement.executeUpdate();
String sql2 = "SELECT SNO,CNO,SCORE FROM ELECTIVE";
PreparedStatement preparedStatement1 = connection.prepareStatement(sql2);
ResultSet resultSet = preparedStatement1.executeQuery();
while (resultSet.next()){
String SNO = resultSet.getString("SNO");
String CNO = resultSet.getString("CNO");
String SCORE = resultSet.getString("SCORE");
System.out.println(SNO + " " + CNO + " " + SCORE);
}
// 关闭连接
connection.close();
}
}