`
cynhafa
  • 浏览: 155062 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC中的PreparedStatement相比Statement的好处有哪些?

 
阅读更多
1、相对比较安全,可以防止sql注入
2、有预编译功能,相同操作批量数据效率较高


PreparedStatement 是预编译 ,使用Statement时 sql 中要进行很多的单引号拼接字符串,首先是容易出错也比较麻烦,还有就是存在sql 注入问题这是从安全方面说的。 PreparedStatement  传参数时候用 了占位符 “?”很好的解决了以上Statement的问题。我所体会到得的就是这些。 


PreparedStatement是在执行前先输入sql语句,Statement正好相反,是在执行的时候传入sql语句的。
这样的区别在于,PreparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率。
Statement,就没有以前所说的功能了,我一般很少用 



JDBC PreparedStatement 批量更新数据注意的问题

PreparedStatement 批量更新数据可以提升程序执行效率,缩短程序运行时间,但是在实际工作中运用时,发现要注意以下几个问题:

系统环境:
JDK1.6.0_21
Oracle10g
Eclipse3.6.1

用到的jar包:
ojdbc6.jar
commons.logging-1.1.1.jar
commons-dbcp-1.4.jar
commons-pool-1.5.5.jar
commons-collections-3.2.1.jar
log4j-1.2.6.jar
spring2.5.6.jar

(1)虽然是批量提交,但当数据量大时应该将提交设置为每500次已提交(更具具体情况而定),这么干的好处可以节约内存资源,至少不会因为内存不够用而报内存溢出的异常,在有就是可以加快数据库的执行效率。
(2)connect.commit()后connect可能会被关闭,需要再次开启

事例代码如下:

Java代码 收藏代码
  1. staticLoggerlog=Logger.getLogger(UpdateLog.class);
  2. staticfinalintCOMMIT=500;//每500条记录一提交
  3. Connectionconnect=null;
  4. PreparedStatementpstmt=null;
  5. Stringstrsql=null;
  6. **
  7. *办公用品结款
  8. *@paramsupid
  9. *@paramrows
  10. *@paramjg_je
  11. *@params_je
  12. *@paramcpid
  13. */
  14. publicvoidULogOffice(intsupid,introws,doublejg_je,doubles_je,List<CPInfoData>cpid){
  15. introwsTmp=0;
  16. try{
  17. connect=DBConn.getConnection();//打开一个池连接
  18. connect.setAutoCommit(false);
  19. //第一步:更新t_supplier_log表
  20. strsql="INSERTINTOt_bi_supplier_logVALUES(?,sysdate,?,?,?,0,'首次','办公厨房','SYSTEM','ONE')";
  21. insertInfo(supid,rows,jg_je,s_je);
  22. //第二步:更新syn_provid_psjh_mx表中lb1为40
  23. strsql="UPDATEsyn_provid_psjh_mxSETlb1='40'"+
  24. "WHEREjhdate=?ANDsup_id=?ANDlb=?ANDrkdh=?ANDjkdateisnull";
  25. if(cpid.size()!=0){
  26. for(CPInfoDatacpInfoData:cpid){
  27. //门店用sup_id、jhdate、lb、id确定唯一一条记录
  28. pstmt=connect.prepareStatement(strsql.toString());
  29. pstmt.setDate(1,Date.valueOf(cpInfoData.getJhdate().substring(0,10)));
  30. pstmt.setInt(2,supid);
  31. pstmt.setString(3,cpInfoData.getLb());
  32. pstmt.setString(4,cpInfoData.getDh().trim());
  33. pstmt.addBatch();
  34. if(rowsTmp%COMMIT==0){//每500条记录一提交
  35. pstmt.executeBatch();
  36. connect.commit();
  37. if(null==connect){//如果连接关闭了就在创建一个为什么要这样原因是conn.commit()后可能conn被关闭
  38. connect=DBConn.getConnection();
  39. connect.setAutoCommit(false);
  40. }
  41. }
  42. rowsTmp++;
  43. }
  44. pstmt.executeBatch();
  45. connect.commit();
  46. }
  47. connect.setAutoCommit(true);
  48. log.info("ULogOffice办公用品["+supid+"]数据库更新完毕");
  49. }catch(Exceptione){
  50. try{
  51. connect.rollback();
  52. log.info("ULogOffice办公用品["+supid+"]数据库更新异常-回滚["+e.getMessage()+"]");
  53. }catch(SQLExceptione1){
  54. e1.printStackTrace();
  55. }
  56. e.printStackTrace();
  57. }finally{
  58. closePstmt(pstmt);
  59. closeConnection(connect);
  60. }
  61. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics