1. 程式人生 > >工作填坑總結(1)

工作填坑總結(1)

記錄一下工作學習過程中的一些經驗總結,為了避免以後遺忘,先寫一部分,等積累到一定的內容的時候,再做一個整理總結,這周的內容主要有以下幾點:

  • 泛型陣列無法建立
  • sql語句的書寫順序與解析順序
  • where與having的區別
  • E-R關係圖
  • ResultSet的滾動結果集
  • 連線池的Close的裝飾著模式的方法增強

  • 泛型陣列無法建立
    以前一直知道Java中的陣列是不能使用泛型的,一直也沒有深究過原因,今天寫一下這個原因。假如陣列可以使用泛型,那麼由於java泛型的型別擦除和陣列的協變,下面的程式碼將會編譯通過:

List<String>[] stringLists=new List
<String>[1]; List<Integer> intList = Arrays.asList(40); Object[] objects = stringLists; objects[0]=intList; String s=stringLists[0].get(0);

由於泛型的型別擦除,List< Integer>,List< String >與List在執行期並沒有區別,所以List< String >放入List< Integer >並不會產生ArrayStoreException異常。但是String s=stringLists[0].get(0);將會丟擲ClassCastException異常。如果允許建立泛型陣列,就繞過了泛型的編譯時的型別檢查,將List< Integer >放入List [ ],並在實際存的是Integer的物件轉為String時丟擲異常。所以Java中為了避免這個問題,就直接會在編譯時就 報錯。

  • sql語句的書寫順序與解析順序
    書寫順序: s…f…w…g…h…o
    解析順序: from…on…outer…where…group by….having…select …distinct…order by
  • where與having的區別
    1) where是分組前篩選, having是分組後篩選
    2) where後不可以跟聚合函式, having可以跟聚合函式
    3) 如果出現使用where進行篩選和使用having進行篩選結果的一樣的, 使用 where 效率會更高一些。

  • E-R關係圖
    描述資料庫各種物件之間的關係的一種資料模型。
    在ER圖中有如下四個成分:
    矩形框:表示實體,在框中記入實體名。
    菱形框:表示聯絡,在框中記入聯絡名。
    橢圓形框:表示實體或聯絡的屬性,將屬性名記入框中。對於主屬性名,則在其名稱下劃一下劃線。
    連線:實體與屬性之間;實體與聯絡之間;聯絡與屬性之間用直線相連,並在直線上標註聯絡的型別。(對於一對一聯絡,要在兩個實體連線方向各寫1; 對於一對多聯絡,要在一的一方寫1,多的一方寫N;對於多對多關係,則要在兩個實體連線方向各寫N,M。)

  • ResultSet的滾動結果集
    ResultSet滾動結果集可以使結果集中的結果進行滾動,可以想象 ResultSet有一個指標,預設指向表第一行的上面,每次使用next(),指標向下一行移動,預設這個指標是不能來回滾動的,但是用滾動的結果集就可以讓這個指標來回滾動,從而取得紀錄next()、previous(),回到第一行first(),同時還支援要去的ResultSet中的第幾行absolute(int n),以及移動到相對當前行的第幾行relative(int n)。具體使用方法,可以檢視API,需要注意的一點是,滾動型別的設定。

  • 連線池的Close的裝飾著模式的方法增強
    使用連線池時,每次歸還連線池都使用的是close方法,但是很明顯,如果每次歸還連線都是關閉資源的話,那麼連線池的連線總是在不斷的被取出,新的連線總是不斷的被連線池建立,建立連線池的就相當於沒有作用,所以每次歸還連線是不會關閉資源的,那麼我們每次呼叫的close方法又是怎麼一回事呢?最近查資料,發現原來我們使用的close方法是經過方法增強的。通過工作之餘查詢資料,自己寫了一個簡單版的,通過裝飾者模式方法增強方式增強close方法的連線池的實現,這裡貼上主要部分程式碼:
    首先是裝飾者:

public class MyDataSource implements DataSource{
    // 建立一個List集合用於存放多個連線物件.
    private List<Connection> list = new ArrayList<Connection>();
    // 在程式開始的時候,初始化幾個連線,將連線存放到list中.
    public MyDataSource() {
        // 初始化3個連線:
        for(int i=1;i<=3;i++){
            Connection conn = JDBCUtils.getConnection();
            list.add(conn);
        }
    }
    // 獲得連線的方法:
    public Connection getConnection() throws SQLException {
        if(list.size() <= 0){
            for(int i=1;i<=3;i++){
            Connection conn = JDBCUtils.getConnection();
            list.add(conn);
            }   
        }
        Connection conn = list.remove(0);
        MyConnection myConn = new MyConnection(conn, list);
        return myConn;
    }
}
 然後是被裝飾者:
public class MyConnection implements Connection{

    private Connection conn;
    private List<Connection> list;

    public MyConnection(Connection conn,List<Connection> list) {
        this.conn = conn;
        this.list = list;
    }


    @Override
    public void close() throws SQLException {
        list.add(conn);
    }


    @Override
    public boolean isWrapperFor(Class<?> arg0) throws SQLException {
        return conn.isWrapperFor(arg0);
    }
}