JavaWeb学习-JDBC系列-4-Statement介绍

接下里学习Statement接口,Statement对象是通过Connection接口来创建的,它主要有两个功能,执行静态SQL语句和拿到执行结果集。实际项目中重点肯定是通过Statement对象去执行各种SQL语句,所以这篇,我们详细学习下Statement的SQL语句执行练习方法,结果集操作放到下一篇文章学习。

1.相关学习代码

//得到执行SQL语句的Statement对象
Statement stmt = conn.createStatement();
//执行SQL语句,这里是执行查询语句,得到一个虚拟表的结果对象
ResultSet rs = stmt.executeQuery("SELECT * FROM student");

2.JDK文档

上面我们看到一个execteQuery()方法,我们去JDK查询Statement接口,看到这句话:用于执行静态 SQL 语句并返回它所生成结果的对象。在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。

这一大段话,我们只理解第一句就好,下面看看方法。

上面红圈方法是需要我们重点练习,其中executeQuery()是我们前面代码已经使用过的,返回类型是一个ResultRet。所以,我们下面来介绍其它两个红圈的方法,剩下几个是这几个红圈方法的重载。

 

3.方法executeQuery(SQL语句)

这个就是给定一个SQL语句,返回一个ResultSet对象。我们代码执行的是查询一个Student表的全部信息。应该说,全部SQL查询语句,在代码中都使用这个方法。

 

4.方法boolean execute(SQL语句)

这个方法很奇葩,第一个,使用这个方法可以执行任意的SQL语句。第二个执行之后返回值类型是布尔型,表示是否返回ResultSet结果集。仅当执行select语句时且有返回结果时返回true,其他情况都返回false。

下面我使用Junit框架,来写三个用例,默认执行顺序是test2 -> test3 ->test4

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.jupiter.api.Test;

public class StatementTest {
	
	@Test
	public void test4() throws ClassNotFoundException, SQLException {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,这里是执行查询语句,得到一个虚拟表的结果对象
		ResultSet rs = stmt.executeQuery("SELECT * FROM student");
		//对结果进行处理,这里是打印
		while(rs.next()) {
			System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"+ rs.getObject(4));
		}
		//关闭连接
		rs.close();
		stmt.close();
		conn.close();
	}
	
	@Test
	public void test2() throws Exception {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,测试 boolean execute()方法返回值
		boolean rs = stmt.execute("SELECT * FROM student");
		System.out.println(rs);
		stmt.close();
		conn.close();
	}
	
	@Test
	public void test3() throws Exception {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,测试 boolean execute()方法返回值
		boolean rs = stmt.execute("INSERT INTO student VALUES ('192106','Madvi','female','22')");
		System.out.println(rs);
		stmt.close();
		conn.close();
	}
}

这里提醒一下如何运行Junit或者TestNG用例,你的鼠标指针如果定位/点击在类名称,说明运行整个类下全部@Test的用例,如果你单独鼠标指针定位在test3()这个方法名称这一行,右键运行run as Junit,那么三个用例,只运行test3()方法,其他两个方法不执行。

运行结果:

true

false

192101	Tom	male	19
192102	Lucy	female	18
192103	Dniel	male	20
192104	Sunny	female	18
192105	Anthony	male	18
192106	Madvi	female	22

结果分析,第一个执行test2(), execute()里面是查询语句,所以返回布尔值为true,唯一这类型返回true,说明查询有结果集。第二个运行方法是test3(), 这里插入一行数据,由于不是select语句,所以返回值是false. 第三个顺序执行test4(),这个是查询全部表内容,返回是一个结果集,这里打印内容,也验证了我们执行插入语句是成功的。

 

5.方法int executeUpdate(SQL语句)

这个方法执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。下面来一条UPDATE语句,修改anthony的年龄。

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.jupiter.api.Test;

public class StatementTest {
	
	@Test
	public void test1() throws Exception {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,测试 boolean execute()方法返回值
		int rs = stmt.executeUpdate("UPDATE student SET Age='23' WHERE Name='Anthony'");
		System.out.println(rs);
		stmt.close();
		conn.close();
	}
	
	@Test
	public void test4() throws ClassNotFoundException, SQLException {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,这里是执行查询语句,得到一个虚拟表的结果对象
		ResultSet rs = stmt.executeQuery("SELECT * FROM student");
		//对结果进行处理,这里是打印
		while(rs.next()) {
			System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"+ rs.getObject(4));
		}
		//关闭连接
		rs.close();
		stmt.close();
		conn.close();
	}
	
}

得到结果

1

192101	Tom	male	19
192102	Lucy	female	18
192103	Dniel	male	20
192104	Sunny	female	18
192105	Anthony	male	23
192106	Madvi	female	22

返回结果是一个int类型,这个值表示执行这条SQL语句,产生的结果影响了表中几行数据,这里我们更新了一个人的年龄这个值,执行结果影响就是1. 这个方法还可以执行删除的sql语句,返回int值可能就有很多行影响。

 

6.方法close()

回到JDK的Statement接口文档页面,我看方法中有一个关闭的方法我们前面一篇代码中用到过。作用就是立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。所以养成用完就关闭资源的习惯。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值