在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以博主利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了。
因为很多情况下数据不止一条,所以返回的是对象类的一个集合。
需要注意的地方:在这里,数据库字段命名格式为:user_name 下划线格式,而java类型的命名格式为驼峰命名格式。
具体代码如下:
/**
* 把ResultSet的结果放到java对象中
*
* @param <T>
* @param rs
* ResultSet
* @param obj
* java类的class
* @return
*/
public static <T> ArrayList<T> putResult(ResultSet rs, Class<T> obj) {
try {
ArrayList<T> arrayList = new ArrayList<T>();
ResultSetMetaData metaData = rs.getMetaData();
/**
* 获取总列数
*/
int count = metaData.getColumnCount();
while (rs.next()) {
/**
* 创建对象实例
*/
T newInstance = obj.newInstance();
for (int i = 1; i <= count; i++) {
/**
* 给对象的某个属性赋值
*/
String name = metaData.getColumnName(i).toLowerCase();
name = toJavaField(name);// 改变列名格式成java命名格式
String substring = name.substring(0, 1);// 首字母大写
String replace = name.replaceFirst(substring, substring.toUpperCase());
Class<?> type = obj.getDeclaredField(name).getType();// 获取字段类型
Method method = obj.getMethod("set" + replace, type);
/**
* 判断读取数据的类型
*/
if(type.isAssignableFrom(String.class)){
method.invoke(newInstance, rs.getString(i));
}else if(type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)){
method.invoke(newInstance, rs.getInt(i));
}else if(type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)){
method.invoke(newInstance, rs.getBoolean(i));
}else if(type.isAssignableFrom(Date.class)){
method.invoke(newInstance, rs.getDate(i));
}
}
arrayList.add(newInstance);
}
return arrayList;
} catch (InstantiationException | IllegalAccessException | SQLException | SecurityException
| NoSuchMethodException | IllegalArgumentException | InvocationTargetException
| NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 数据库命名格式转java命名格式
*
* @param str
* 数据库字段名
* @return java字段名
*/
public static String toJavaField(String str) {
String[] split = str.split("_");
StringBuilder builder = new StringBuilder();
builder.append(split[0]);// 拼接第一个字符
// 如果数组不止一个单词
if (split.length > 1) {
for (int i = 1; i < split.length; i++) {
// 去掉下划线,首字母变为大写
String string = split[i];
String substring = string.substring(0, 1);
split[i] = string.replaceFirst(substring, substring.toUpperCase());
builder.append(split[i]);
}
}
return builder.toString();
}
如何使用:
上面的方法存在C3P0PropertiesSimplifyHelps类里,putResult是一个静态方法,DeviceMsg是我自定义的po类(也是需要存放信息的po类
ArrayList<DeviceMsg> putResult = C3P0PropertiesSimplifyHelps.putResult(rs, DeviceMsg.class);