PreparedStatement的setString与setObject关于传入为null值时替换

报错信息:

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [ INSERT INTO M_OP (ID,AG,FLAG) VALUES(?,?,?)]; .....Incorrect decimal value: 'null' for column 'AG' at row 1 .... nested exception is java.sql.BatchUpdateException:

应用场景: 应用中通过jdbc从远程Oracle数据源读取A表数据,再通过jdbc插入Mysql数据库B张表。因为A、B两表字段均可为null。导致从A读出数据为null时,使用setString(int parameterIndex, String x)null值无法转换,导致后续sql执行失败,但是替换为void setObject(int parameterIndex, Object x)正常转换。

代码如下:

  public List<Map<String, Object>> getDetail(String No) {
        String sql = " SELECT ID, AG,'01' AS FLAG FROM AG_DETAIL WHERE FLAG ='02' AND NO = ? ";
        return jdbcOracle.queryForList(sql, No);
    }
 
  public int[] insDetail(final List<Map<String, Object>> list) {
        String sql = " INSERT INTO M_OP (ID,AG,FLAG,) VALUES(?,?,?)";
        return jdbcMysql.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                Map<String, Object> map = list.get(i);
                ps.setString(1, String.valueOf(map.get("ID")));
	        ps.setString(2, String.valueOf(map.get("AG")));
                ps.setString(3, String.valueOf(map.get("FLAG")));
            }
			
            @Override
            public int getBatchSize() {
                return list.size();
            }
        });
    }

应用中调用:insDetail(getDetail(no));

解决:把setString(int parameterIndex, String x)替换为setObject(int parameterIndex, Object x).

代码如下:

public int[] insDetail(final List<Map<String, Object>> list) {
        String sql = " INSERT INTO M_OP (ID,AG,FLAG,) VALUES(?,?,?)";
        return jdbcMysql.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                Map<String, Object> map = list.get(i);
                ps.setObject(1, map.get("ID"));
	        ps.setObject(2, map.get("AG"));
                ps.setObject(3, map.get("FLAG"));
            }
			
            @Override
            public int getBatchSize() {
                return list.size();
            }
        });
    }



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值