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

在给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模块


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

你可能感兴趣的:(异常处理,数据库)