对于属性比较多的bean,如果不使用hibernate 或者ibatis等持久化解决方案,写查询函数时,单单将ResultSet 转换成Object就是一件很痛苦的事情,因此可以采用java反射机制做一个BaseDao,把ResultSet 映射到Object 的操作封装起来,简化了DAO的开发,
本文参照了[url]http://blog.csdn.net/cping1982/archive/2007/10/01/1808647.aspx
[/url]并且做了一点改进
public static String[][] proterty2Column =
{{"member_id","memberId"},
{"name", "name"}};
/**
* change the first char to upper case
* @param s
* @return
*/
private static String upperFirstChar(String s){
char [] chars = s.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
/**
* ResultSet 映射成 Object
* @param clzz
* @param rs
* @param obj
* @param fieldName
* @param varibleName
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws SQLException
* @throws NoSuchFieldException
* @throws SecurityException
*/
private void mapResultSet2Object(ResultSet rs, Object obj, String propertyName,
String columName)
throws NoSuchMethodException, IllegalAccessException,
InvocationTargetException, SQLException,
SecurityException, NoSuchFieldException {
Class < ? extends Object >clazz = obj.getClass();
Class < ? extends Object >propertyType = clazz.getDeclaredField(propertyName).
getType();
Method method = clazz.getDeclaredMethod("set"+
upperFirstChar( propertyName ), new Class[] { propertyType });
if (propertyType == String.class)
method.invoke(obj, (Object [])new String[]
{rs.getString( columName ) });
else if (propertyType == int.class)
method.invoke(obj, (Object [])new Integer[]
{new Integer( rs.getInt( columName )) });
else if (propertyType == float.class)
method.invoke(obj, (Object [])new Float[]
{new Float( rs.getFloat( columName )) });
else if (propertyType == long.class)
method.invoke(obj, (Object [])new Long[]
{new Long( rs.getLong( columName )) });
else if (propertyType == double.class)
method.invoke(obj, (Object [])new Double[]
{new Double( rs.getDouble( columName )) });
else if(propertyType == Date.class){
method.invoke(obj, (Object [])new Date[]
{rs.getDate(columName)});
}
}
/**
* 单行查询
* @param
* @param conn
* @param sql
* @param clazz
* @param params
* @return
* @throws Exception
*/
public <T> T getItem(Connection conn, String sql, Class<T> clazz,
String params[])throws Exception{
PreparedStatement pstmt = null;
ResultSet rset = null;
T t = null;
try {
pstmt = conn.prepareStatement(sql);
//set parameter
for(int i=0; i<params.length; i++){
pstmt.setString(i+1, (String)params[i]);
}
rset = pstmt.executeQuery();
if (rset.next()) {
t = clazz.newInstance();
for(int i=0; i< proterty2Column.length; i++) {
String propertyName = proterty2Column[i][1].trim();
String ColumnName = proterty2Column[i][0].trim();
mapResultSet2Object(rset, t, propertyName, ColumnName);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rset);
}
return t;
}
/**
* 多行查询
* @param
* @param conn
* @param sql
* @param proterty2Column
* @param clazz
* @return
* @throws Exception
*/
public <T> List <T> getItems(Connection conn, String sql, Class<T> clazz,
String[] params) throws Exception{
if (proterty2Column.length == 0)
return null;
PreparedStatement pstmt = null;
ResultSet rset = null;
List<T> list = new ArrayList<T>();
try {
pstmt = conn.prepareStatement(sql);
for(int i=0; i<params.length; i++){
pstmt.setString(i+1, (String)params[i]);
}
rset = pstmt.executeQuery();
while (rset.next()) {
for(int i=0; i< proterty2Column.length; i++) {
String propertyName = proterty2Column[i][1].trim();
String ColumnName = proterty2Column[i][0].trim();
fetchResult2Object(rset, obj, propertyName, ColumnName);
}
if( null == obj ) continue;
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rset);
}
return list;
}