Hibernate根據(jù)配置文件從數(shù)據(jù)庫中把關(guān)系型的數(shù)據(jù)以對象的形式挖掘出來,那么假如我有一個Table控件,可以放置展現(xiàn)任何的表結(jié)構(gòu),如何在運行期做到把數(shù)據(jù)載入呢?Hibernate已經(jīng)把數(shù)據(jù)讀成對象的形式,就注定沒有JDBC一般靈活,為次可以通過編寫如下的兩個工具方法來實現(xiàn):
import java.lang.reflect.Method;
/**
* 獲取指定bean的指定字段的值
*/
public class BeanUtils {
private BeanUtils(){}
/**
* 根據(jù)beanName和列名字獲取hql語句
* @param beanName
* @param columnNames
* @return 以list形式返回數(shù)據(jù)的hql語句
*/
public static String getHql(String beanName, String[] columnNames){
StringBuffer sb = new StringBuffer();
sb.append("select new list(");
StringBuffer columnString = new StringBuffer();
for(int i=0,len=columnNames.length;i<len;i++){
columnString.append(",");
columnString.append(columnNames[i]);
}
sb.append(columnString.substring(1));
sb.append(") from ");
if(Character.isUpperCase(beanName.charAt(0)))
sb.append(beanName);
else
sb.append(upperFirstChar(beanName));
return sb.toString();
}
/**
* @param bean 獲取到的域?qū)ο?br />
* @param fieldName 欲獲取值的字段名
* @return 字段在當前bean封裝下的值
*/
public static Object getFieldByName(Object bean, String fieldName){
try {
Method m = bean.getClass().getMethod("get"+upperFirstChar(fieldName), null);
return m.invoke(bean, null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String upperFirstChar(String orig){
return Character.toUpperCase(orig.charAt(0)) + orig.substring(1);
}
}
按照已經(jīng)處理后,我們就可以既應用Hibernate對象訪問的優(yōu)點,又不損失字符串的靈活性,代碼中應用了Hibernate的select特性及java的反射機制
@2008 楊一. 版權(quán)所有. 保留所有權(quán)利