protected RecordReader<LongWritable, T> createDBRecordReader(
      DBInputSplit split, Configuration conf) throws IOException {

    @SuppressWarnings("unchecked")
    Class<T> inputClass = (Class<T>) (dbConf.getInputClass());
    try {
      // use database product name to determine appropriate record reader.
      if (dbProductName.startsWith("ORACLE")) {
        // use Oracle-specific db reader.
        return new OracleDBRecordReader<T>(
            split, inputClass, conf, connection, getDBConf(), conditions, fieldNames, tableName);
      } else if (dbProductName.startsWith("MYSQL")) {
        // use MySQL-specific db reader.
        return new MySQLDBRecordReader<T>(
            split, inputClass, conf, connection, getDBConf(), conditions, fieldNames, tableName);
      } else {
        // Generic reader.
        return new DBRecordReader<T>(
            split, inputClass, conf, connection, getDBConf(), conditions, fieldNames, tableName);
      }
    } catch (SQLException ex) {
      throw new IOException(ex.getMessage());
    }
  }