Jdbc引入連線池,JdbcTemplate處理結果集的優化

weixin_34239169發表於2017-12-14

#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;
	}

}
複製程式碼

相關文章