zoukankan      html  css  js  c++  java
  • 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反射

  • 相关阅读:
    windows2008英文版设置文件夹选项
    vmware的使用技巧:将鼠标光标移回所在系统
    java最简代码规范总结
    oracle sql developer工具的使用
    java生成自定义证书图片4
    java生成自定义证书图片3
    java使用resource时,使用try-with-resources代替try-catch-finally
    java中利用BigDecimal进行精确计算
    mybatis分页插件pagehleper的基本使用
    mybatis中mapper映射文件中>=和<=等特殊符号的写法
  • 原文地址:https://www.cnblogs.com/humi/p/7977943.html
Copyright © 2011-2022 走看看