之前在网上搜索了许多 实现RowMapper接口 封装查询结果,其中ObjectRowMapper 对个别类的映射好用,但对某些映射是报错,根据报错发现 是ObjectRowMapper中没有对 Timestamp类型的字段结果的封装,于是研究其代码,加了一段对Timestamp类型的字段判断和封装就好了,下面是代码和测试代码,如果使用中报错,可通过测试代码找到缺少的类型的判断,在代码里加上就好。本人技术有限,言辞和注释 都是根据我个人理解,可能不对,勿怪!
→错的地方请指出,谢了,老铁们!
ObjectRowMapper (通用代码)
package com.xdl.util;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import org.springframework.jdbc.core.RowMapper;
public class ObjectRowMapper implements RowMapper {
private Class className;
public ObjectRowMapper(Class className) {
this.className = className;
}
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Object nt = new Object();
Field[] fields = className.getDeclaredFields();// 只能获取自己声明的各种字段 字段名 、字段类型、包路径
try {
nt = className.newInstance(); // 创建此 Class 对象所表示的类的一个新实例
// Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
for (Field field : fields) {// field 相当于单个字段对象 可以.getName 获取字段名
//如果结果中没有改field项则跳过
try {
// field.getName()字段名 将给定的ResultSet 列标签映射到其ResultSet 列索引
rs.findColumn(field.getName());
} catch (Exception e) {
continue;
}
// 修改相应filed的权限,isAccessible 获取此对象的 accessible 标志的值。
boolean accessFlag = field.isAccessible();
// 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java语言访问检查。
// 值为 false 则指示反射的对象应该实施 Java 语言访问检查。
field.setAccessible(true);
// .getString 以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值
String value = rs.getString(field.getName());
value = value == null ? "" : value;
// *******************************
// 调用下面的方法 nt--》为新建的object对象
setFieldValue(nt, field, value);
// *********************************
// 恢复相应field的权限
field.setAccessible(accessFlag);
}
} catch (Exception e) {
e.printStackTrace();
}
return nt;
}
// ************************************************************************************
public static void setFieldValue(Object form, Field field, String value) {
//获取已转成String类型的 字段类型
String elemType = field.getType().toString();
//elemType 是否包含boolean 不包含 返回-1
if (elemType.indexOf("boolean") != -1 || elemType.indexOf("Boolean") != -1) {
try {
//value值转换成 boolean类型
field.set(form, Boolean.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("byte") != -1 || elemType.indexOf("Byte") != -1) {
try {
field.set(form, Byte.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("char") != -1 || elemType.indexOf("Character") != -1) {
try {
field.set(form, Character.valueOf(value.charAt(0)));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("double") != -1 || elemType.indexOf("Double") != -1) {
try {
field.set(form, Double.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("float") != -1 || elemType.indexOf("Float") != -1) {
try {
field.set(form, Float.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("int") != -1 || elemType.indexOf("Integer") != -1) {
try {
field.set(form, Integer.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("long") != -1 || elemType.indexOf("Long") != -1) {
try {
field.set(form, Long.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if (elemType.indexOf("short") != -1 || elemType.indexOf("Short") != -1) {
try {
field.set(form, Short.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}// ↓↓↓↓↓↓ 下面这段就是我添加的Timestamp类型 ↓↓↓↓↓↓
} else if (elemType.indexOf("timestamp") != -1 || elemType.indexOf("Timestamp") != -1) {
try {
field.set(form, Timestamp.valueOf(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
else {
try {
// ***************************
field.set(form, (Object) value);
// ***************************
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
调试代码:
(找到ObjectRowMapper 中判断不存在的字段类型,再配上就好了!)
@Test
public void test3(){
Field[] fields = XdlProduct.class.getDeclaredFields();// 只能获取自己声明的各种字段
for (Field field : fields) {
System.out.println("字段名:"+field.getName());
System.out.println("字段类型:"+field.getType().toString());
System.out.println("------------------------------");
}
}