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创建newFactory try(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 exception e.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装填cachedRowSet ResultSetMetaData 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)); } } } }