三、Statement
接口
Statement接口概述
Statement接口是Java JDBC API中的一个核心接口,用于执行SQL语句。它是java.sql.Statement接口的一部分,提供了执行SQL语句的基本功能。通常与Connection对象一起使用,以执行SQL查询、更新等操作。
Statement接口的主要作用是执行SQL语句,并获取结果集(如果是查询语句)。提供了以下几种方法来执行SQL语句:
-
execute:执行任意类型的SQL语句
-
executeQuery:仅执行select查询语句,并返回结果集
-
executeUpdate:执行insert、update、delete语句,并返回受影响的行数
// 使用的方法
// 创建Statement对象
// 创建Statement对象需要先有一个Connection对象
Statement st = conn.createStatement();
// 执行SQL查询并获取结果集
ResultSet rs = st.executeQuery("select * from users");
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
// 执行SQL更新并获取受影响的行数
int rows = st.executeUpdate("insert into users(name,age) values ('tom', 30)");
System.out.println(rows + " row(s) inserted.");
Java源码:
// Statement接口位于java.sql包中,定义了执行SQL语句的方法,,以下是Statement接口的部分源码
public interface Statement extends Wrapper, SQLData, SQLXML {
// 执行任意类型的 SQL 语句
ResultSet executeQuery(String sql) throws SQLException;
// 执行 SQL 更新
int executeUpdate(String sql) throws SQLException;
// 执行任意类型的 SQL 语句
boolean execute(String sql) throws SQLException;
// 获取结果集元数据
ResultSetMetaData getMetaData() throws SQLException;
// 获取当前结果集
ResultSet getResultSet() throws SQLException;
// 获取当前更新计数
int getUpdateCount() throws SQLException;
// 获取当前警告
SQLWarning getWarnings() throws SQLException;
// 清除警告
void clearWarnings() throws SQLException;
// 更多方法...
}
源码中核心方法的解析:
-
ResultSet executeQuery(String sql)
-
作用:执行select查询语句,并返回结果集
-
参数:sql是SQL查询语句
-
返回值:ResultSet对象,包含查询结果
-
抛出异常:
SQLException
。
-
-
int executeUpdate(String sql)
-
作用:执行insert、update、delete语句,并返回受影响的行数
-
参数:sql是SQL更新语句
-
返回值:受影响的行数
-
抛出异常:
SQLException
。
-
-
boolean execute(String sql)
-
作用:执行任意类型的SQL语句,并返回一个布尔值,指示是否返回结果集
-
参数:sql是SQL语句
-
返回值:如果返回结果集,则返回true;否则返回false
-
抛出异常:
SQLException
。
-
-
ResultSetMetaData getMetaData()
-
作用:获取当前结果集的元数据
-
返回值:ResultSetMetaData对象,包含结果集的元数据信息
-
抛出异常:
SQLException
。
-
-
ResultSet getResultSet()
-
作用:获取当前的结果集
-
返回值:当前的ResultSet对象
-
抛出异常:
SQLException
。
-
-
int getUpdateCount()
-
作用:获取当前的更新计数。
-
返回值:当前的更新计数。
-
抛出异常:
SQLException
。
-
-
SQLWarning getWarnings()
-
作用:获取当前的警告信息。
-
返回值:
SQLWarning
对象,包含警告信息。 -
抛出异常:
SQLException
。
-
-
void clearWarnings()
-
作用:清除当前的警告信息。
-
抛出异常:
SQLException
。
-
Statement接口的实现
在实际JDBC驱动中,Statement接口的具体实现是由具体的数据库驱动提供的。例如,在MySQL的JDBC驱动中,Statement接口的具体实现类为com.mysql.jdbc.StatementImpl
。
// 以下是MySQL JDBC驱动中的statementImpl类的部分源码
public class StatementImpl implements Statement {
// 构造方法
public StatementImpl(Connection connection, int resultSetType, int resultSetConcurrency, int resultSetHoldability) {
super(connection, resultSetType, resultSetConcurrency, resultSetHoldability);
}
// 执行 SQL 查询
@Override
public ResultSet executeQuery(String sql) throws SQLException {
// 调用底层实现
return this.executeWithFlags(sql, Statement.EXECUTE_QUERY);
}
// 执行 SQL 更新
@Override
public int executeUpdate(String sql) throws SQLException {
// 调用底层实现
return this.executeUpdateWithFlags(sql, Statement.EXECUTE_UPDATE);
}
// 执行任意类型的 SQL 语句
@Override
public boolean execute(String sql) throws SQLException {
// 调用底层实现
return this.executeWithFlags(sql, Statement.EXECUTE);
}
// 获取结果集元数据
@Override
public ResultSetMetaData getMetaData() throws SQLException {
// 调用底层实现
return this.getResultSet().getMetaData();
}
// 获取当前结果集
@Override
public ResultSet getResultSet() throws SQLException {
// 调用底层实现
return this.getResultSetInternal();
}
// 获取当前更新计数
@Override
public int getUpdateCount() throws SQLException {
// 调用底层实现
return this.getUpdateCountInternal();
}
// 获取当前警告
@Override
public SQLWarning getWarnings() throws SQLException {
// 调用底层实现
return this.getWarningsInternal();
}
// 清除警告
@Override
public void clearWarnings() throws SQLException {
// 调用底层实现
this.clearWarningsInternal();
}
// 更多方法...
}