背景
C#中有了DataSet,可以把底层数据读取到内存中进行离线操作。操作完成再同步到底层数据源。Java中也提供了类似的功能——RowSet。
和ResultSet相比,RowSet默认是可以滚动、可更新、可序列化的结果集合,而且作为Javabean使用。并支持离线操作,降低了数据库的负载。
RowSetProvider负责创建RowSetFactory,而RowSetFactory则提供了如下方法类创建RowSet实例:
1、CacheRowSet createCachedRowSet();创建一个默认的CachedRowSet
2、FilteredRowSet createFilteredRowSet();创建一个默认的FilteredRowSet
3、JdbcRowSet createJdbcRowSet();创建一个默认的JdbcRowSet
4、JoinRowSet createJoinRowSet ();创建一个默认的JoinRowSet
5、WebRowSet createWebRowSet ();创建一个默认的WebRowSet
为了让RowSet能抓取到数据,需要为RowSet设置数据库Url、用户名、密码等信息。常用方法如下:
1、setUrl(String url):设置URL
2、setUserName(String Name):设置用户名
3、setPassword(String password):设置密码
4、setCommand(String sql):设置SQL语句
5、execute():执行查询
示例代码如下图所示:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;public class RowSetUtil {private String url;private String user;private String password;public RowSetUtil(String url,String user,String password){this.url = url;this.user = user;this.password = password;}static{try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 查询SQL并修改指定结果* @param sql* @throws SQLException*/public void queryResult(String sql)throws SQLException{RowSetFactory factory = RowSetProvider.newFactory();//使用RowSetProvider创建newFactorytry(JdbcRowSet jdbcRowSet = factory.createJdbcRowSet())//使用factory创建JdbcRowSet实例{jdbcRowSet.setUrl(this.url);jdbcRowSet.setUsername(this.user);jdbcRowSet.setPassword(this.password);jdbcRowSet.setCommand(sql);try {jdbcRowSet.execute();//执行操作} catch (Exception e) {// TODO: handle exceptione.printStackTrace();throw new SQLException();}while(jdbcRowSet.next()){ System.out.println("id=" + jdbcRowSet.getLong(1) + ";productName=" + jdbcRowSet.getString(1));if (jdbcRowSet.getLong("Id") == 218) {jdbcRowSet.updateString("ProductName", "测试");jdbcRowSet.updateRow();}}}}/*** 离线RowSet模式* @param sql* @throws SQLException*/public void queryResultOffLine(String sql) throws SQLException{try(Connection connection = DriverManager.getConnection(this.url, this.user, this.password);Statement statement = connection.createStatement();ResultSet rSet = statement.executeQuery(sql);){RowSetFactory factory = RowSetProvider.newFactory();CachedRowSet cachedRowSet = factory.createCachedRowSet();cachedRowSet.populate(rSet);//使用cachedRowSet装填cachedRowSetResultSetMetaData rSetMetaData = cachedRowSet.getMetaData();//转化为rSetMetaData才能进行获取列名信息int colCount = rSetMetaData.getColumnCount();for (int i = 1; i <= colCount; i++) {System.out.println("第" + i + "列列名是" + rSetMetaData.getColumnName(i) + ";类型是" + rSetMetaData.getColumnTypeName(i));}}}
}