PreparedStatement是Statement的子接口,相比Statement,PreparedStatement具备更高的效率以安全性,使用Statement时,其原理为先创建对象,然后将sql语句发送到数据库执行,这个过程中可将用户输入的数据拼接到sql语句中,存在sql注入风险;因此使用PreparedStatement替代Statement成为了一个选择,PreparedStatement具备预编译功能,其首先对sql语句进行预编译,然后再将值填充到对应占位符处,从而有效避免了sql注入的风险。
PreparedStatement用法如下:
String sql = "select * from tbuser where username=? and password=?";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test",
"root",
"root");
// stmt = conn.createStatement();
// ResultSet rs = stmt.executeQuery(sql);
//获取sql语句的预编译命令(安全性方面保障,防止sql注入)
ps = conn.prepareStatement(sql);
//预处理,为占位符填充具体值
ps.setString(1, name);
ps.setString(2, pwd);
ResultSet rs = ps.executeQuery();
if(rs.next()){
System.out.println("登录成功!");
}else{
System.out.println("登录失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(ps != null){
ps.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}