JDBC 查询公用类 初学可以练习逻辑

weixin_47997430 2020-07-27 10:08:10

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);
}




...全文
1212 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
廾匸随笔 2020-07-28
  • 打赏
  • 举报
回复
如果你这是给入行新人看的,那你这命名风格应该再规范一些。 再者,新人看不懂,老人不想看

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧