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-自我总结

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

发布了15 篇原创文章 · 获赞 18 · 访问量 4572

猜你喜欢

转载自blog.csdn.net/oZuoShen123/article/details/105185227