PreparedStatement 和 Statement 的区别:
1.PreparedStatement在使用时只需要编译一次,就可以运行多次,Statement每运行一次就编译一次,所以PreparedStatement的效率更高
2.PreparedStatement需要的sql语句为用?(占位符)来替换值,Statement所需要的sql语句为字符串拼接
3.PreparedStatement解决了sql注入的问题,Statement没有解决,因为PreparedStatement有一个预编译的过程,
就算传入占位符的数据中有sql关键字也都被认为是值。Statement所需要的是字符串拼接,传入的整个字符串被默认为sql语句,
如果用户手动拼接了字符串,那么会导致语句的改变
public class JDBCTest04 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.load(new FileReader("src\JDBC.properties"));
String driver = pro.getProperty("driver");
String url = pro.getProperty("url");
String user = pro.getProperty("user");
String password = pro.getProperty("password");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url,user,password);
///划重点PreparedStatement/
//PreparedStatement不同于Statement,在写sql语句时,用?(占位符)来代替值,后期为占位符赋值
String sql1 = "select * from t_login where username = ?";
PreparedStatement ps = connection.prepareStatement(sql1);
//JDBC中下标都是从1开始
ps.setString(1,"123");
//在ps.setString中,sql语句就已经存在于ps中,所以在查询或者修改时不需要对其再进行赋值
ResultSet resultSet = ps.executeQuery();
///划重点Statement/
String sql2 = "select * from t_login where username = " + 123;
Statement statement = connection.createStatement();
ResultSet resultSet1 = statement.executeQuery(sql2);
///划重点//
while (resultSet1.next()){
System.out.println(resultSet1.getString("password"));
}
}
}