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