Sobes.tech
Junior

Wymień główne typy danych używane w JDBC i wyjaśnij, jak są one powiązane z typami danych w Javie.

sobes.tech AI

Odpowiedź od AI

Główne typy danych JDBC są zdefiniowane w klasie java.sql.Types. Reprezentują one standardowe typy SQL. Typy danych JVM w Javie są zdefiniowane w specyfikacji języka. JDBC zapewnia mapowanie (mapping) między tymi dwoma zestawami typów.

Główne typy w java.sql.Types:

  • BOOLEAN
  • TINYINT
  • SMALLINT
  • INTEGER
  • BIGINT
  • REAL
  • FLOAT
  • DOUBLE
  • DECIMAL
  • NUMERIC
  • CHAR
  • VARCHAR
  • LONGVARCHAR
  • DATE
  • TIME
  • TIMESTAMP
  • BINARY
  • VARBINARY
  • LONGVARBINARY
  • BLOB
  • CLOB
  • NCHAR
  • NVARCHAR
  • LONGNVARCHAR
  • NCLOB
  • SQLXML

Mapowanie między typami JDBC a typami Java podczas pobierania danych (z ResultSet):

Typ JDBC Typ Java (get) Uwagi
BOOLEAN, BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT, DOUBLE double
DECIMAL, NUMERIC java.math.BigDecimal Zalecane
CHAR, VARCHAR, LONGVARCHAR String
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
BINARY, VARBINARY, LONGVARBINARY byte[]
BLOB java.sql.Blob
CLOB java.sql.Clob
NCHAR, NVARCHAR, LONGNVARCHAR String
NCLOB java.sql.NClob
SQLXML java.sql.SQLXML

Uwaga: Dla typów numerycznych, oprócz typów prymitywnych, można używać odpowiadających im klas opakowujących (Boolean, Byte, Short, Integer, Long, Float, Double) do obsługi wartości NULL.

Podczas ustawiania danych (w PreparedStatement) zazwyczaj stosuje się odwrotne mapowanie, ale istnieją wyjątki i preferencje. Na przykład dla DECIMAL lepiej używać BigDecimal.

Przykład użycia:

// Metoda pobierająca dane z ResultSet
public String getStringValue(ResultSet rs, String columnName) throws SQLException {
    // Pobierz wartość tekstową z kolumny
    return rs.getString(columnName);
}

// Metoda ustawiająca wartość w PreparedStatement
public void setIntValue(PreparedStatement ps, int parameterIndex, int value) throws SQLException {
    // Ustaw wartość całkowitą parametru
    ps.setInt(parameterIndex, value);
}