相信很少使用这个方法,其实这个方法是用来返回Statement当前打开过的ResultSet,以代码举例
ResultSet rs1= statement.executeQuery(".....");
ResultSet rs2= statement.getResultSet();
System.out.println(rs1==rs2);//结果是true
还有一个方法:statement.execute(".....");这个方法返回的结果是一个Boolean值,如果执行一条查询语句,那么可以通过Statement.getResultSet()来获得结果对像,这个execute方法是有可能返回多条ResultSet结果(主要看驱动是否支持), 是否有下一个结果集,可以通过使用方法:getMoreResults和 getMoreResults(int current)来判定,通常情况下Statement如果打开多条ResultSet那么只保留最后一个,并关闭前面的。getMoreResults这个方法有三个可选变量输入,从而决定是否关闭,还是继续保持已打开过ResultSet,请看下图的JDBC规范定义
总结一下
1:Statement.getResultSet()可以获得当前打开过ResultSet对像
2:在未执行过SQL的时候,Statement.getResultSet()理论值是空
3:Statement.getResultSet()在Statement.execute()的情况下是有可能获得多个结果集
4:如果存在多个结果集,是否关闭已经打开过的,主要驱动的关闭策略代码(体现getMoreResults(int current)
继续使用光链池测试一下,代码如下:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class TestPreparedStatementOnHikaCP {
public static void main(String[] args) {
try {
HikariConfig config2 = new HikariConfig();
config2.setJdbcUrl("jdbc:mysql://localhost/test?serverTimezone=UTC");
config2.setDriverClassName("com.mysql.cj.jdbc.Driver");
config2.setUsername("root");
config2.setPassword("");
config2.setAutoCommit(false);
config2.addDataSourceProperty("cachePrepStmts", "true");
config2.addDataSourceProperty("useServerPrepStmts", "true");
HikariDataSource ds = new HikariDataSource(config2);
ResultSet rs=null;
PreparedStatement pst=null;
Connection con = null;
try {
con = ds.getConnection();
pst=con.prepareStatement("select * from BEECP_TEST");
System.out.println("未执行SQL前1:"+pst.getResultSet());
System.out.println("未执行SQL前2:"+pst.getResultSet());
System.out.println("未执行SQL前3:"+pst.getResultSet());
rs=pst.executeQuery();
System.out.println("执行SQL后1:"+pst.getResultSet());
System.out.println("执行SQL后2:"+pst.getResultSet());
System.out.println("执行SQL后3:"+pst.getResultSet());
System.out.println("打印通过executeQuery获得的结果对像:"+rs);
System.out.println("已执行SQL,两个对像是否相等:"+(pst.getResultSet()==rs));
/**
* 依赖包:
* 1:HikariCP-3.4.5.jar
* 2:mysql-connector-java-8.0.16.jar
*/
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null)
rs.close();
if (pst != null)
pst.close();
if (con != null)
con.close();
}
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果截图
可以从测试结果上很明显看到SQL执行后两个方法的获得ResultSet并不相等,但包了同一个物理对像
statement.executeQuery() != statement.getResultSet();
从这个实现方法来上讲,光连接池是没有遵循规范