接下里学习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 资源,而不是等待该对象自动关闭时发生此操作。所以养成用完就关闭资源的习惯。