• 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反射

  • 相关阅读:
    Linux安装python3.6
    Django之Model操作
    Django
    html学习笔记-XML-Javascript
    html学习笔记-XML
    html学习笔记-DOM
    在IDEA中编辑struts国际化properties文件
    Java中的Serializable接口和transient关键字
    关于Kettle的事务和转换内步骤的顺序执行
    Mac、Linux下两个Emacs共享一个配置文件
  • 原文地址:https://www.cnblogs.com/humi/p/7977943.html
Copyright © 2020-2023  润新知