Java——对Statement、PreparedStatement、CallableStatement的理解

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

  • 有三种Statement对象:

  Statement、 PreparedStatement、 CallableStatements

  • 它们三者之间的关系
     都是接口;
    PreparedStatement是从Statement继承而来
    CallableStatement是从PreparedStatement继承而来

  • 它们都作为在给定连接上执行SQL语句的包容器;

  • 它们都专用于发送特定类型的SQL语句
    Statement对象用于执行不带参的简单SQL语句,提供了执行语句和获取语句的基本方法。
    PreparedStatement对象用于执行带IN参数或者不带IN参数的预编译SQL语句。
    CallableStatement对象用于执行对数据库已存储过程的调用,添加了处理OUT参数的方法。

1.Statement
  • 普通的不带参的查询SQL;
  • 支持批量更新,批量删除;
  • Statement 每次执行SQL语句,数据库都要执行SQL 语句的编译
    (用于仅执行一次的SQL语句,效率高于PreparedStatement)
    eg:执行2条SQL语句,则编译2次;执行1000条,就要编译1000次。
  • 创建Statement对象后,可以使用它来执行一个SQL语句,有三种执行方法。

1.boolean execute(String SQL)如果可以检索到ResultSet对象,则返回一个布尔值true;否者返回false。使用此方法执行SQLDDL语句,或需要使用真正的动态SQL,可使用于执行创建数据库,创建表的SQL语句……。

DDL:数据定义语言,用于定义和管理SQL数据库中的所有对象的语言;
DML:数据操作语言,SQL中处理数据等操作统称为数据操纵语言;
DCL:数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事物发生的时间及效果,对数据库实行监视……

2.int executeUpdate(String SQL)返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERT、UPDATE、DELETE。
3.ResultSet executeQuery(String SQL):返回一个ResultSet对象。
 (如果想要获得结果集时,用此方法。)

2.PreparedStatement
  • PreparedStatement继承了Statement的所有功能。
     (三种方法被更改使之不需要参数execute、executeQuery、executeUpdate)
     (扩展了Statement接口,可以动态的提供(或接受)参数)
  • PreparedStatement表示预编译的SQL语句对象
  • 可变参数的SQL,编译一次执行多次,效率高
     (SQL语句被预编译并存储在PreparedStatement对象中——所以其执行速度要快于Statement)
     (对于多次重复执行的语句,使用PreparedStatement效率会更高一点)
  • 安全性好,有效防止SQL注入等问题。
  • 支持批量更新、删除。
  • 代码的可读性、可维护性都要好于直接使用Statement
2.1PreparedStatement对象初级开发的几个常用方法:

1.PreparedStatement.execute()方法
(该语句可以是任何种类的SQL语句)
execute方法返回一个boolean值,以指示第一个结果的形式。必须调用getResultSet或getUpdateCount方法来检索结果,并且必须调用getMoreResults移动到任何后面的结果。
如果第一个结果是ResultSet对象,则返回true;如果第一个结果是更新计数或者没有结果,则返回false。(简单理解:如果是查询的话就返回true,如果是更新或插入的话就返回false)
2.PreparedStatement.executeQuery()方法
返回执行查询语句后得到的ResultSet结果集(!该结果集永远不能为null)
3.preparedStatement.executeUpdate()方法
返回一个int类型的值,该值代表执行INSERT、DELETE、UPDATE语句后的更新行数。
如果该值为0,则代表SQL语句没有执行成功。
4.PreparedStatement.addBatch()方法、executeBatch()方法
将一组参数添加到此PreparedStatement对象的批处理命令中。
缓存SQL语句,然后批量处理执行。
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

2.2PreparedStatement局限性(还不太了解)

对于防止SQL注入攻击,PreparedStatement不允许一个占位符(?)有多个值,这样在处理IN子句查询的时候就有一些麻烦。

3.CallableStatement

CallableStatement对象可以使用IN、OUT、IN OUT、这三个参数类型

IN 输入参数、用于接收参数,在子程序内部只读不能修改。(默认参数模式:IN)
OUT 输出参数,该值可在存储过程内部被改变,并可返回
  (OUT模式参数的最终值会赋给调用时对应的‘实参变量’)
  (OUT参数的调用必须通过变量)
IN OUT 输入输出参数,调用时指定,并可被改变和返回
  (必须用实参变量调用)

参考资料:
https://blog.csdn.net/nfzhlk/article/details/83416413
https://blog.csdn.net/qq_41668547/article/details/80717146
https://www.cnblogs.com/zy20160117/p/9480341.html
https://blog.csdn.net/hello_acm/article/details/53559062

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值