Hibernate根据配置文件从数据库中把关系型的数据以对象的形式挖掘出来,那么假如我有一个Table控件,可以放置展现任何的表结构,如何在运行期做到把数据载入呢?Hibernate已经把数据读成对象的形式,就注定没有JDBC一般灵活,为次可以通过编写如下的两个工具方法来实现:
import java.lang.reflect.Method;
/**
* 获取指定bean的指定字段的值
*/
public class BeanUtils {
private BeanUtils(){}
/**
* 根据beanName和列名字获取hql语句
* @param beanName
* @param columnNames
* @return 以list形式返回数据的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 获取到的域对象
* @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);
}
}
按照已经处理后,我们就可以既应用Hibernate对象访问的优点,又不损失字符串的灵活性,代码中应用了Hibernate的select特性及java的反射机制
@2008 杨一. 版权所有. 保留所有权利