一、前言
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,它同时还具有操纵数据的功能,可能完成对数据的更新等。
结果集读取数据的方法主要是getXXX(),它的参数可以是整型,表示第几列,下标从1开始;还可以是列名,指定根据别名返回某一列的值,返回的是对应的XXX类型的值。
如果对应那列是空值,XXX是对象的话返回XXX型的空值;如果XXX是数字类型,如Float等则返回0;boolean返回false;使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。
XXX可以代表的类型有: 基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日 期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型 (BigDecimal和BigInteger等)等。
还可以使用getArray(intcolindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用 getAsciiStream(intcolindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。
结果集从其使用的特点上 可以分为四类,这四类的结果集的所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以 说,结果集具备何种特点,完全决定于Statement。
二、案例
♦搭建一个简单的Java工程
♦创建一张数据库表t_user
create table t_user
(
id VARCHAR2(10) not null,
name VARCHAR2(14),
password VARCHAR2(13),
email VARCHAR2(20)
)
♦新建一个工具类
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author queen
* @since 2017-07-22
*/
public class ConnectionUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
public static void getProperties(String fileName) {
Properties prop = new Properties();
File file = new File(fileName);
try {
FileInputStream fis = new FileInputStream(file);
//加载输入流指定的文件
prop.load(fis);
//获得文件中的key对应的value,赋值给全局变量
driver = prop.getProperty("driverClassName");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 利用getProperties方法获得参数,构造连接并返回
* @return
*/
public static Connection getConnection() {
getProperties("src/db.properties");
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
/**
* 关闭连接
* @param connection
*/
public static void close(Connection connection){
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭Statement
* @param stmt
*/
public static void close(Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭结果集
* @param rs
*/
public static void close(ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
♦完成最基本的ResultSet操作,新建JDBCResultSet类
/**
* @author queen
* @since 2017-07-22
*/
public class JDBCResultSet {
public static void getData() {
String sql = "select * from t_user";
Statement stmt = null;
ResultSet rs = null;
Connection connection = ConnectionUtils.getConnection();
try {
stmt = connection.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + "," + name + "," + password + ","
+ email);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionUtils.close(rs);
ConnectionUtils.close(stmt);
ConnectionUtils.close(connection);
}
}
public static void main(String[] args) {
getData();
}
}
♦测试运行一下,打印出如下结果:
1,Tom,123456,123456789@qq.com
上面这种是最简单的ResultSet使用,因为这个ResultSet它起到的作用就是完成了查询结果的存储功能,而且只能读取一次,不能够来回的滚动读取。这种结果集的创建方式如下:
Statement st = conn.CreateStatement()
ResultSet rs = Statement.excuteQuery(sql);
由于这种结果集不支持滚动的读取功能,所以如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据。
博客地址:http://www.marsitman.com/jdbc/jdbc_resultset.html