Uri ng data

Tingnan natin ang talahanayan:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
pangalan java.lang.string VARCHAR 12
antas java.lang.Integer INT 4
nilikha_petsa java.sql.date DATE 91
Natapos ang proseso gamit ang exit code 0

Sa ikatlong hanay makikita natin ang mga uri: INT , VARCHAR , DATE . Ito ang mga uri ng SQL server. Ang ibig sabihin ng server ay nagbibigay ng data kasama ang mga uri na alam niya. Paano na-convert ang mga uri na ito sa mga uri ng Java?

Ito ay eksaktong isa sa mga bagay na na-standardize sa JDBC. Nagsimula ang mga tagalikha ng JDBC sa pamamagitan ng pag-aayos ng isang listahan ng mga uri ng SQL. Mayroong isang espesyal na klase na may mga pare-pareho:

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

Ang numero ay hindi isang serial number sa klase, ngunit isang uri ng ID sa listahan ng mga uri ng SQL sa detalye ng SQL. Ito ang mga numerong nakita mo sa halimbawa sa simula ng lecture.

Gayundin sa ResultSet klase mayroong mga pamamaraan na maaaring mag-convert ng isang uri ng data sa isa pa. Hindi lahat ng uri ay maaaring i-convert sa isa't isa, ngunit ang lohika ay sapat na malinaw. Narito ang isang magandang spreadsheet para sa iyo:

Pamamaraan Uri ng data ng SQL
int getInt() NUMERIC, INTEGER, DECIMAL
float getFloat() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
double getDoubel() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
Petsa getDate() PETSA, ORAS, TIMESTAMP
Time getTime() PETSA, ORAS, TIMESTAMP
Timestamp getTimestamp() PETSA, ORAS, TIMESTAMP
String getString() CHAR, VARCHAR

Sa lahat ng mga uri ng SQL, ang ilang mga grupo ay maaaring malinaw na makilala:

  • numero
  • oras
  • mga linya
  • mga bagay na byte

Nga pala, napansin mo ba ang getInt() method ?

JDBC at NULL

Napansin mo ba kung ano ang mali sa getInt() na pamamaraan ng ResultSet class ? Tingnan natin muli ang lagda nito:

int getInt(column)

Ang pamamaraang ito ay nagbabalik ng isang int , hindi isang Integer. Dahil sa oras na nilikha ang uri ng JDBC na Integer, hindi pa ito umiiral. Okay, sabihin na natin. Tapos may tanong ako:

Mayroon akong isang talahanayan sa isang database na mayroong isang INT NULL na haligi na maaaring INT ngunit maaari ding maging NULL. Paano ko makukuha ang null value mula sa column na ito?

Huwag mag-alala, ang lahat ay naisip para sa iyo.

Solusyon isa . Kung ang uri ng SQL sa Java ay kinakatawan ng isang uri ng sanggunian tulad ng Petsa o String, walang problema . Ang mga variable ng ganitong uri ay maaaring tumagal ng mga null na halaga.

Solusyon dalawa . Ang mga primitive na uri ay hindi maaaring null, kaya ang mga pamamaraan tulad ng getInt() ay magbabalik lamang ng isang default na halaga . Para sa int ito ay 0, para sa float = 0.0f, para sa double = 0.0d at mga katulad nito.

At kung paano maunawaan kung ano ang nasa hanay: 0 o NULL? At ang partido ay may sagot sa tanong na ito.

Solusyon tatlo . Ang ResultSet class ay may espesyal na wasNull() na pamamaraan na nagbabalik ng true kung ang pamamaraan ay nagbalik lamang ng ibang halaga sa halip na NULL .

Ang lahat ay gumagana nang eksakto tulad ng isinulat ko dito. Halimbawa:

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

Kung ito ay dapat na ibalik ang null kapag tumatawag sa getInt() na pamamaraan, ang wasNull() na pamamaraan ay babalik ng totoo, kung hindi ang wasNull() na pamamaraan ay magbabalik ng false.

Gumagana ito hindi lamang para sa mga primitive na uri:

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

Ito ay siyempre isang saklay. Ngunit walang problema sa NullPointerException . Tingnan ang mga positibo sa lahat :)

Ano ang mali sa mga uri ng data sa JDBC?

Ipagpatuloy natin ang pagsubok. Tingnang mabuti ang getDate(column) method ? Anong meron sa kanya? Ang pamamaraang ito ay may sumusunod na uri ng resulta:

java.sql.Date

Maaari itong mag-imbak ng null, na sapat na mabuti. But still, may mali sa kanya. Clue! Narito ang hitsura ng tamang uri ng Petsa:

java.util.Date

May iba't ibang package sila! Ang mga ito sa pangkalahatan ay iba't ibang uri ng data. At eto ang dahilan...

Ang mga database mula noong 70s ng ika-20 siglo ay sumusuporta sa 3 uri ng data para sa pag-iimbak ng oras:

  • DATE - iniimbak ang petsa: taon, buwan, araw.
  • TIME - nag-iimbak ng oras: oras, minuto, segundo.
  • TIMESTAMP - nag-iimbak ng isang partikular na punto sa oras: petsa, oras at millisecond.

Ang wikang Java sa unang 10 taon ng pagkakaroon nito ay mayroon lamang isang uri ng data, java.util.Date , na nag-imbak ng isang punto sa oras sa UNIX TIME na format: ang bilang ng mga millisecond mula noong simula ng 1970.

Samakatuwid, ang mga tagalikha ng pamantayan ng JDBC ay nagdagdag ng tatlo pang uri ng data sa Java - partikular para sa JDBC:

  • java.sql.date
  • java.sql.Oras
  • java.sqlTimestamp

At kaya ang mga pamamaraan ng interface ng ResultSet ay naglalaman ng mga nakapirming uri ng data:

URI ng SQL Uri ng Java Pamamaraan
DATE java.sql.date java.sql.date getDate()
ORAS java.sql.Oras java.sql.Time getTime()
TIMESTAMP java.sql.timestamp java.sql.Timestamp getTimestamp()

At ito ang uri na makikita mo dito:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
pangalan java.lang.string VARCHAR 12
antas java.lang.Integer INT 4
nilikha_petsa java.sql.date DATE 91
Natapos ang proseso gamit ang exit code 0

Hulaan kung ano ang kulang dito? Mga uri ng data na lumitaw sa Java DateTime API:

  • LocalDate
  • Lokal na Oras
  • LocalDateTime