Jdbc引入连接池,JdbcTemplate处理结果集的优化

382 阅读1分钟

#jdbc2笔记

  • 使用连接池,这样可以提高DAO连接数据库的性能

  • 引入一个结果集处理接口,这样可以使MyJdbcTemplate根据需求的不能,能处理不同的结果. ##引入连接池 导包 druid-1.0.9.jar
    这里使用的阿里巴巴的连接池.
    新建DruidUtil类

    public class DruidUtil { private static DataSource ds=null; static{ //获取properties对象 Properties prop=new Properties(); InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties"); try { prop.load(is); } catch (IOException e1) { e1.printStackTrace(); } try { //通过数据源工厂获取数据源 ds=DruidDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } } //测试用返回数据源 public static DataSource getDS(){ return ds; } //返回connection对象 public static Connection getConn(){ try { return ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } public static void close(Connection conn, ResultSet rs, PreparedStatement ps) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

      			}
      		}
      	}
      }
    

    } ##引入结果集

  • 新建一个处理结果集的接口

    public interface ResultHandle{ T handle(ResultSet rs); }

  • 修改MyJdbcTemplate中的查询方法,使用结果处理器处理结果

    public static T find(String sql, ResultHandle rsh, Object... obj) { Connection conn = JdbcUtil.getConn(); PreparedStatement ps = null; T t = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } ResultSet rs = ps.executeQuery(); t = rsh.handle(rs); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, ps, null); }

      return t;
    

    }

  • 实现了ResultHandle的处理结果集类
    处理list结果集

    public class BeanListHandle implements ResultHandle<List>{ private Class clazz; public BeanListHandle(Class clazz){ this.clazz=clazz; } @Override public List handle(ResultSet rs) { List list=new ArrayList(); try { while(rs.next()){ T t=clazz.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) { String name = pd.getName(); Method method = pd.getWriteMethod(); method.invoke(t,rs.getObject(name)); } list.add(t);

      		}
      	} catch (Exception e) {
      		e.printStackTrace();
      	}
      	
      	return list;
      }
    

    }

处理查询数量的结果集

public class CountHandle implements ResultHandle<Long>{

	@Override
	public Long handle(ResultSet rs) {
		try {
			while(rs.next()){
				return rs.getLong(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0L;
	}

}