使用MySQL的时候不太会出现这样的情况,因为MySQL的数据类型比较明确,都有对应的类型可以进行操作,而Oracle的基本数据类型都是number类型的,从Oracle查到的数据到Java中很容易产生这个问题,下面是解决方法
这是查询一条数据的查询方法,通用方法
public static <T> T select(Connection conn, Class<T> clazz, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount(); // 获取列数
if (rs.next()) {
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columValue = rs.getObject(i + 1); // 获取每列的值
String columnLabel = rsmd.getColumnLabel(i + 1); // 获取别名
Field field = clazz.getDeclaredField(columnLabel.toLowerCase());
field.setAccessible(true);
// 从数据库中获取到的是BigDecimal类型的数据,需要转换成包装类的对象
if (columValue instanceof BigDecimal) {
Constructor<?> dc = field.getType().getDeclaredConstructor(String.class);
columValue = dc.newInstance(columValue.toString());
}
field.set(t, columValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(null, ps, rs);
}
return null
这个通过反射进行处理了我们自己定义的实体的基本数据类型,把数据库中的BigDecimal类型的数据按照对应的属性类型进行转换。
这是查询多条数据的通用方法
public static <T> List<T> selectList(Connection conn, Class<T> clazz, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
ArrayList<T> list = new ArrayList<>();
while (rs.next()) {
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
String columnLabel = rsmd.getColumnLabel(i + 1); // 获取别名
Object columValue = rs.getObject(i + 1); // 获取每个数的值
Field field = clazz.getDeclaredField(columnLabel.toLowerCase());
field.setAccessible(true);
if (columValue instanceof BigDecimal) {
Constructor dc = field.getType().getDeclaredConstructor(String.class);
columValue = dc.newInstance(columValue.toString());
}
field.set(t, columValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(null, ps, rs);
}
return null;
}
原理和查询一条数据的是一个道理