/**
 * 支持预编译
 * 
 * @param sql:SQL语句
 * @param classpath:bean的完全路劲
 * @param columns:列名
 * @param IN参数
 * @return 返回查询结果
 */
public static List<Object> execute(String sql, String classpath,
String[] columns, Object[] params) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<Object> list = new Vector<Object>();
try {
con = new OperateDatabaseAction().getConnection();
pstmt = con.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i, params[i]);
}
}
rs = pstmt.executeQuery();
while (rs.next()) {
Object obj = Class.forName(classpath).newInstance();
for (String column : columns) {
String method = "set"
+ column.substring(0, 1).toUpperCase()
+ column.substring(1).toLowerCase();
obj.getClass().getMethod(method, String.class).invoke(obj,
rs.getString(column));
}
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}现在的问题:只能获取String类型的值,如何让其能取所有的类型的值(用Object肯定不行)
我不想用死方法,比如:再添一个参数对应列名的类型,然后每次都去判断用哪个类型(推荐用这类方法不给分)。
望大家能指点,谢谢

解决方案 »

  1.   

    如果要想自动获得类型,可以用数据库的metadata判断列的类型,然后再去除相应值加到list里了。
      

  2.   

    对DatabaseMetaData不熟,能给个例子不?谢谢
      

  3.   


    /**
     * 支持预编译,只支持单表的增删改查
     * 
     * @param sql:SQL语句
     * @param classpath:bean的完全路劲
     * @param columns:列名(为空时对bean有setXxxx方法的属性赋值)
     * @param IN参数(可以为空)
     * @return 返回[查询结果集]/[true](增删改操作)/[异常信息]
     * 
     */
    public static List<Object> executeSql(String sql, String className,
    String[] columns, Object[] params) {
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    List<Object> list = new Vector<Object>();
    try {
    con = getConnection();
    if (sql.toLowerCase().startsWith("select")) {
    con.setReadOnly(true);
    }
    pstmt = con.prepareStatement(sql);
    if (params != null) {
    for (int i = 0; i < params.length; i++) {
    pstmt.setObject(i, params[i]);
    }
    }
    if (pstmt.execute()) {
    rs = pstmt.getResultSet(); // 查询操作获取结果集
    } else {
    list.add(true); // 增删改操作成功
    return list;
    }
    if (columns == null) {
    while (rs.next()) {
    Class c = Class.forName(className);
    Object obj = c.newInstance();
    Method[] methods = c.getDeclaredMethods();
    for (Method m : methods) {
    if (m.getName().startsWith("set")) {
    m.invoke(obj, rs.getObject(m.getName().substring(3,
    4).toLowerCase()
    + m.getName().substring(4)));
    }
    }
    list.add(obj);
    }
    } else {
    while (rs.next()) {
    Class c = Class.forName(className);
    Object obj = c.newInstance();
    Method[] methods = c.getDeclaredMethods();
    for (String column : columns) {
    String method = "set"
    + column.substring(0, 1).toUpperCase()
    + column.substring(1).toLowerCase();
    for (Method m : methods) {
    if (method.equals(m.getName())) {
    m.invoke(obj, rs.getObject(column));
    }
    }
    }
    list.add(obj);
    }
    }
    } catch (Exception e) {
    list.add(e.getMessage());
    return list;
    } finally {
    try {
    if (rs != null) {
    rs.close();
    }
    if (pstmt != null) {
    pstmt.close();
    }
    if (con != null) {
    con.close();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    return list;
    }指望不上CSDN了。
    上面的代码还是有BUG的,谁指出有分啊。。
      

  4.   

    使用CachedRowSet直接返回记录集
      

  5.   

     Class c = Class.forName(className);
     Object o=c.newInstance();
      Field[] fields=c.getDeclaredFields();
     for(int i=0;i<fields.length;i++){
        Field f=fields[i];
        String name=f.getName();
        
        f. setAccessible(true);
        try
         {
            f.set(o,rs.getObject(name.toUppercase()));
         }catch(..){..}
     }
      

  6.   

    你传递参数的时候已经知道了具体的列,难道就不知道具体的列的类型吗?在组一个数组么typeColumn然后传递给
    types,
    Class[] types = new Class[] { String.class, String.class,...... };
    obj.getClass().getMethod(method, types[N]).invoke(obj,
                                rs.getString(column));
    应该是可以吧,我只是想,希望没误导!
      

  7.   

    我不知道你测试过你顶的这个方法没有。
    上面的方法,我测了三种类型而已 boolean,int和String,只有String不报错
    不知道怎么讲,反正我个人也试过各种方法想一劳永逸,都失败了,也许是能力问题吧
    不传判断参数类型,直接传Object,我反正没有成功过
      

  8.   

    我说了最后一段代码是有BUG的
    1,如果表中数据0,1表示true,false那没办法
    2,不支持基本类型。为何不用Boolean,Integer来代替基本类型呢?(如果你写Bean类时爱好用基本类型,那也没办法)