Java中的數據集(zz)

        在.NET中引入了一個Java中沒有的、並且對於數據庫查詢來說非常實用的一個概念——數據集。
        簡單的說,數據集就是利用一次連接數據庫的查詢時間將查詢結果保留下來,再根據所需對數據進行操作。由於此時的數據操作(這裏僅限於查詢及其批量修改)是在駕馭在數據庫外面的基礎上,也就是說此時已經完全脫離了數據庫。所以對於程序來說無疑在速度上大大了節省了時間,從而提高了程序執行的效率。
        那麼在Java中是否可以使用同樣的方法呢?我們的回答是肯定的。只不過在VS.NET中這些全都是有IDE自動生成的,而我們這裏則需要手工寫。其實實現這個功能很簡單,但是如果要做到真正的提高效率那就擁有一定的難度係數了。
       下面,簡單的說一下在Java中是如何實現“數據集”的:
       .NET中生成的的數據集是以XML來表示的,在Java裏同樣可以,調用相應的XML的API就可以了。爲了簡便操作,我們這裏僅僅用數據集合。

      首先看一下這些代碼:
import java.sql.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public void search()
 {
  ps=con.prepareStatement("select * from Products");
  ResultSet result=ps.executeQuery();
                          while(result.next())
                          {
       String t1=result.getString(1);
       String t2=result.getString(2);
       ……………………
       ……………………  
       String tN=result.getString(N);
                           }
   }
}
        此時,我們用的是最普通也是最本的方法將數據一點一點地從數據庫中取出來,如果這個程序沒有“跨越”傳輸數據的話,這個勉強能說得過去。但是在實際的開發中像這種本地調用的畢竟是少數,所以就出現了所謂的“跨越”調用(即在不同的計算機之間進行的數據傳輸)。
        首先這裏要注意一點,如果在這裏加入finally然後在裏面執行關閉書數據庫操作的時候,回報錯!因爲這裏會因爲數據沒有查詢完畢而出現異常。


        由於上述情況,就限制住了一點:“在這種情況下,始終保持着數據庫的連接狀態。”這對於數據庫資源和網絡資源非常寶貴的環境來說顯然是不現實的。所以便出現了我們下面的“數據集”:
import java.sql.*;
import java.util.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public Vector search()
 {
  ps=con.prepareStatement("select * from Products");
  ps.setString(1,key);
  ResultSet result=ps.executeQuery();
  Vector resV=new Vector();
     while(result.next())
  {       
   CustObj obj=new CustObj(result.getInt(1),
      result.getInt(2),
      ...............
      ...............
      result.getInt(N));
      resV.add(obj);
  }
  return resV;
 }
}//這裏的CustObj僅僅是一個接受類
       和上面的不同,此時完全可以用finally語句附帶關閉數據庫的操作。因爲此時數據已經完全保存到了Vector裏面。

       無論是在面向對象的設計中,還是在數據庫跨越傳輸中。第二種方法都是最佳的首選。如果在配合Java與XML的API,實現.NET那樣的數據集本地化是輕而易舉的事。
       還是那句話,如果真得能做到“真正的提高效率”,很難。畢竟,VS.NET中的本地化數據庫並不是像我說得這樣簡單。

      首先看一下這些代碼:
import java.sql.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public void search()
 {
  ps=con.prepareStatement("select * from Products");
  ResultSet result=ps.executeQuery();
                          while(result.next())
                          {
       String t1=result.getString(1);
       String t2=result.getString(2);
       ……………………
       ……………………  
       String tN=result.getString(N);
                           }
   }
}
        此時,我們用的是最普通也是最本的方法將數據一點一點地從數據庫中取出來,如果這個程序沒有“跨越”傳輸數據的話,這個勉強能說得過去。但是在實際的開發中像這種本地調用的畢竟是少數,所以就出現了所謂的“跨越”調用(即在不同的計算機之間進行的數據傳輸)。
        首先這裏要注意一點,如果在這裏加入finally然後在裏面執行關閉書數據庫操作的時候,回報錯!因爲這裏會因爲數據沒有查詢完畢而出現異常。


        由於上述情況,就限制住了一點:“在這種情況下,始終保持着數據庫的連接狀態。”這對於數據庫資源和網絡資源非常寶貴的環境來說顯然是不現實的。所以便出現了我們下面的“數據集”:
import java.sql.*;
import java.util.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public Vector search()
 {
  ps=con.prepareStatement("select * from Products");
  ps.setString(1,key);
  ResultSet result=ps.executeQuery();
  Vector resV=new Vector();
     while(result.next())
  {       
   CustObj obj=new CustObj(result.getInt(1),
      result.getInt(2),
      ...............
      ...............
      result.getInt(N));
      resV.add(obj);
  }
  return resV;
 }
}//這裏的CustObj僅僅是一個接受類
       和上面的不同,此時完全可以用finally語句附帶關閉數據庫的操作。因爲此時數據已經完全保存到了Vector裏面。

       無論是在面向對象的設計中,還是在數據庫跨越傳輸中。第二種方法都是最佳的首選。如果在配合Java與XML的API,實現.NET那樣的數據集本地化是輕而易舉的事。
       還是那句話,如果真得能做到“真正的提高效率”,很難。畢竟,VS.NET中的本地化數據庫並不是像我說得這樣簡單。

      首先看一下這些代碼:
import java.sql.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public void search()
 {
  ps=con.prepareStatement("select * from Products");
  ResultSet result=ps.executeQuery();
                          while(result.next())
                          {
       String t1=result.getString(1);
       String t2=result.getString(2);
       ……………………
       ……………………  
       String tN=result.getString(N);
                           }
   }
}
        此時,我們用的是最普通也是最本的方法將數據一點一點地從數據庫中取出來,如果這個程序沒有“跨越”傳輸數據的話,這個勉強能說得過去。但是在實際的開發中像這種本地調用的畢竟是少數,所以就出現了所謂的“跨越”調用(即在不同的計算機之間進行的數據傳輸)。
        首先這裏要注意一點,如果在這裏加入finally然後在裏面執行關閉書數據庫操作的時候,回報錯!因爲這裏會因爲數據沒有查詢完畢而出現異常。


        由於上述情況,就限制住了一點:“在這種情況下,始終保持着數據庫的連接狀態。”這對於數據庫資源和網絡資源非常寶貴的環境來說顯然是不現實的。所以便出現了我們下面的“數據集”:
import java.sql.*;
import java.util.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public Vector search()
 {
  ps=con.prepareStatement("select * from Products");
  ps.setString(1,key);
  ResultSet result=ps.executeQuery();
  Vector resV=new Vector();
     while(result.next())
  {       
   CustObj obj=new CustObj(result.getInt(1),
      result.getInt(2),
      ...............
      ...............
      result.getInt(N));
      resV.add(obj);
  }
  return resV;
 }
}//這裏的CustObj僅僅是一個接受類
       和上面的不同,此時完全可以用finally語句附帶關閉數據庫的操作。因爲此時數據已經完全保存到了Vector裏面。

       無論是在面向對象的設計中,還是在數據庫跨越傳輸中。第二種方法都是最佳的首選。如果在配合Java與XML的API,實現.NET那樣的數據集本地化是輕而易舉的事。
       還是那句話,如果真得能做到“真正的提高效率”,很難。畢竟,VS.NET中的本地化數據庫並不是像我說得這樣簡單。

      首先看一下這些代碼:
import java.sql.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public void search()
 {
  ps=con.prepareStatement("select * from Products");
  ResultSet result=ps.executeQuery();
                          while(result.next())
                          {
       String t1=result.getString(1);
       String t2=result.getString(2);
       ……………………
       ……………………  
       String tN=result.getString(N);
                           }
   }
}
        此時,我們用的是最普通也是最本的方法將數據一點一點地從數據庫中取出來,如果這個程序沒有“跨越”傳輸數據的話,這個勉強能說得過去。但是在實際的開發中像這種本地調用的畢竟是少數,所以就出現了所謂的“跨越”調用(即在不同的計算機之間進行的數據傳輸)。
        首先這裏要注意一點,如果在這裏加入finally然後在裏面執行關閉書數據庫操作的時候,回報錯!因爲這裏會因爲數據沒有查詢完畢而出現異常。


        由於上述情況,就限制住了一點:“在這種情況下,始終保持着數據庫的連接狀態。”這對於數據庫資源和網絡資源非常寶貴的環境來說顯然是不現實的。所以便出現了我們下面的“數據集”:
import java.sql.*;
import java.util.*;
public class SqlTest
{
 Connection con;
 PreparedStatement ps;
 public SqlTest()
 {
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind","sa","");
 } 
 public Vector search()
 {
  ps=con.prepareStatement("select * from Products");
  ps.setString(1,key);
  ResultSet result=ps.executeQuery();
  Vector resV=new Vector();
     while(result.next())
  {       
   CustObj obj=new CustObj(result.getInt(1),
      result.getInt(2),
      ...............
      ...............
      result.getInt(N));
      resV.add(obj);
  }
  return resV;
 }
}//這裏的CustObj僅僅是一個接受類
       和上面的不同,此時完全可以用finally語句附帶關閉數據庫的操作。因爲此時數據已經完全保存到了Vector裏面。

       無論是在面向對象的設計中,還是在數據庫跨越傳輸中。第二種方法都是最佳的首選。如果在配合Java與XML的API,實現.NET那樣的數據集本地化是輕而易舉的事。
       還是那句話,如果真得能做到“真正的提高效率”,很難。畢竟,VS.NET中的本地化數據庫並不是像我說得這樣簡單。

發佈了75 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章