预编译语句PreparedStatement映射中NULL POINT EXCEPTION空指针异常

在使用PreparedStatement设置SQL语句参数时,直接使用setInt()等方法可能引发空指针异常。解决办法包括使用setObject(),传入null值不会有问题,或者使用setNull(),但需指定SQL类型。当数据量大时,可以考虑使用NamedParameterJdbcTemplate来避免空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在给sql语句中的占位符赋值时,使用preparedStatemen.setInt()等对基本类型赋值的方法时,容易出现空指针异常;

以下,为实际工作中出现的案例:

应用场景:页面发送请求,将页面数据在数据库中保存,并返回主键值id,相关表的字段checkerId为int类型,可以为null

实际代码:下文代码中ps.setLong()    ps.setInt()都可能会出现空指针异常

final String sql = "INSERT INTO `soc_sheet` (\n" +
	     "`SHEET_TITLE`, `APPLY_COMPANY`,    `APPLY_USER_NAME`,\n" +
	     "`APPLY_USER_TEL`,  `APPLY_USER_MAIL`,  `APPLY_CONTENT`,\n" +
	     "`APPLY_REASON`,    `SHEET_STATUS`, `CREATER_ID`,   `CREATER_NAME`,\n" +
	     "`APPLY_TIME`,  `CHECKER_NAME`, `CHECKER_ID`,   `SHEET_TYPE`,\n" +
	     "`ASSIGN_SHEET_TYPE`,`SHEET_NO_ITSM`)\n" +
	     "VALUES\n" +
	     "(?,?,?,?,?,?,?,?,?,?,NOW(),?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
this.getJdbcTemplate().update(new PreparedStatementCreator() {
    @Override
    public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
	PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
					int k = 1;					
					ps.setString(k++, projectSocSheetEntity.getSheetTitle());
					ps.setString(k++, projectSocSheetEntity.getApplyCompany());
					ps.setString(k++, projectSocSheetEntity.getApplyUserName());
					ps.setString(k++, projectSocSheetEntity.getApplyUserTel());
					ps.setString(k++, projectSocSheetEntity.getApplyUserMail());
					ps.setString(k++, projectSocSheetEntity.getApplyContent());
					ps.setString(k++, projectSocSheetEntity.getApplyReason());
					ps.setString(k++, projectSocSheetEntity.getSheetStatus());
					ps.setLong(k++, projectSocSheetEntity.getCreaterId());
					ps.setString(k++, projectSocSheetEntity.getCreaterName());
					ps.setString(k++, projectSocSheetEntity.getCheckerName());	
					//空指针异常				
					ps.setInt(k++, projectSocSheetEntity.getCheckerId());					
					ps.setString(k++, projectSocSheetEntity.getSheetType());
					ps.setString(k++, projectSocSheetEntity.getAssignSheetType());
					ps.setString(k++, projectSocSheetEntity.getSheetNoItsm());
					return ps;					
				}
			}, keyHolder);
	        Long socSheetId=keyHolder.getKey().longValue();

解决办法:

1.setObject()    Object为java类的顶级父类,null值保存没问题

方法:void setObject(int parameterIndex, Object x) throws SQLException;

2.setNull()      该方法并不适应于所有数据类型

方法:void setNull(int parameterIndex, int sqlType) throws SQLException;

第二个参数int sqlTypejava.sql.Types中定义的SQL类型,比如,上文代码应该为ps.setNull(k++, Types.INTEGER);

如果数据类型为double,     ps.setNull(k++, Types.DOUBLE);具体情况一定要参照java.sql.Types类中的数据类型

总结:setObject() 和setNull() 提供了方法,可以解决空指针异常,但是当参数数据较多,且为了避免空指针问题,后续使用NamedParameterJdbcTemplate模块


如要转载请注明出处及此文链接!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值