/**
* 支持预编译
*
* @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肯定不行)
我不想用死方法,比如:再添一个参数对应列名的类型,然后每次都去判断用哪个类型(推荐用这类方法不给分)。
望大家能指点,谢谢
/**
* 支持预编译,只支持单表的增删改查
*
* @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的,谁指出有分啊。。
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(..){..}
}
types,
Class[] types = new Class[] { String.class, String.class,...... };
obj.getClass().getMethod(method, types[N]).invoke(obj,
rs.getString(column));
应该是可以吧,我只是想,希望没误导!
上面的方法,我测了三种类型而已 boolean,int和String,只有String不报错
不知道怎么讲,反正我个人也试过各种方法想一劳永逸,都失败了,也许是能力问题吧
不传判断参数类型,直接传Object,我反正没有成功过
1,如果表中数据0,1表示true,false那没办法
2,不支持基本类型。为何不用Boolean,Integer来代替基本类型呢?(如果你写Bean类时爱好用基本类型,那也没办法)