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模式
這裏簡單用兩張圖引入兩種模式:
這兩種模式比較好理解,之前的學生管理系統也是採用了MVC模式,說白了MVC能夠讓你明確分工,而不會讓你的代碼看起來很雜亂而且修改或者更新的時候無從下手。
具體可以參考:宣佈告終!歷經周折的學生管理系統
HPF-自我總結
這部分其實內容是挺多的,但是大部分的內容都是在做綜合案例上,也就是管理系統,所以直接查看上面的博文就可以了。
泛型的使用,我看了這筆記之後纔想起來,感覺泛型確實很靈活,後面會盡量多嘗試去使用一下泛型這個東西。
加油吧!