在JAVA项目开发中,我们经常需要用到反射,但是在使用的过程中,数据类型的转换一直影响着我们开发的进度,下面是我对这一问题的解决方案,如大家有其它更好的解决方案希望能与之分享。
一:我们需要将commons-beanutils-1.8.2.jar和commons-logging-1.0.4.jar放在项目的WebRoot/Web-inf/lib文件夹下,(如果需要上述组件可以通过邮箱:btqnyao@163.com联系我)从新发布项目。
二:我通过从数据库读取的一个方法想大家介绍下使用方法。
public static List excuteQuerry(String sqlString,String[] para,Class cla){
Connection connection=null;
PreparedStatement pStatement=null;
ResultSet rSet=null;
connection=getConnection();
List list = new ArrayList();
try {
pStatement=connection.prepareStatement(sqlString);
addParam(para, pStatement);
rSet=pStatement.executeQuery(); //执行查询操作
ResultSetMetaData rsmd= rSet.getMetaData(); //用于获取ResultSet对象中列的类型和属性信息
int count= rsmd.getColumnCount(); //获得rSet中有多少列
String[] columnName=new String[count];
for(int i=0;i<count;i++){
columnName[i]=rsmd.getColumnName(i+1); //得到rSet结果集中的所有列的名字
}
//PropertyUtils主要是利用反射机制对JavaBean的属性进行处理。支持不同类型的自行转换
//得到JavaBean的所有属性的描述
PropertyDescriptor[] pd=PropertyUtils.getPropertyDescriptors(cla);
while(rSet.next()){
Object obj=null;
try {
obj = cla.newInstance(); //创建新对象,便于存储
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
for(int i=0;i<count;i++){
for(int j=0;j<pd.length;j++){
if(columnName[i].equalsIgnoreCase(pd[j].getName())){
Object value=rSet.getObject(columnName[i]); //从数据库获得对应属性的值
if(value!=null){
try {
//BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理,不支持数据类型的自动转换
BeanUtils.setProperty(obj,columnName[i],value); //通过BeanUtils对JavaBean进行赋值
list.add(obj);
} catch (IllegalAccessException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
}
}
} catch (SQLException e) {
throw new DaoException("执行非查询操作出错",e);
}finally{
closeAll(null, pStatement, connection);
}
return list;
}