目录
JBDC建立
获得PrepareStatement执行sql语句
形式:
PrepareStatement中的方法:
实例
PreparedStatement和Statement
基于以下的原因:
在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数
public class demo5 {
public static void main(String[] args) {
ArrayList students = null;
try {
students = demo5.findStudentByGender("女");
System.out.println(students);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static ArrayList findStudentByGender(String gender) throws SQLException {
ArrayList students = new ArrayList<>();//用来封装查询到的多个学生对象
Connection connection = JDBCUtil.getConnection();
PreparedStatement ps = connection.prepareStatement("select id,num,name,gender,birthday,phone,regtime from student where gender = ?");
ps.setObject(1, gender);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()){
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setNum(resultSet.getInt("num"));
student.setName(resultSet.getString("name"));
student.setGender(resultSet.getString("gender"));
student.setBirthday(resultSet.getDate("birthday"));
student.setRegtime(resultSet.getTimestamp("regtime"));
students.add(student);
}
resultSet.close();
ps.close();
connection.close();
return students;
}
}
1、代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读 性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
2、最重要的一点是极大地提高了安全性. 防止sql注入
Stringsql=“ delete from user where id = ”+num;
如果我们把[or 1=1]作为id传入进来? delete from tb_name where id = 1 or 1 = 1; 因为1=1肯定成立 而如果使用预编译语句.
你传入的任何内容就不会和原来的语句发生任何匹配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
PreparedStatement和Statement中的executeQuery()方法中会返回一个 ResultSet对象,查询结果就封装在此对象中.