博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习-JDBC系列-4-Statement介绍
阅读量:4302 次
发布时间:2019-05-27

本文共 5002 字,大约阅读时间需要 16 分钟。

接下里学习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()方法,其他两个方法不执行。

运行结果:

truefalse192101	Tom	male	19192102	Lucy	female	18192103	Dniel	male	20192104	Sunny	female	18192105	Anthony	male	18192106	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();	}	}

得到结果

1192101	Tom	male	19192102	Lucy	female	18192103	Dniel	male	20192104	Sunny	female	18192105	Anthony	male	23192106	Madvi	female	22

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

 

6.方法close()

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

转载地址:http://zuows.baihongyu.com/

你可能感兴趣的文章
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
点击button实现Storyboard中TabBar Controller的tab切换
查看>>
Xcode 的正确打开方式——Debugging
查看>>
打包app出现的一个问题
查看>>
iOS在Xcode6中怎么创建OC category文件
查看>>
Expanding User-Defined Runtime Attributes in Xcode with Objective-C
查看>>
iOS7 UITabBar自定义选中图片显示为默认蓝色的Bug
查看>>
提升UITableView性能-复杂页面的优化
查看>>
25 iOS App Performance Tips & Tricks
查看>>
那些好用的iOS开发工具
查看>>
iOS最佳实践
查看>>
使用CFStringTransform将汉字转换为拼音
查看>>
更轻量的 View Controllers
查看>>
Chisel-LLDB命令插件,让调试更Easy
查看>>
时间格式化hh:mm:ss和HH:mm:ss区别
查看>>