使用Statement对象执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute。使用哪一个方法由SQL语句执行后产生的结果而决定。

方法executeQuery用于产生单个结果集的语句,例如SELECT语句,执行executeQuery方法将返回一个结果集对象。方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQL DDL(数据定义语言)语句,例如CREATE TABLE和DROP TABLE。由于INSERT、UPDATE或DELETE语句的效果是修改表中若干行中的一列或多列,所以executeUpdate的返回值是一个整数,指示受影响的行数(即更新记录数);对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总是为零(我们把这个零返回值也视为更新记录数,即没有记录受到影响)。当被执行的SQL语句返回一个更新记录数、一个结果集、多结果集或者SQL语句的类型未知,则使用execute方法。下面的例子演示了以上方法的使用。

使用executeQuery方法处理SQL数据查询语句:

		ResultSet rs;
		try {
			Statement stmt = con.createStatement();
			String sql = "SELECT * FROM TEST";
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				// 处理获得的数据记录
			}
			stmt.close();
			rs.close();
		} catch (SQLException e) {
			fail(e.getMessage());
		}

使用executeUpdate方法处理SQL数据操纵语句:

		Statement stmt=con.createStatement();
		try {

			String sql = "INSERT INTO TEST VALUES(1,'shentong')";
			int rows = stmt.executeUpdate(sql);
			assertNotEquals(-1, rows);

			stmt.close();
		} catch (SQLException e) {
			fail(e.getMessage());
		}

使用executeUpdate方法处理SQL数据定义语句:

		Statement stmt = con.createStatement();
		String sql = "CREATE TABLE TEST(ID INT, VALUE VARCHAR(100))";
		int updcount = stmt.executeUpdate(sql);

使用execute方法处理SQL语句:

		Statement stmt;
		
		boolean retVal;
		try {
			String sql = "SELECT ID FROM TEST WHERE ID > 0;" 
					+ "INSERT INTO TEST VALUES(20,'VALUE20');"
					+ "SELECT VALUE FROM TEST WHERE ID > 10";
			stmt = con.createStatement();
			retVal = stmt.execute(sql);
			ResultSet rs;
			int count;
			do {
				if (retVal == false) {
					// 如果没有结果集
					count = stmt.getUpdateCount();
					if (count == -1) {
						// 说明既没有结果集,也没有更新的记录数,即下面再也没有
						// results了,跳出循环
						break;
					} else {
						// 如果有记录被更新
						// <some code>
					}
				} else { // 有结果集返回
					rs = stmt.getResultSet();
					// 处理ResultSet
				}
				// 获得下一个结果集或更新的记录数
				retVal = stmt.getMoreResults();
			} while (true);
		} catch (SQLException e) {
			fail(e.getMessage());
		}

需要说明的是,执行上面提及的任一种方法都将关闭所调用的Statement对象的当前打开结果集(如果存在)。这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。