Statement

Statement是Java运行数据库操作的一个重要方法。用于在已经建立数据库连接的基础上。向数据库发送要运行的SQL语句。Statement对象,用于运行不带參数的简单SQL语句。用于运行静态
SQL 语句并返回它所生成结果的对象。

在默认情况下,同一时间每一个 Statement对象在仅仅能打开一个
ResultSet对象。因此,假设读取一个 ResultSet对象与读取还有一个交叉。则这两个对象必须是由不同的 Statement对象生成的。

假设存在某个语句的打开的当前 ResultSet对象,则
Statement接口中的全部运行方法都会隐式关闭它。

Statement对象用于将 SQL语句发送到数据库中。

实际上有三种
Statement对象,它们都作为在给定连接上运行 SQL语句的包容器:Statement、PreparedStatement(它从
Statement继承而来)和 CallableStatement(它从 PreparedStatement继承而来)。它们都专用于发送特定类型的 SQL语句:Statement对象用于运行不带參数的简单
SQL语句;PreparedStatement对象用于运行带或不带 IN參数的预编译 SQL语句;CallableStatement对象用于运行对数据库已存在的存储过程的调用。

Statement接口提供了运行语句和获取结果的基本方法。

PreparedStatement接口加入了处理
IN參数的方法;而CallableStatement加入了处理 OUT參数的方法。

PrepareStatement

PreparedStatement对象已预编译过,所以其运行速度要快于
Statement对象。因此。多次运行的 SQL语句常常创建为 PreparedStatement对象。以提高效率。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的全部功能。另外它还加入了一整套方法,用于设置发送给数据库以代替 IN 參数占位符的值。

CallableStatement

CallableStatement对象为全部的DBMS 提供了一种以标准形式调用已储存过程的方法。已储 存过程储存在数据库中。对已储存过程的调用是CallableStatement对象所含的内容。

这样的调用是
用一种换码语法来写的,有两种形式:一种形式带结果參,还有一种形式不带结果參数。结果參数是 一种输出(OUT) 參数。是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 參数)、 输出(OUT 參数)或输入和输出(INOUT參数)的參数。问号将用作參数的占位符。

Statement 或 PrepareStatement?

通过读其它人的代码。能够看到用的大部分都是PrepareStatement。PrepareStatement 运行的是预编译语句,预编译语句在被DB的编译器编译后的运行代码被缓存下来。那么下次调用时仅仅要是同样的预编译语句就不用在编译了,对多次插入但数据不同的情况下,使用PrepareStatement能提高非常大的性能。

万条数据耗费时间:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2xpeDFhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

万条数据耗费时间:

安全性是PrepareStatement的非常大的优势,使用PrepareStatement能尽可能提高数据库的安全性。

大家应该都知道sql注入;採用拼串的方式拼的sql语句存在被sql注入的风险。而假设使用预编译语句.则传入的不论什么内容就不会和原来的语句发生不论什么匹配的关系。安全性就有了非常高的提升。

总结

尽管PrepareStatement较Statement有非常多的优点。可是Statement并非一无是处的。假设插入的sql语句不固定。也没有什么规律那么用PrepareStatement在性能上也没有什么优势。存在即有一定的合理性。所以我们应该依据情况选择合适的方式。

最新文章

  1. 浏览器-08 chromium 渲染2
  2. Spring操作指南-IoC基础环境配置(基于XML)
  3. _beginthreadex注意事项
  4. toad的基本操作
  5. 如何遍历HashMap
  6. java数学函数库 API(转)
  7. EntityFramework系列:MySql的RowVersion
  8. 【原创】Kakfa log包源代码分析(二)
  9. 单机最大tcp连接数
  10. Lesson: Introduction to JAXP
  11. setTimeout 虚假的“异步”
  12. OC之方法的声明实现和调用
  13. init.rc语法介绍
  14. HBase 索引创建
  15. 二、添加 Insert into
  16. 如何使用微信小程序云函数发送短信验证码
  17. 【转】Python之装饰器
  18. 【翻译】给初学者的 Neural Networks / 神经网络 介绍
  19. Linux 下 less 命令
  20. 【转】Grafana系列教程–Grafana基本概念

热门文章

  1. Linux管道符、重定向与环境变量
  2. js向标签中添加文本或其他的简例
  3. python 复习 4-1 函数、参数、返回值、递归
  4. ATL CLR MFC Win32 常规 的区别
  5. 无向图Tarjan&&求树直径
  6. PHP实现innodb的数据回滚
  7. 【转】巧用局部变量提升javascript性能
  8. 让webstorm 识别vue cli3项目中的@路径别名
  9. Django+ openpyxl 导出文件,设置表头/内容格式
  10. HDU 5969 最大的位或【贪心/按位或/思维】