在给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 sqlType是java.sql.Types中定义的SQL类型,比如,上文代码应该为ps.setNull(k++, Types.INTEGER);
如果数据类型为double, ps.setNull(k++, Types.DOUBLE);具体情况一定要参照java.sql.Types类中的数据类型
总结:setObject() 和setNull() 提供了方法,可以解决空指针异常,但是当参数数据较多,且为了避免空指针问题,后续使用NamedParameterJdbcTemplate模块
如要转载请注明出处及此文链接!!!!!!