上一篇学习了java如何链接配置mysql,这篇学习下java如何处理sql预处理语句(PreparedStatement),首先是一个sql预处理的例子:

  1. package core;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.sql.ResultSet;
  9.  
  10. public class MethodReferencesTest {
  11.  
  12. public static void main(String[] args) throws CloneNotSupportedException {
  13. // TODO Auto-generated method stub
  14. Connection connection = null;
  15. Statement statement = null;
  16. ResultSet resultSet = null;
  17. String sqlurl = "jdbc:mysql://172.20.23.75:3306/testdb";
  18. String sqluser = "root";
  19. String sqlpassword = "123456";
  20. long starttime=System.currentTimeMillis();
  21. try {
  22. connection = DriverManager.getConnection(sqlurl, sqluser,
  23. sqlpassword);
  24. PreparedStatement prestatement = connection.prepareStatement("INSERT INTO Testing(Id) VALUES(?)");
  25. prestatement.setInt(1, 1001);
  26. prestatement.executeUpdate();
  27. } catch (SQLException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. } finally {
  31. try {
  32. if (resultSet != null) {
  33. resultSet.close();
  34. }
  35. if (statement != null) {
  36. statement.close();
  37. }
  38. if (connection != null) {
  39. connection.close();
  40. }
  41. } catch (SQLException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. System.out.println(System.currentTimeMillis()-starttime);
  46.  
  47. }
  48.  
  49. }

首先说一下prepared statement的好处。

  1. 1.因为parepared statement 相当与编译好的sql语句模板,所以当你需要运行大量结构相同但只是参数不同的sql语句时候,数据库只需要分析编译一次sql语句即可,其他的都只是参数的替换。这样可以大大提高系统运行效率。
  2.  
  3. 2.因为prepared statement的一开始用占位符来替换sql语句里面的具体参数,这样就坐到了sql语句的参数化,可以避免sql inject的情况出现。

当创建好prepared statement之后,我们就可以设置参数.

  1. prestatement.setInt(1, 1001);

然后执行sql语句

  1. prestatement.executeUpdate();

ps:这里面用executeupdate是因为我们不需要获取返回的结果,所以executeUpdate可以用到我们Create,delete,insert,update的时候。

那么prepared statement到底可以提高多少运行时间呢?可以用两个例子来比较一下:

1.老老实实用executequery

  1. connection = DriverManager.getConnection(sqlurl, sqluser,
  2. sqlpassword);
  3. statement = connection.createStatement();
  4.  
  5. for (int i = 1; i <= 1000; i++) {
  6. String query = "INSERT INTO Testing(Id) VALUES(" + 2 * i + ")";
  7. statement.executeUpdate(query);
  8. }
    //耗时 5511MS

2.用prepared statement

  1. connection = DriverManager.getConnection(sqlurl, sqluser,
  2. sqlpassword);
  3.  
  4. PreparedStatement prestatement = connection.prepareStatement("INSERT INTO Testing(Id) VALUES(?)");
  5.  
  6. for(int i=1;i<1000;i++)
  7. {
  8. prestatement.setInt(1,i*2);
  9. prestatement.executeUpdate();
  10. }
    //耗时:4123ms

所以说prepared statement还是能提升不少运行效率的。

java-mysql(2) Prepared statement的更多相关文章

  1. Java向PostgreSQL发送prepared statement 与 libpq 向PostgreSQL发送prepared statement之比较:

    Java 代码,在数据库端,并没有当成 prepared statetment 被处理. C代码通过libpq 访问数据库端,被当成了 prepared statement 处理.也许是因Postgr ...

  2. java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers及解决方案

    1. 问题 最近在项目中修bug的时候,碰到这样一个错误: Caused by: java.sql.SQLException:Prepared or callable statement has mo ...

  3. mysql 执行存储过程报错Prepared statement needs to be re-prepared

    今日思语:不喜欢再见 说再见,因为有时明知道下一次再见已是遥遥无期或是不再见 错误如下: ERROR 1615 (HY000) at line 406 in file: 'update-mysql.s ...

  4. MySQL之Prepared Statements

    1.概述 prepared statement在MySQL4.1中引进并且增加了一些新的命令: COM_STMT_PREPARE COM_STMT_EXECUTE COM_STMT_CLOSE COM ...

  5. Postgresql:prepared statement "S_1" already exists

    近期由于业务需要和一些json的存储查询需要,把新的应用切到pgsql上来,刚刚切好,是可以正常使用的,但是偶尔会来一下 java连接pgsql 偶尔出现 这个错.   org.postgresql. ...

  6. 对Prepared Statement 是否可以防止 SQL Injection 的实验

    代码: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; im ...

  7. Java-Runoob-高级教程:Java MySQL 连接

    ylbtech-Java-Runoob-高级教程:Java MySQL 连接 1.返回顶部 1. Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL ...

  8. PDO 使用prepared statement 预处理LIMIT等非表字段参数

    由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...

  9. Java 学习(22):Java MySQL 连接

    Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL 数据库. Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mys ...

随机推荐

  1. C#3 分部方法,简单标记一下

    如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象. C#3 中出现了 “分部方法” ,工 ...

  2. GridLayout网格布局

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  3. Diffie-Hellman Key Exchange – A Non-Mathematician’s Explanation

    The Complete Diffie-Hellman Key Exchange Diagram The process begins when each side of the communicat ...

  4. ubuntu grub 操作

    系统开机时,按住 shift 进入 grub 1. 什么是 Grub GNU GRUB(GRand Unified Bootloader 简称"GRUB")是一个来自GNU项目的多 ...

  5. 维纳过程(Wiener Process)与高斯过程(Gaussian Process)

    维纳过程又叫布朗运动过程(Brownian motion): 1. 维纳过程 维纳过程 Wt 由如下性质所描述: W0=1, a.s.(a.s.,almost surely)

  6. Java--ConcurrentHashMap原理分析

    一.背景: 线程不安全的HashMap     因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap.   效率低下的H ...

  7. bash实现多进程运行

    之前一段时间,发现线上日志服务器总是会突然丢失日志,碰到问题时搞的很被动.联系运维同学,又总是被往后推(后来看了一下日志归档脚本,运维同学写的bug).索性自己写了一个脚本,添加到crontab任务中 ...

  8. HTML 基础知识(特殊字符的转义)

    1. body.head(meta) <body></body>标签的常见属性: bgcolor:整个页面的背景: text:设置文本颜色 link:设置连接颜色(),vlin ...

  9. wpf中的倒影效果实现

    原文:wpf中的倒影效果实现        <TextBox Name="txt"                      FontSize="30" ...

  10. Domain adaptation:连接机器学习(Machine Learning)与迁移学习(Transfer Learning)

    domain adaptation(域适配)是一个连接机器学习(machine learning)与迁移学习(transfer learning)的新领域.这一问题的提出在于从原始问题(对应一个 so ...