62,614
社区成员
发帖
与我相关
我的任务
分享
static int l;
public <T> List<T> getAll(String sql, T classS, Object... objects)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
List<T> listNews_detail = null;
l = objects.length;// Object... objects以数组形式返回 长度
Object[] params = new Object[l];// 实例化数组的 长度是L
for (int i = 0; i < objects.length; i++) {
params[i] = objects[i];// 实例化数组的后赋值
++l;
}
ResultSet rs = QueryDataBase(sql, params);// 调用方法
try {
Class<? extends Object> Newclass = classS.getClass();// 反射classS类
Object newInstance = null;
listNews_detail = new ArrayList<>();// 定义的数组
Class<?> forName = Class.forName(Newclass.getName());// 反射类
Field[] declaredFields = forName.getDeclaredFields();// 反射出classS类里面的属性以数组
String columnName = null;
while (rs.next()) {// 指针指向行
newInstance = forName.newInstance();// 调用构造 数据类型和数据库数据类型一样
for (int j = 0; j < declaredFields.length; j++) {// declaredFields.length属性数量
// declaredFields[j].getName()数组形式获得名称--在通过forName.getDeclaredField返回属性(不是属性字符串)
Field declaredField = forName.getDeclaredField(declaredFields[j].getName());
Class<?> type = (Class<Object>) declaredFields[j].getType();// declaredFields[j].getType()数组形式获得类型
String name = declaredFields[j].getName();// declaredFields[j].getName()数组形式获得名称
declaredField.setAccessible(true);// 将可访问private的方法。
String newName = name.substring(0, 1).toUpperCase() + name.substring(1);// 字符串截取首字母并且大写
Method method = forName.getMethod("set" + newName, type);// forName.getMethod--调用反射类中的方法
// --类型是type(转换的)
// String columnName = rs.getMetaData().getColumnName()//显示sql语句里面*的数量;
int columnCount = rs.getMetaData().getColumnCount();// 字段长度
if ((j + 1) <= columnCount) {// 控制getColumnLabel(j + 1);括弧里面的长度
columnName = rs.getMetaData().getColumnLabel(j + 1);// getMetaData()获得表--getColumnLabel(j +
// 1)获得表列的名字
}
// System.out.println(columnName.equals(name));
// System.out.println(columnName + rs.getMetaData().getColumnCount());
if (type == Integer.class) {// 比较类型是否等于改类型
if (columnName.equals(name)) {// 判断表列是否存在
method.invoke(newInstance, rs.getInt(name));// 使用调用的方法赋值 (类,赋值)
}
} else if (type == Object.class) {
if (columnName.equals(name)) {
method.invoke(newInstance, rs.getObject(name));
}
} else if (type == String.class) {
if (columnName.equals(name)) {
method.invoke(newInstance, rs.getString(name));
}
} else if (type == Double.class) {
if (columnName.equals(name)) {
method.invoke(newInstance, rs.getDouble(name));
}
} else if (type == Date.class) {
if (columnName.equals(name)) {
method.invoke(newInstance, rs.getDate(name));
}
} else if (type == Short.class) {
if (columnName.equals(name)) {
method.invoke(newInstance, rs.getShort(name));
}
}
}
listNews_detail.add((T) newInstance);// 添加集合
}
return listNews_detail;
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} finally {
close(rs);
return listNews_detail;
}
}
String sql = "SELECT id,categoryId,summary FROM news_detail WHERE summary=?;";
BestDao dao = new BestDao();
News_detail detail = new News_detail();
List<News_detail> all = dao.getAll(sql, detail, "测试内容5");//可不填最后一个参数 依据sql语句灵活变动
for (Object object : all) {
System.out.println(object);
}