Java PreparedStatement,当batchExecute没有任何参数时会发生什么?

时间:2014-09-08 17:19:39

标签: java jdbc nullpointerexception prepared-statement

我在方法中收到NullPointerException。我唯一可疑的部分是我可能没有在我准备好的陈述中添加任何参数。代码如下

try {
  String sql = "update myTable set Name = 'valid' where startDate = ?";
  myPrepStatement = conn.prepareStatement(sql);
  for(Date date : dateList) {
    myPrepStatement.setDate(1,date);
    myPrepStatement.addBatch();
  } 
  myPrepStatement.executeBatch();
}
catch (Exception e){

}

假设conn设置正确并且所有其他变量都已正确初始化。如果dateList为空,我是否可以收到NullPointerException? 感谢

2 个答案:

答案 0 :(得分:1)

  

如果dateList为空,我是否可以收到NullPointerException

这取决于PreparedStatement接口的JDBC实现。

但一般来说,如果dateList为空,则不会向PreparedStatement添加批处理操作,因此在执行executeBatch时,它应该不执行任何操作,并且不应该引发异常。

答案 1 :(得分:0)

来自documentation

public interface PreparedStatement extends Statement
  

如果dateList为空,我是否可以收到   的NullPointerException?

因此,如果您想100%确定,那么您应该深入了解JDBC驱动程序实现代码。

例如,MariaDB JDBC驱动程序实现:

public void addBatch() throws SQLException {
    if (this.batchPreparedStatements == null) {
        this.batchPreparedStatements = new ArrayList();
    }
    this.batchPreparedStatements.add(new MySQLPreparedStatement(
            this.connection, this.sql, this.dQuery,
            this.useFractionalSeconds));
}

MySQL JDBC驱动程序实现:

public synchronized void addBatch()
    throws SQLException
  {
    if (this.batchedArgs == null) {
      this.batchedArgs = new ArrayList();
    }

    for (int i = 0; i < this.parameterValues.length; ++i) {
      checkAllParametersSet(this.parameterValues[i], this.parameterStreams[i], i);
    }

    this.batchedArgs.add(new BatchParams(this.parameterValues, this.parameterStreams, this.isStream, this.streamLengths, this.isNull));
  }