PreparedSatement是Statement的一个子接口。是SQL预处理执行对象。
使用PreparedStatement有以下特点: - PreparedStatement用于多次执行SQL语句。 - PreparedStatement接口在运行时接受输入参数。 - PreparedStatement接口扩展了Statement接口。 - 我们可以为PreparedStatement动态提供参数。
PreparedStatement常用方法与Statement完全相同。
1.PreparedStatement执行查询语句
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "";
ResultSet rs = null;
try {
conn = DBUtils.getConnection();
sql = "select * from students where sid = ?";
//1.创建语句对象
pstmt = conn.prepareStatement(sql);
//2.传参数
pstmt.setInt(1,3); //注意,第一个参数下标从1开始
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println("学号:" + rs.getInt("sid") + "姓名:" + rs.getString("sname"));
}
} catch (Exception ex) {
ex.printStackTrace();
}
finally{
}
2.PreparedStatement执行更新语句
实例,一次插入多条学生记录。
class Students{
private String sname;
private String gender;
public Students() {
}
public Students(String sname, String gender) {
this.sname = sname;
this.gender = gender;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Students{" +
"sname='" + sname + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
public class PreparedStatementDemo {
public static List<Students> studentsList = new ArrayList<Students>();
private static PreparedStatement pstmt = null;
public static void initStudentsList(){
for(int i=1;i<=10;i++){
Students s = new Students("张"+i,"男");
studentsList.add(s);
}
}
public static void main(String[] args) {
initStudentsList();
Connection conn = null;
String sql = "";
ResultSet rs = null;
try {
conn = DBUtils.getConnection();
sql = "insert into students (sname,gender) values (?,?)";
//1.创建语句对象
pstmt = conn.prepareStatement(sql);
studentsList.forEach(s->{
try {
pstmt.setString(1, s.getSname());
pstmt.setString(2,s.getGender());
pstmt.executeUpdate();
}catch(Exception ex){
ex.printStackTrace();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
finally{
//释放资源
}
}
}
3.Statement与PreparedStatement的区别
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。
总结PreparedStatement的优点:
1)效率高. 使用PreparedStatement执行SQL命令时,命令会被数据库编译和解析,并放到命令缓冲区.以后每当执行同一个PreparedStatement对象时,预编译的命令就可以重复使用
2)代码可读性和可维护性好。
3)安全性好. 使用PreparedStatement可以防止SQL注入.
SQL注入,例如如下代码,可以绕过登录查询所有用户资料:
select * from user where name = ‘aa’ and password = ‘bb’ or 1=1