JDBC 学习复习10 编写自己的JDBC框架

首先万分感谢狼哥 孤傲苍狼 博客,整个jdbc学习的博客资料 链接为http://www.cnblogs.com/xdp-gacl/p/4006830.html

详细代码见狼哥博客,列出我学习过程中遇到的问题吧。

public static Object query(String sql, Object[] params, ResultSetHandler rsh)
			throws SQLException {
		Connection conn = null;
		PreparedStatement ppst = null;
		ResultSet rs = null;
		try {

			conn = getConnection();
			ppst = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ppst.setObject(i + 1, params[i]);
			}
			rs = ppst.executeQuery();
			return rsh.handler(rs);//关于这个策略模式的学习,详见设计模式吧,熟悉这种写法,在公司的工作过程中,类似写法遇到过,有用!
		} finally {
			release(conn, ppst, rs);
		}
	}

后面这么调用的

public User queryByID(int id) throws SQLException{
		String sql = "select * from user where uid=?";
		return (User) JDBCUtil.query(sql,new Object[]{id}, new BeanHandler(User.class));
	}

然后BeanHandler实际上就是ResultSetHandler 借口的实现类,主要目的就是把查询结果,放到通过发射获取到的JavaBean里面,也就从数据库里面加载到JVM内存里了

package dbex.domain;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class BeanHandler implements ResultSetHandler {
	private Class<?> clazz;

	public BeanHandler(Class<?> clazz) {
		this.clazz = clazz;
	}

	public Object handler(ResultSet rs) {
		Object bean=null;
		try {
			if (!rs.next()) {//判空 直接返回null
				return bean;
			}
			// 把resultset对象中的列数据放入到Bean对应的属性中去
			bean = clazz.newInstance();
			ResultSetMetaData rsm = rs.getMetaData();
			int len = rsm.getColumnCount();
			for (int i = 0; i < len; i++) {
				String name = rsm.getColumnName(i + 1);
				Object data = rs.getObject(i+1);
				Field field = clazz.getDeclaredField(name);
				field.setAccessible(true);
				String type = rsm.getColumnTypeName(i+1);
//				if("INTEGER".equals(type)){
//					System.out.println(type);
					field.set(bean,data.toString());
//				}else if("String".equalsIgnoreCase(type)){
//					field.set(bean,(String)data);
//					System.out.println(type);
//				}else{
//					field.set(bean, data);
//				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bean;
	}

}

总结下:策略模式 ,java反射

posted @ 2017-12-04 17:02  言非言  阅读(174)  评论(0编辑  收藏  举报