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-自我总结
这部分其实内容是挺多的,但是大部分的内容都是在做综合案例上,也就是管理系统,所以直接查看上面的博文就可以了。
泛型的使用,我看了这笔记之后才想起来,感觉泛型确实很灵活,后面会尽量多尝试去使用一下泛型这个东西。
加油吧!