工作填坑總結(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);
}
}