PreparedStatement接口继承自Statement接口,PreparedStatement比普通Statement对象使用起来更加灵活更有效率.并且比Statement更加安全,因为Statement有一个漏洞就是可以sql注入
第一步:创建PreparedStatement对象
PreparedStatement pstm 同样是通过Connection的preparedStatement(sql)方法来创建对象,sql语句可具有一个或者多个输入参数,这些输入参数的值在SQL语句创建时未被指定,而是为每个输入参数保留一个问号'?'作为占位符;
示例:
下面的创建语句中就带有3个输入参数的SQL语句 pstm=con.prepareStatement("update dog set health=?,love=? where id =?");
第二步:设置每个输入参数的值
通过调用set*()方法来完成(*代表数据类型)
代码:
pstm.setInt(1,10);
pstm.setInt(2,90);
pstm.setString(3,"d1");
(注意事项:占位符位置从1开始)
第三步:执行SQL语句
执行方法与Statement一样.比如:pstm.executeUpdate();
优点: 创建PreparedStatement对象时会对SQL语句进行预编译,所以执行速度要快于Statement对象,因此,如果程序中存在需要多次执行SQL语句时,应该使用PreparedStatement对象来执行数据库操作,以提高效率
示例:
String sql="update dog set health=?,love=? where id =?";
pstm=con.prepareStatement(sql);
pstm.setInt(1,10);
pstm.setInt(2,90);
pstm.setString(3,"d1");
pstm.executeUpdate();
pstm.setInt(1,22);
pstm.setInt(2,33);
pstm.setString(3,"d2");
pstm.executeUpdate();
总结:
PreparedStatement比Statement好在哪里?
1:提高了代码的可读性和可维护性
虽然使用PreparedStatement来代替Statement会多几行代码,但避免了繁琐麻烦又容易出错的SQL语句凭借,提高了代码的可读性和可维护性
2:提高了SQL语句执行的性能
创建Statement对象时不使用SQL语句做参数,不会解析和编译SQL语句,每次调用方法执行SQL语句时都要进行SQL语句解析和编译操作,即操作相同仅仅的数据不同.
创建PreparedStatement对象时使用SQL语句做参数,会解析和编译该SQL语句,也可以使用带占位符的SQL语句做参数,在通过set*(
)方法给占位符赋值后执行SQL语句时无需再次解析和编译SQL语句,直接执行即可,多次执行相同操作可以大大提高性能