Statement定义了sql执行语句的基本接口,只能执行单条不带参数的sql语句,每次执行都需要解析。PrepareStatement继承自Statement,定义大量的setter方法用于设置sql的参数,因此PrepareStatement是支持动态传参的;另外PrepareStatement内部存储了解析的sql,可以多次执行而无需重复解析。CallableStatement继承自PrepareStatement,用于支持存储过程。
-
Statement
接口可分为四类:
- executeQuery
- executeUpdate
- execute
- Batch
executeQuery
执行一条固定的sql查询语句,且不能PrepareStatement、CallableStatement不能调用。
executeUpdate
可执行数据库增、删、改sql语句,还可以执行数据库DDL(数据库创建等)语句。对于增、删、改返回受影响的行数,对于DDL返回0.
execute
在sql语句返回多个结果集(ResultSet)、或多个更新计数时,使用execute。
Batch
Batch类别接口包含了:
void addBatch( String sql ) throws SQLException;
void clearBatch() throws SQLException;
int[] executeBatch() throws SQLException;
用于批量执行sql。
使用的时候,先调用clearBatch清空历史batch命令,然后调用addBatch添加要执行的sql,最后executeBatch批量执行。
PrepareStatement
PrepareStatement用于支持传参sql语句,并且能防止sql注入。setter方法支持各类参数传入,第一个参数为参数index,下标从1开始。PrepareStatement还支持流参数输入(setAsciiStream等),当数据库列字段为大文本、或者文件时,流传输更高效。CallableStatement
继承自PrepareStatement,用于支持存储过程。
存储过程是数据库中定义的一个特定名称的sql命令集合,存储的输出需要在执行前调用registerOutParameter声明。