使用预编译对象PreparedStatement对象作为"数据库的执行对象"
如:
String sql = "insert into emploee(name,age,gender,address,salary) values(?,?,?,?,?)" ;
//通过连接对象获取预编译对象PreparedStatement
//Connection---->PreparedStatement prepareStatement(String sql) throws SQLException
//将参数化的sql发送给数据库,并且存储到PreparedStatement对象中
PreparedStatement ps = connnection.prepareStatement(sql);
//PreparedStatement预编译对象中,需要给 ? (占位符号)进行赋值
//通用方法:void setXxx(int parameterIndex, Xxx x) :给占位符号赋值,
//参数1:第几个占位符号(从1开始)
//参数2:实际参数
ps.setString(1,"亓桑") ;
ps.setInt(2,20);
ps.setString(3,"男");
ps.setString(4,"西安市") ;
ps.setDouble(5,10000.00) ;
执行查询语句时,使用get方法
//执行查询
//ResultSet executeQuery() :DQL语句
ResultSet rs = ps.executeQuery();
while (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
String address = rs.getString("address");
double salary = rs.getDouble("salary");
System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+address+"\t"+salary);
}
Statement和PreparedStatement的对比
Statement每一次需要将静态化的sql进行发送给数据库,写好一条sql,发送一次
PreparedStatement将编译参数化的sql(占位符号?)发送给数据库,数据库会校验它的索引值以及对应的类型,将sql保存到预编译对象中,预编译可以赋值不同的参数,执行对应的sql,执行效率相对于Statement高很多.
Statement对象发送的sql属于静态语句,存在硬编码,而且还有字符串拼接,会造成sql注入,相对不安全
preparedStatement 发送的是参数化的sql,不存在字符串拼接,不会造成sql注入,相对安全