public class BaseDao { /**
 * 反射封装查询
 */
public static  List  queryList(String tableName,Object obj) throws Exception{
Class c = obj.getClass();//获取映射对象
Field[] f = c.getDeclaredFields();//获取传进来的对象的所有属性
Connection conn = ConnUtil.getConn();
StringBuilder sql = new StringBuilder("select * from "+tableName+" t  where 1=1 ");
List valueList = new ArrayList();//如果属性值不为空,我就把值保存到valueList内
for(int i = 0;i<f.length;i++){
String str = f[i].getName();//获取属性名
//拼接属性对象的访问器方法名
String methodName = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
Method m = c.getMethod(methodName);
Object value = m.invoke(obj, null);//调用属性对象的访问器,获取返回值
if(value != null){
valueList.add(value);
sql.append(" and  t."+str+" = ?");
}
}
PreparedStatement ps = conn.prepareStatement(sql.toString());//预处理sql语句
//填坑
int count = 0;
for(int i = 0;i<valueList.size();i++){
ps.setObject(++count, valueList.get(i));
}
ResultSet rs = ps.executeQuery();//获取结果集
List result =new ArrayList();//定义返回结果集合
while(rs.next()){
Object o = c.newInstance();
for(int i = 0;i<f.length;i++){
String name = f[i].getName();
String methodSetName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
Method mSet = c.getMethod(methodSetName,f[i].getType());
String[] fieldType = f[i].getType().getName().split("\\.");
if(rs.getObject(name) != null){
String[] resultValue =  rs.getObject(name).getClass().getName().split("\\.");
if(resultValue[resultValue.length-1].equals("BigDecimal")){
if(fieldType[fieldType.length-1].equ("Integer")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).intValue());
}else if (fieldType[fieldType.length-1].equals("Double")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).doubleValue());
}else if(fieldType[fieldType.length-1].equals("Long")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).longValue());
}
}else if(resultValue[resultValue.length-1].equals("Date")){
mSet.invoke(o,((java.sql.Date)rs.getObject(name)).toString());
}else{
mSet.invoke(o,rs.getObject(name));
}
}
}
result.add(o);
}
return result;
}
}
我这里用一个表测了一下,里面有一个日期型的,我把它定义成string了,但是查的时候有问题了,就是上面的sql.append(" and  t."+str+" = ?");
这句话,如果t.str在oracle里是日期的话,而问号时字符串类型的话,这个该怎么封装呀,难道用日期就不可以查了吗?

解决方案 »

  1.   

    append(" and t."+str+" = ?");
    str是表里的字段名吗?
      

  2.   

    你可以写一个函数转一下撒。
    果果,你要考虑到布尔型的is
    String methodName = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
      

  3.   

    恩,是表里的字段,这个函数怎么写呀,要判断表里的字段是不是date的,求解
      

  4.   

    太乱了。
    DAO层处理的东西太多了。用反射处理这个,不一定是最好的,效率会比较低下的。