java資料庫程式設計(9) RowSet
阿新 • • 發佈:2018-12-02
- RowSet是在java6.0之後才開始有比較多的應用的,在6.0中,java提供了JdbcRowSetImpl,CahedRowSet等五個實現類。
- 以下是jdbcRowSetImpl的一些構造方法:
- jdbcRowSetImpl()建立一個預設的jdbcRowSetImpl物件
- jdbcRowSetImpl(Connection conn)建立一個包裝Connection物件作為連結資料庫連結來建立物件。
- jdbcRowSetImpl(ResultSet rs) 建立一個包裝ResultSet的jdbcRowSetImpl物件
- 以下 是jdbcRowSetImpl的一些常用方法:
- setPassword(String password)設定該RowSet要訪問的資料庫的密碼
- setCommend(String sql)設定用該sql語句的查詢結果來裝填該RowSet
- execute()執行查詢
- populate(ResultSet rs)讓改RowSet直接包裝給定的ResultSet
- 以下為程式碼示例和執行效果,具體的講解穿插在程式碼中
- 在執行程式之前和執行程式之後分別查詢students表,得到的結果如圖所示
import com.sun.rowset.JdbcRowSetImpl; import javax.sql.rowset.JdbcRowSet; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class JdbcRowSetTest { private String driver; private String url; private String user; private String pass; public void iniParam(String paramFile) throws Exception{ Properties prop = new Properties(); prop.load(new FileInputStream(paramFile) ); driver = prop.getProperty("driver"); url = prop.getProperty("url"); user = prop.getProperty("user"); pass = prop.getProperty("pass"); } public void update(String sql) throws Exception{ Class.forName(driver); try( Connection connection = DriverManager.getConnection(url, user, pass); JdbcRowSet jdbcRs = new JdbcRowSetImpl(connection) // 建立JdbcRowSetImpl物件,他是通過JdbcrowSet介面建立物件的。 ){ jdbcRs.setCommand(sql); // 設定JdbcRowSet的sql語句 jdbcRs.execute(); // 執行sql語句 jdbcRs.afterLast(); // 將指標移動到最後一行之後 // 向前滾動結果集 while(jdbcRs.previous()){ System.out.println(jdbcRs.getString(1) + "\t" + jdbcRs.getString(2)); // 如果匹配到Sname這一列的內容為Smith的話,就將它的Sno列設定為S0 if(jdbcRs.getString("Sname").equals("Smith")){ jdbcRs.updateString("Sno", "S0"); jdbcRs.updateRow(); } } } } public static void main(String args[]) throws Exception{ JdbcRowSetTest jdbcRowSetTest = new JdbcRowSetTest(); jdbcRowSetTest.iniParam("mysql.ini"); jdbcRowSetTest.update("select * from students;"); } } //執行程式,看到以下輸出 // S3 Tom // S2 Marry // S1 Smith
-
但是上面這個例子是由缺陷的,因為它直接使用了JdbcRowSetImpl,而它不是一個公開的API,它在未來是可能被刪除的。
-
在java7之後,新增了RowSetProvider和 RowSetFactory,前者用來建立後者,後者擁有一系列建立RowSet的方法
-
具體的講解穿插在程式碼中
import javax.sql.rowset.JdbcRowSet; import javax.sql.rowset.RowSetFactory; import javax.sql.rowset.RowSetProvider; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class RowSetFactoryTest { private String driver; private String url; private String user; private String pass; public void initParam(String fileName) throws Exception{ Properties prop = new Properties(); prop.load(new FileInputStream(fileName)); driver = prop.getProperty("driver"); url = prop.getProperty("url"); user = prop.getProperty("user"); pass = prop.getProperty("pass"); } public void update(String sql) throws Exception{ Class.forName(driver); RowSetFactory factory = RowSetProvider.newFactory(); // 使用RowSetProvider來建立一個RowSetFactory物件 try( JdbcRowSet jdbcRs = factory.createJdbcRowSet()) // 使用RowSetFactory來創捷一個JdbcRowSet物件 { // 接下來這些操作就和上面的例子的操作是一樣的了。 jdbcRs.setUrl(url); jdbcRs.setUsername(user); jdbcRs.setPassword(pass); jdbcRs.setCommand(sql); jdbcRs.execute(); jdbcRs.afterLast(); // 將指標移動到最後一行之後 // 向前滾動結果集 while (jdbcRs.previous()){ System.out.println(jdbcRs.getString(1) + "\t" + jdbcRs.getString(2)); } } } public static void main(String args[]) throws Exception{ JdbcRowSetTest jdbcRowSetTest = new JdbcRowSetTest(); jdbcRowSetTest.iniParam("mysql.ini"); jdbcRowSetTest.update("select * from students;"); } } //執行程式之後,看到以下執行結果 // S3 Tom // S2 Marry // S0 Smith