干货 java jdbc ResultSet结果通过java反射赋值给java对象
2017-04-11 11:48
513 查看
在不整合框架的情况下,使用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);
因为很多情况下数据不止一条,所以返回的是对象类的一个集合。
需要注意的地方:在这里,数据库字段命名格式为: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);
相关文章推荐
- java_jdbc_反射技术将查询结果封装为对象
- 通过JAVA反射实现简单的ORM,将查询结果封装为对象
- JAVA jdbc ResultSet 通过反射机制转换为实体类Bean
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
- JDBC_利用Java反射技术将查询结果封装为对象
- Java通过反射创建对象
- Java通过反射创建对象
- 通过java反射获取任意对象的字段名及字段值
- 通过Java的反射机制来Copy一个对象
- 通过java反射获取任意对象的字段名及字段值
- 代码 - 通过反射对象属性进行遍历赋值
- Java通过反射机制使用非默认构造器创建对象
- 使用java反射将数据库结果集转换成对象结果集
- 通过java反射获取任意对象的字段名及字段值
- Java通过反射创建对象
- 通过反射将数组中的元素给一个对象中的各个字段赋值
- 遍历Java对象,并执行其中的方法(通过反射执行方法)
- Java通过反射实现简单对象的拷贝
- java通过反射,泛型将定义的对象与对象之间互转
- 设计模式之1.1 再谈反射 以及java当中通过配置文件得到类名字,并生成对象的方法