通过JDBC连接Oracle数据库时进行查询操作时产生BigDecimal转换异常的处理

使用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;
	}

原理和查询一条数据的是一个道理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值