Tipos de datos

Echemos un vistazo a la tabla:

"C:\Archivos de programa\Java\jdk-17.0.3.1\bin\java.exe...
identificación java.lang.Integer INT 4
nombre java.lang.String VARCHAR 12
nivel java.lang.Integer INT 4
Fecha de creación java.sql.Date DATE 91
Proceso finalizado con código de salida 0

En la tercera columna vemos tipos: INT , VARCHAR , DATE . Estos son tipos de servidores SQL. El medio servidor entrega los datos con aquellos tipos que conoce. ¿Cómo se convierten estos tipos en tipos Java?

Esta es exactamente una de las cosas que se han estandarizado con JDBC. Los creadores de JDBC comenzaron arreglando una lista de tipos de SQL. Hay una clase especial con constantes:

class java.sql.Types {
   public static final int CHAR         =   1;
   public static final int NUMERIC    	=   2;
   public static final int DECIMAL     	=   3;
   public static final int INTEGER      =   4;
   public static final int FLOAT        =   6;
   public static final int REAL         =   7;}

El número no es un número de serie en la clase, sino un tipo de ID en la lista de tipos SQL en la especificación SQL. Estos son los números que viste en el ejemplo al comienzo de la lección.

También en la clase ResultSet hay métodos que pueden convertir un tipo de datos a otro. No todos los tipos se pueden convertir entre sí, pero la lógica es lo suficientemente clara. Aquí hay una buena hoja de cálculo para usted:

Método tipo de datos SQL
int getInt() NUMERIC, INTEGER, DECIMAL
flotar getFloat() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
doble getDoublel() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
Date getDate() DATE, TIME, TIMESTAMP
Time getTime() DATE, TIME, TIMESTAMP
Timestamp getTimestamp() DATE, TIME, TIMESTAMP
String getString() CHAR, VARCHAR

Entre todos los tipos de SQL, se pueden distinguir claramente algunos grupos:

  • números
  • tiempo
  • líneas
  • objetos de bytes

Por cierto, ¿has notado el método getInt() ?

JDBC y NULL

¿Ha notado lo que está mal con el método getInt() de la clase ResultSet ? Veamos de nuevo su firma:

int getInt(column)

Este método devuelve un int , no un entero. Porque en el momento en que se creó el tipo Integer de JDBC, aún no existía. Está bien, digamos. Entonces tengo una pregunta:

Tengo una tabla en una base de datos que tiene una columna INT NULL que puede ser INT pero también puede ser NULL. ¿Cómo puedo obtener el valor nulo de esta columna?

No te preocupes, todo ha sido pensado para ti.

Solución uno . Si el tipo de SQL en Java está representado por un tipo de referencia como Fecha o Cadena, entonces no hay problema . Las variables de este tipo pueden tomar valores nulos.

Solución dos . Los tipos primitivos no pueden ser nulos, por lo que métodos como getInt() simplemente devolverán un valor predeterminado . Para int es 0, para float = 0.0f, para double = 0.0d y similares.

¿Y cómo entender entonces lo que había en la columna: 0 o NULL? Y el partido tiene una respuesta a esta pregunta.

Solución tres . La clase ResultSet tiene un método wasNull() especial que devuelve verdadero si el método acaba de devolver un valor diferente en lugar de NULL .

Todo funciona exactamente como escribí aquí. Ejemplo:

ResultSet results = statement.executeQuery("SELECT * FROM user");
    int level = results.getInt("level");

if (results.wasNull()) {
    System.out.println("Level is null");
} else {
   System.out.println("Level is " + level);
    }

Si se suponía que devolvería un valor nulo al llamar al método getInt() , entonces el método wasNull() devolvería verdadero; de lo contrario, el método wasNull() devolvería falso.

Esto funciona no solo para tipos primitivos:

ResultSet results = statement.executeQuery("SELECT * FROM user");
    String name = results.getString("name");

 	if (results.wasNull()) {
 	    System.out.println("Name is null");
 	} else {
 	   System.out.println("User name is " + name);
    }

Esto es, por supuesto, una muleta. Pero no hay problema con NullPointerException . Ver lo positivo en todo :)

¿Qué hay de malo con los tipos de datos en JDBC?

Sigamos con la prueba. ¿ Mira de cerca el método getDate (columna) ? ¿Lo que está mal con él? Este método tiene el siguiente tipo de resultado:

java.sql.Date

Puede almacenar nulo, lo cual es lo suficientemente bueno. Pero aún así, algo anda mal con él. ¡Clave! Así es como se ve el tipo de fecha correcto:

java.util.Date

¡Tienen diferentes paquetes! Estos son generalmente diferentes tipos de datos. Y aquí está la razón...

Las bases de datos desde los años 70 del siglo XX soportan 3 tipos de datos para almacenar el tiempo:

  • DATE - almacena la fecha: año, mes, día.
  • TIME - almacena la hora: horas, minutos, segundos.
  • TIMESTAMP: almacena un punto específico en el tiempo: fecha, hora y milisegundos.

El lenguaje Java durante los primeros 10 años de su existencia tenía solo un tipo de datos, java.util.Date , que almacenaba un punto en el tiempo en formato UNIX TIME: la cantidad de milisegundos desde principios de 1970.

Por lo tanto, los creadores del estándar JDBC agregaron tres tipos de datos más a Java, específicamente para JDBC:

  • java.sql.fecha
  • java.sql.Tiempo
  • java.sqlTimestamp

Y así, los métodos de la interfaz ResultSet contienen tipos de datos fijos:

TIPO SQL Tipo Java Método
DATE java.sql.Date java.sql.Date getDate()
TIME java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()

Y este es el tipo que ves aquí:

"C:\Archivos de programa\Java\jdk-17.0.3.1\bin\java.exe...
identificación java.lang.Integer INT 4
nombre java.lang.String VARCHAR 12
nivel java.lang.Integer INT 4
Fecha de creación java.sql.Date DATE 91
Proceso finalizado con código de salida 0

¿Adivina qué falta aquí? Tipos de datos que han aparecido en la API Java DateTime:

  • LocalDate
  • LocalTime
  • LocalDateTime