第一章:單例模式和conn.createStatement參數問題

SensorMonitorjava

單例模式,是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例數據庫

private static SensorMonitor instance = null;
public static SensorMonitor getInstance(){
     if(instance == null){
         instance = new SensorMonitor();
     }
}

單例設計模式是我最早學習的一個設計模式,也是最熟悉的一個設計模式。設計模式

單例設計模式的要求是生成同一個對象。即在取這個類的對象的時候,怎麼取都是那一個。多線程

單例模式不變的一點就是私有化構造方法,並提供一個靜態的本類對象。併發

單例設計模式分爲兩種,一種是懶漢式,一種是餓漢式。學習

所謂懶漢式其實就是在獲取實例化對象的時候,首先判斷單例類中的靜態對象是否爲null,若是是null,則new出來一個,若是不是null,那就返回那個對象。spa

//懶漢式
class Lazyer {
	private static Lazyer lazyer;

	private Lazyer() {
	}

	public static Lazyer getInstance() {
		if (lazyer == null) {
			lazyer = new Lazyer();
			return lazyer;
		} else {
			return lazyer;
		}
	}
}

public class LazyMan {
	public static void main(String[] args) {
		Lazyer la = Lazyer.getInstance();
		System.out.println(la);
		Lazyer la2 = Lazyer.getInstance();
		System.out.println(la2);
	}
}

而所謂餓漢式與懶漢式最關鍵的不一樣點就是餓漢式不用判斷那個靜態的單例類中的靜態對象是否爲null,而是直接在聲明這個靜態對象的時候就將其new出實例化對象。線程

//餓漢式
class Hunger{
	private static Hunger hunger = new Hunger();
	private Hunger(){}
	public static Hunger getInstance(){
		return hunger;
	}
}



public class HungryMan {
	public static void main(String[] args) {
		Hunger hu = Hunger.getInstance();
		Hunger hu2 = Hunger.getInstance();
		System.out.println(hu);
		System.out.println(hu2);
	}
}

區別:因爲懶漢式多了判斷是否爲空這一步,因此在多線程的時候會有併發問題發生。而餓漢式沒有這一步,相對來講效率較高並且不用考慮併發問題。設計

Statement stat	=	conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

通用格式爲:Statement stmt=con.createStatement(int type,int concurrency);咱們在訪問數據庫的時候,在讀取返回結果的時候,可能要先後移動指針,好比咱們先計算有多少條信息,這是咱們就須要把指針移到最後來計算,而後再把指針移到最前面,逐條讀取,有時咱們只須要逐條讀取就能夠了。還有就是有隻咱們只須要讀取數據,爲了避免破壞數據,咱們可採用只讀模式,有時咱們須要望數據庫裏添加記錄,這是咱們就要採用可更新數據庫的模式。下面咱們就對其參數進行說明:指針

參數 int type

ResultSet.TYPE_FORWORD_ONLY 結果集的遊標只能向下滾動。

ResultSet.TYPE_SCROLL_INSENSITIVE 結果集的遊標能夠上下移動,當數據庫變化時,當前結果集不變。

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滾動的結果集,當數據庫變化時,當前結果集同步改變。

參數 int concurrency

ResultSet.CONCUR_READ_ONLY 不能用結果集更新數據庫中的表。

ResultSet.CONCUR_UPDATETABLE 能用結果集更新數據庫中的表。

查詢語句

ResultSet re=stmt.executeUpdate(SQL語句);用來更新數據庫信息或插入數據

ResultSet re=stmt.executeQuery(SQL語句);用來查詢數據庫信息

當咱們使用ResultSet re=stmt.executeQuery(SQL語句)查詢後,咱們可使用下列方法得到信息:

public boolean previous() 將遊標向上移動,該方法返回boolean型數據,當移到結果集第一行以前時,返回false。

public void beforeFirst 將遊標移動到結果集的初始位置,即在第一行以前。

public void afterLast() 將遊標移到結果集最後一行以後。

public void first() 將遊標移到結果集的第一行。

public void last() 將遊標移到結果集的最後一行。

public boolean isAfterLast() 判斷遊標是否在最後一行以後。

public boolean isBeforeFirst() 判斷遊標是否在第一行以前。

public boolean ifFirst() 判斷遊標是否指向結果集的第一行。

public boolean isLast() 判斷遊標是否指向結果集的最後一行。

public int getRow() 獲得當前遊標所指向行的行號,行號從1開始,若是結果集沒有行,返回0。

public boolean absolute(int row) 將遊標移到參數row指定的行號。若是row取負值,就是倒數的行數,absolute(-1)表示移到最後一行,absolute(-2)表示移到倒數第2行。當移動到第一行前面或最後一行的後面時,該方法返回false

  

不帶參數使用默認值: 
createStatement() 
=createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY)

這樣取得的Statement其執行SQL後獲得的ResultSet,將只能使用next()方法逐筆取得查詢結果。 您能夠在創建Statement物件時指定resultSetType,可指定的參數有 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE與 ResultSet.TYPE_SCROLL_SENSITIVE,在不指定的情況下,預設是第一個,也就是隻能使用next()來逐筆取得資料,指定第二個或第三個,則可使用ResultSet的afterLast()、previous()、absolute()、relative()等方法。

相關文章
相關標籤/搜索