1. 程式人生 > >java資料庫程式設計(9) RowSet

java資料庫程式設計(9) RowSet

  1. RowSet是在java6.0之後才開始有比較多的應用的,在6.0中,java提供了JdbcRowSetImpl,CahedRowSet等五個實現類。
  2. 以下是jdbcRowSetImpl的一些構造方法:
    1. jdbcRowSetImpl()建立一個預設的jdbcRowSetImpl物件
    2. jdbcRowSetImpl(Connection conn)建立一個包裝Connection物件作為連結資料庫連結來建立物件。
    3. jdbcRowSetImpl(ResultSet rs) 建立一個包裝ResultSet的jdbcRowSetImpl物件
  3. 以下 是jdbcRowSetImpl的一些常用方法:
    1. setPassword(String password)設定該RowSet要訪問的資料庫的密碼
    2. setCommend(String sql)設定用該sql語句的查詢結果來裝填該RowSet
    3. execute()執行查詢
    4. populate(ResultSet rs)讓改RowSet直接包裝給定的ResultSet
  4. 以下為程式碼示例和執行效果,具體的講解穿插在程式碼中
  5. 在執行程式之前和執行程式之後分別查詢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

     

  6. 但是上面這個例子是由缺陷的,因為它直接使用了JdbcRowSetImpl,而它不是一個公開的API,它在未來是可能被刪除的。

  7. 在java7之後,新增了RowSetProvider和 RowSetFactory,前者用來建立後者,後者擁有一系列建立RowSet的方法

  8. 具體的講解穿插在程式碼中

    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