目录
JBDC建立
获得PrepareStatement执行sql语句
形式:
PrepareStatement中的方法:
实例
PreparedStatement和Statement
基于以下的原因:
JBDC建立
获得PrepareStatement执行sql语句
在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数
形式:
- PrepareStatement ps = connection.prepareStatement(sql);
PrepareStatement中的方法:
- Int executeUpdate()
- 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数
- 用于执行ddl语句返回0 用于执行dml语句返回操作的行数
- ResultSet executeQuery();
- 用于执行查询语句 返回一个ResultSet 集合、
- close()
- 关闭与数据库的链接通道
- 每次操作完成后关闭所有与数据库交互的通道
- 使用ResultSet中的next()方法获得下一行数据
- 使用getXXX(String name)方法获得值
实例
public class demo5 {
public static void main(String[] args) {
ArrayList<Student> students = null;
try {
students = demo5.findStudentByGender("女");
System.out.println(students);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static ArrayList<Student> findStudentByGender(String gender) throws SQLException {
ArrayList<Student> 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;
}
}
PreparedStatement和Statement
基于以下的原因:
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对象,查询结果就封装在此对象中.