Jenis data

Mari kita lihat jadual:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tahap java.lang.Integer INT 4
tarikh_dicipta java.sql.date TARIKH 91
Proses selesai dengan kod keluar 0

Dalam lajur ketiga kita melihat jenis: INT , VARCHAR , DATE . Ini adalah jenis pelayan SQL. Pelayan bermaksud memberikan data dengan jenis yang dia tahu. Bagaimanakah jenis ini ditukar kepada jenis Java?

Ini betul-betul salah satu perkara yang telah diseragamkan dengan JDBC. Pencipta JDBC bermula dengan membetulkan senarai jenis SQL. Terdapat kelas khas dengan pemalar:

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

Nombor itu bukan nombor siri dalam kelas, tetapi jenis ID dalam senarai jenis SQL dalam spesifikasi SQL. Ini adalah nombor yang anda lihat dalam contoh pada permulaan kuliah.

Juga dalam kelas ResultSet terdapat kaedah yang boleh menukar satu jenis data kepada yang lain. Tidak semua jenis boleh ditukar antara satu sama lain, tetapi logiknya cukup jelas. Berikut ialah hamparan yang baik untuk anda:

Kaedah Jenis data SQL
int getInt() NOMBOR, INTEGER, PERPULUHAN
float getFloat() ANGKA, INTEGER, PERPULUHAN, TERApung, NYATA
double getDoubel() ANGKA, INTEGER, PERPULUHAN, TERApung, NYATA
Tarikh getDate() TARIKH, MASA, STAMP MASA
Time getTime() TARIKH, MASA, STAMP MASA
Cap masa getTimestamp() TARIKH, MASA, STAMP MASA
String getString() CHAR, VARCHAR

Di antara semua jenis SQL, beberapa kumpulan boleh dibezakan dengan jelas:

  • nombor
  • masa
  • garisan
  • objek bait

Dengan cara ini, adakah anda perasan kaedah getInt() ?

JDBC dan NULL

Adakah anda perasan apa yang salah dengan kaedah getInt() kelas ResultSet ? Mari lihat tandatangannya sekali lagi:

int getInt(column)

Kaedah ini mengembalikan int , bukan Integer. Kerana pada masa Integer jenis JDBC dicipta, ia belum wujud lagi. Baiklah, katakan. Kemudian saya mempunyai soalan:

Saya mempunyai jadual dalam pangkalan data yang mempunyai lajur INT NULL yang boleh menjadi INT tetapi juga boleh menjadi NULL. Bagaimanakah saya boleh mendapatkan nilai nol daripada lajur ini?

Jangan risau, semuanya telah difikirkan untuk anda.

Penyelesaian satu . Jika jenis SQL dalam Java diwakili oleh jenis rujukan seperti Date atau String, maka tiada masalah . Pembolehubah jenis ini boleh mengambil nilai nol.

Penyelesaian dua . Jenis primitif tidak boleh batal, jadi kaedah seperti getInt() hanya akan mengembalikan nilai lalai . Untuk int ia adalah 0, untuk float = 0.0f, untuk double = 0.0d dan seumpamanya.

Dan bagaimana untuk memahami apa yang ada dalam lajur: 0 atau NULL? Dan parti itu mempunyai jawapan kepada soalan ini.

Penyelesaian tiga . Kelas ResultSet mempunyai kaedah wasNull() khas yang mengembalikan benar jika kaedah tersebut hanya mengembalikan nilai yang berbeza dan bukannya NULL .

Semuanya berfungsi sama seperti yang saya tulis di sini. Contoh:

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

Jika ia sepatutnya mengembalikan null apabila memanggil kaedah getInt() , maka kaedah wasNull() akan kembali benar, jika tidak kaedah wasNull() akan mengembalikan false.

Ini berfungsi bukan sahaja untuk jenis primitif:

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

Ini sudah tentu tongkat. Tetapi tiada masalah dengan NullPointerException . Lihat yang positif dalam segalanya :)

Apakah yang salah dengan jenis data dalam JDBC?

Mari kita teruskan dengan ujian. Lihat dengan teliti kaedah getDate(column) ? Apa masalah dia? Kaedah ini mempunyai jenis hasil berikut:

java.sql.Date

Ia boleh menyimpan null, yang cukup baik. Tetapi masih, ada sesuatu yang tidak kena dengannya. Petunjuk! Inilah rupa jenis Tarikh yang betul:

java.util.Date

Mereka mempunyai pakej yang berbeza! Ini secara amnya adalah jenis data yang berbeza. Dan inilah sebabnya...

Pangkalan data sejak 70-an abad ke-20 menyokong 3 jenis data untuk menyimpan masa:

  • DATE - menyimpan tarikh: tahun, bulan, hari.
  • MASA - menyimpan masa: jam, minit, saat.
  • TIMESTAMP - menyimpan titik masa tertentu: tarikh, masa dan milisaat.

Bahasa Java untuk 10 tahun pertama kewujudannya hanya mempunyai satu jenis data, java.util.Date , yang menyimpan titik masa dalam format UNIX TIME: bilangan milisaat sejak awal tahun 1970.

Oleh itu, pencipta standard JDBC menambahkan tiga lagi jenis data pada Java - khusus untuk JDBC:

  • java.sql.date
  • java.sql.Time
  • java.sqlTimestamp

Oleh itu kaedah antara muka ResultSet mengandungi jenis data tetap:

JENIS SQL Jenis Java Kaedah
TARIKH java.sql.date java.sql.date getDate()
MASA java.sql.Time java.sql.Time getTime()
STAMP MASA java.sql.timestamp java.sql.Timestamp getTimestamp()

Dan ini adalah jenis yang anda lihat di sini:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tahap java.lang.Integer INT 4
tarikh_dicipta java.sql.date TARIKH 91
Proses selesai dengan kod keluar 0

Cuba teka apa yang tiada di sini? Jenis data yang telah muncul dalam Java DateTime API:

  • LocalDate
  • LocalTime
  • LocalDateTime