1概述
JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或者PL/SQL命令,并从数据库接收数据的方法和属性。
接口 | 使用场景 | 是否可以接收参数 |
---|---|---|
Statement | 用于对数据库进行通用访问,在运行时使用静态SQL语句时很有用。 | 不能接受参数。 |
PreparedStatement | 当计划要多次使用SQL语句时使用。 | 在运行时接受输入参数。 |
CallableStatement | 当想要访问数据库存储过程时使用。 | 可以接受运行时输入参数。 |
2 statement
使用方法
- 创建一个Statement对象
- 执行语句
- 关闭statement对象
2.1 执行语句
- boolean execute (String SQL) : 如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。可以用于执行SQL DDL语句或需要使用真正的动态SQL。
- int executeUpdate (String SQL): 返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERT,UPDATE或DELETE语句。
- ResultSet executeQuery(String SQL):返回一个ResultSet对象。例如:SELECT语句
2.2 demo
@Test
public void demo(){
Connection connection =null;
PreparedStatement preparedStatement =null;
Statement statement =null;
ResultSet resultSet =null;
try {
// 1.加载数据库驱动
Class.forName(DRIVER);
// 2.通过驱动管理获取数据库连接
connection= DriverManager.getConnection(URL,USER,PASSWORD);
String sql = "SELECT id,username FROM user";
String ddl = "CREATE TABLE Test (no1 varchar(40), no2 int(10))";
// 3.获取statement对象
statement = connection.createStatement();
// 4. 执行语句
boolean b = statement.execute(ddl);
resultSet = statement.executeQuery(sql);
System.out.println(b);
// 5 处理结果集
while (resultSet.next()){
String id = resultSet.getString("id");
String username= resultSet.getString("username");
System.out.println("id: "+id+" username: "+username);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 6 释放资源
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.3 批处理
批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互。
- 不需要JDBC驱动程序来支持此功能。应该使用DatabaseMetaData.supportBatchUpdates()方法来确定目标数据库是否支持批量更新处理,如果JDBC驱动程序支持该功能,该方法返回true。
- Statement,PreparedStatement和CallableStatement的addBatch()方法用于将单个语句添加到批处理中。executeBatch()用于执行组成批量的所有语句。
- executeBatch()返回一个整数数组,数组的每个元素表示相应更新语句的更新计数。
- 就像将批处理语句添加到处理中一样,可以使用clearBatch()方法来删除它们。此方法将删除所有使用addBatch()方法添加的语句。但是,无法指定选择某个要删除的语句。
Statement stmt = conn.createStatement();
// 1.开启事物
conn.setAutoCommit(false);
// 2 添加批处理SQL
stmt.addBatch(SQL);
// 3.执行
int[] count = stmt.executeBatch();
//4.提交事物
conn.commit();
3 prepareStatement
PreparedStatement接口扩展了Statement接口,它添加了比Statement对象更好一些优点的功能。可以动态提供/接收参数。
- JDBC中的所有参数都是由“?”符号作为占位符,这被称之为参数标记。在执行SQL语句之前,必须为每个参数(占位符)提供值。
- setXXX(int parameterIndex ,XXX x)将值绑定到参数中,parameterIndex表示参数的位置,从1开始。XXX表示要绑定到输入参数的值的Java数据类型。
- 所有Statement对象与数据库交互的方法,如execute(),executeQuery()和executeUpdate()也可以用于PreparedStatement对象。但是这些方法被修改为可以使用输入参数的SQL语句。
4 CallableStatement
用于执行对数据库存储过程的调用
存储过程
- 如果有IN参数,只需要遵循适用于PreparedStatement对象的相同规则和技术,使用与绑定的Java数据类型对应的setXXX()方法。
- 使用OUT和INOUT参数时,必须使用一个额外的CallableStatement对象方法registerOutParameter()。registerOutParameter()方法将JDBC数据类型绑定到存储过程中并返回预期数据类型。
- 当调用存储过程时,可以使用适当的getXXX()方法从OUT参数中检索该值。此方法将检索到的SQL类型的值转换成对应的Java数据类型。