JavaWeb學習筆記7:元數據與探究DBUtils內部原理

1-瞭解元數據

元數據
Meata data
一句Sql字符串,描述這份字符串的數據叫做元數據,即:
數據庫元數據 DatabaseMetaData
參數元數據 ParameterMetaData
結果集元數據 ResultSetMetaData
ParameterMetaData的使用:
DBUtils的內部實現原理中,ps.setObject()方法的參數填寫是利用循環來實現的,次數爲參數數組長度。update等一些列需要填寫參數的操作,如果用戶傳入的參數與問號不對應(參數多於或少於問號),則運行就會報錯:Parameter index out of range (3 > number of parameters, which is 2)
所以可以使用ParameterMetaData來解決這一報錯問題,具體的使用方法如下:

ParameterMetaData pmd = ps.getParameterMetaData();	//ps要先裝載sql語句
int count = pmd.getParameterCount();	//count爲sql語句中?長度
2-模擬內部實現更新和查找語句

以下爲更新的內部原理自定義代碼:

public void updateUtil(String sql,Object ...args){
	MyDataSource ds = new MyDataSource();
	Connection conn = null;
	PreparedStatement ps = null;
	ParameterMetaData pmd = null;	//利用到了元數據
	try {
		conn = ds.getConnection();
		ps = conn.prepareStatement(sql);
		pmd = ps.getParameterMetaData();
		int count = pmd.getParameterCount();	//得到sql語句中的參數數量
		if(count==args.length)
		for (int i = 0; i < args.length; i++) {
			ps.setObject((i+1), args[i]);
		}
		ps.executeUpdate();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally{
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

以下爲查找的內部原理自定義代碼:

public <T> T queryUtil(String sql,ResultSetHandler<T> rsh,Object ...args){
	T handle = null;
	MyDataSource ds = new MyDataSource();
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	try {
		conn = ds.getConnection();
		ps = conn.prepareStatement(sql);
		rs = ps.executeQuery(sql);
		while(rs.next()){
			handle = (T)rsh.handle(rs);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally{
		try {
			JDBCUtil_old.closeAll(rs, ps, conn);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	return handle;
}

下面是測試查詢功能的代碼:

public void queryTest(){
	DBUtilsInnerImplement db = new DBUtilsInnerImplement();
	ArrayList<Account> list = (ArrayList<Account>) db.queryUtil("select * from account", new ResultSetHandler<List<Account>>() {
		@Override
		public List<Account> handle(ResultSet arg0) throws SQLException {
			List<Account> list = new ArrayList<Account>();
			while(arg0.next()){
				Account account = new Account();
				String name = (String) arg0.getObject("name");
				int money = (int) arg0.getObject("money");
				account.setName(name);
				account.setMoney(money);
				list.add(account);
			}
			return list;
		}
	});
	for (Account account : list) {
		System.out.println(account.toString());
	}
}

DBUtils的查詢中的參數爲(sql語句,ResultSetHandler rsh,Object …args)
其中rsh的T爲泛型,即所有類型都有可能作爲參數傳遞。故方法也要用泛型修飾
T - 泛型如果修飾類,則類中的所有方法都可以使用泛型。但是有的情況只能修飾方法
查詢方法的原理重點難點在於ResultSetHandler讓用戶自己定義(這裏的Handler爲最大接口),定義
之後作爲參數傳遞,這樣查詢方法就可以通過泛型判斷並返回相應的類型數據

3-JSP開發者模式與MVC模式

這裏簡單用兩張圖引入兩種模式:
JSP開發者模式
MVC模式
這兩種模式比較好理解,之前的學生管理系統也是採用了MVC模式,說白了MVC能夠讓你明確分工,而不會讓你的代碼看起來很雜亂而且修改或者更新的時候無從下手。
具體可以參考:宣佈告終!歷經周折的學生管理系統

HPF-自我總結

  這部分其實內容是挺多的,但是大部分的內容都是在做綜合案例上,也就是管理系統,所以直接查看上面的博文就可以了。
  泛型的使用,我看了這筆記之後纔想起來,感覺泛型確實很靈活,後面會盡量多嘗試去使用一下泛型這個東西。
  加油吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章