CodeGym /Java Course /All lectures for NL purposes /Gegevenstype-onderhandeling in JDBC

Gegevenstype-onderhandeling in JDBC

All lectures for NL purposes
Niveau 1 , Les 813
Beschikbaar

Gegevens typen

Laten we de tabel eens bekijken:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID kaart java.lang.Integer INT 4
naam java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
gemaakte_datum java.sql.datum DATUM 91
Proces beëindigd met afsluitcode 0

In de derde kolom zien we typen: INT , VARCHAR , DATE . Dit zijn SQL-servertypen. Het servermiddel geeft de gegevens door met die typen waarvan hij weet. Hoe worden deze typen geconverteerd naar Java-typen?

Dit is precies een van de dingen die met JDBC is gestandaardiseerd. De makers van JDBC begonnen met het maken van een lijst met SQL-typen. Er is een speciale klasse met constanten:

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;}

Het nummer is geen serienummer in de klasse, maar een ID-type in de lijst met SQL-typen in de SQL-specificatie. Dit zijn de getallen die je zag in het voorbeeld aan het begin van het college.

Ook in de klasse ResultSet zijn er methoden die het ene gegevenstype naar het andere kunnen converteren. Niet alle typen kunnen naar elkaar worden omgerekend, maar de logica is duidelijk genoeg. Hier is een goede spreadsheet voor u:

Methode SQL-gegevenstype
int getInt() NUMERIEK, INTEGER, DECIMAAL
zweven getFloat() NUMERIEK, INTEGER, DECIMAAL, FLOAT, REAL
dubbel getDubbel() NUMERIEK, INTEGER, DECIMAAL, FLOAT, REAL
Datum getDate() DATUM, TIJD, TIJDSTAMP
Tijd getTime() DATUM, TIJD, TIJDSTAMP
Tijdstempel getTimestamp() DATUM, TIJD, TIJDSTAMP
String getString() CHAR, VARCHAR

Van alle SQL-typen zijn enkele groepen duidelijk te onderscheiden:

  • nummers
  • tijd
  • lijnen
  • byte-objecten

Trouwens, heb je de methode getInt() opgemerkt ?

JDBC en NULL

Is het je opgevallen wat er mis is met de methode getInt() van de klasse ResultSet ? Laten we nog eens naar de handtekening kijken:

int getInt(column)

Deze methode retourneert een int , geen Integer. Omdat op het moment dat het JDBC-type Integer werd gemaakt, het nog niet bestond. Oké, laten we zeggen. Dan heb ik een vraag:

Ik heb een tabel in een database met een kolom INT NULL die INT kan zijn, maar ook NULL. Hoe kan ik de null-waarde uit deze kolom halen?

Geen zorgen, aan alles is gedacht.

Oplossing één . Als het SQL-type in Java wordt weergegeven door een referentietype zoals Date of String, dan is er geen probleem . Variabelen van dit type kunnen null-waarden aannemen.

Oplossing twee . Primitieve typen kunnen niet null zijn, dus methoden zoals getInt() zullen gewoon een standaardwaarde teruggeven . Voor int is het 0, voor float = 0.0f, voor double = 0.0d en dergelijke.

En hoe dan te begrijpen wat er in de kolom stond: 0 of NULL? En op deze vraag heeft de partij een antwoord.

Oplossing drie . De klasse ResultSet heeft een speciale methode wasNull() die true retourneert als de methode zojuist een andere waarde heeft geretourneerd in plaats van NULL .

Alles werkt precies zoals ik hier schreef. Voorbeeld:

ResultSet results = staatement.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);
    }

Als het de bedoeling was null terug te geven bij het aanroepen van de getInt()- methode, dan zou de wasNull()- methode true retourneren, anders zou de wasNull()- methode false retourneren.

Dit werkt niet alleen voor primitieve typen:

ResultSet results = staatement.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);
    }

Dit is natuurlijk een makkie. Maar geen probleem met NullPointerException . Zie overal de positieve kanten van :)

Wat is er mis met gegevenstypen in JDBC?

Laten we doorgaan met de test. Kijk goed naar de methode getDate(column) ? Wat is er mis met hem? Deze methode heeft het volgende type resultaat:

java.sql.Date

Het kan null opslaan, wat goed genoeg is. Maar toch is er iets mis met hem. Aanwijzing! Zo ziet het juiste datumtype eruit:

java.util.Date

Ze hebben verschillende pakketten! Dit zijn over het algemeen verschillende soorten gegevens. En hier is de reden...

Databases sinds de jaren 70 van de 20e eeuw ondersteunen 3 soorten gegevens voor het opslaan van tijd:

  • DATE - slaat de datum op: jaar, maand, dag.
  • TIME - slaat tijd op: uren, minuten, seconden.
  • TIMESTAMP - slaat een specifiek tijdstip op: datum, tijd en milliseconden.

De Java-taal had de eerste 10 jaar van zijn bestaan ​​slechts één gegevenstype, java.util.Date , dat een tijdstip in UNIX TIME-indeling opsloeg: het aantal milliseconden sinds het begin van 1970.

Daarom hebben de makers van de JDBC-standaard nog drie gegevenstypen aan Java toegevoegd - specifiek voor JDBC:

  • java.sql.datum
  • java.sql.Tijd
  • java.sqlTijdstempel

En dus bevatten de methoden van de ResultSet- interface vaste gegevenstypen:

SQL-TYPE Java-type Methode
DATUM java.sql.datum java.sql.date getDate()
TIJD java.sql.Tijd java.sql.Tijd getTime()
TIJDSTAMP java.sql.tijdstempel java.sql.Timestamp getTimestamp()

En dit is het type dat je hier ziet:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID kaart java.lang.Integer INT 4
naam java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
gemaakte_datum java.sql.datum DATUM 91
Proces beëindigd met afsluitcode 0

Raad eens wat hier ontbreekt? Gegevenstypen die zijn verschenen in de Java DateTime API:

  • LokaleDatum
  • Lokale tijd
  • LocalDateTime
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION