public synchronized void close() throws SQLException {
    if (this.pooledConnection == null) {
      // no-op
      return;
    }

    MysqlPooledConnection con = this.pooledConnection; // we need this later...

    try {
      super.close();
    } finally {
      try {
        StatementEvent e = new StatementEvent(con, this);
        // todo: pull this all up into base classes when we support *only* JDK6 or newer
        if (con instanceof JDBC4MysqlPooledConnection) {
          ((JDBC4MysqlPooledConnection) con).fireStatementEvent(e);
        } else if (con instanceof JDBC4MysqlXAConnection) {
          ((JDBC4MysqlXAConnection) con).fireStatementEvent(e);
        } else if (con instanceof JDBC4SuspendableXAConnection) {
          ((JDBC4SuspendableXAConnection) con).fireStatementEvent(e);
        }
      } finally {
        this.unwrappedInterfaces = null;
      }
    }
  }
 ResultSetWrapper getTimestampResultSetWrapperWithNulls(Connection connection)
     throws SQLException {
   DatabaseMetaData metaData = connection.getMetaData();
   connection
       .createStatement()
       .execute(
           "create table test1 (id int primary key, test1 timestamp, test2 date, test3 time)");
   PreparedStatement statement =
       connection.prepareStatement("insert into test1 values (?, ?, ?, ?)");
   statement.setInt(1, 1);
   PreparedStatementWrapper statementWrapper = new PreparedStatementWrapper(statement);
   statementWrapper.setLocalDateTime(2, null);
   statementWrapper.setLocalDate(3, null);
   statementWrapper.setLocalTime(4, null);
   assertEquals(1, statement.executeUpdate());
   ResultSet resultSet = connection.createStatement().executeQuery("select * from test1");
   assertTrue(resultSet.next());
   return new ResultSetWrapper(metaData, resultSet);
 }