Tipe data

Mari kita lihat tabelnya:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
pengenal java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tingkat java.lang.Integer INT 4
tanggal_dibuat java.sql.tanggal TANGGAL 91
Proses selesai dengan kode keluar 0

Di kolom ketiga kita melihat tipe: INT , VARCHAR , DATE . Ini adalah tipe server SQL. Server berarti memberikan data dengan tipe-tipe yang dia ketahui. Bagaimana tipe ini dikonversi ke tipe Java?

Inilah salah satu hal yang telah distandarisasi dengan JDBC. Pembuat JDBC memulai dengan memperbaiki daftar tipe SQL. Ada kelas khusus dengan konstanta:

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

Nomornya bukan nomor seri di kelas, tetapi tipe ID dalam daftar tipe SQL dalam spesifikasi SQL. Ini adalah angka yang Anda lihat pada contoh di awal kuliah.

Juga di kelas ResultSet ada metode yang dapat mengubah satu tipe data ke tipe lainnya. Tidak semua tipe dapat dikonversi satu sama lain, tetapi logikanya cukup jelas. Ini spreadsheet yang bagus untuk Anda:

metode tipe data SQL
int getInt() NUMERIK, INTEGER, DECIMAL
mengapung getFloat() NUMERIK, INTEGER, DECIMAL, FLOAT, NYATA
gandakan getDoublel() NUMERIK, INTEGER, DECIMAL, FLOAT, NYATA
Tanggal getDate() TANGGAL, WAKTU, KETENTUAN WAKTU
Waktu getTime() TANGGAL, WAKTU, KETENTUAN WAKTU
Stempel waktu getTimestamp() TANGGAL, WAKTU, KETENTUAN WAKTU
string getString() CHAR, VARCHAR

Di antara semua jenis SQL, beberapa grup dapat dibedakan dengan jelas:

  • angka
  • waktu
  • baris
  • objek byte

Omong-omong, apakah Anda memperhatikan metode getInt() ?

JDBC dan NULL

Pernahkah Anda memperhatikan apa yang salah dengan metode getInt() dari kelas ResultSet ? Mari kita lihat tanda tangannya lagi:

int getInt(column)

Metode ini mengembalikan int , bukan Integer. Karena pada saat JDBC tipe Integer dibuat belum ada. Oke, katakanlah. Lalu saya punya pertanyaan:

Saya punya tabel di database yang memiliki kolom INT NULL yang bisa INT tapi bisa juga NULL. Bagaimana saya bisa mendapatkan nilai nol dari kolom ini?

Jangan khawatir, semuanya telah dipikirkan untuk Anda.

Solusi satu . Jika tipe SQL di Java diwakili oleh tipe referensi seperti Date atau String, maka tidak ada masalah . Variabel jenis ini dapat mengambil nilai nol.

Solusi dua . Tipe primitif tidak boleh null, jadi metode seperti getInt() hanya akan mengembalikan nilai default . Untuk int adalah 0, untuk float = 0.0f, untuk double = 0.0d dan sejenisnya.

Lalu bagaimana memahami apa yang ada di kolom: 0 atau NULL? Dan partai memiliki jawaban untuk pertanyaan ini.

Solusi tiga . Kelas ResultSet memiliki metode wasNull() khusus yang mengembalikan true jika metode tersebut hanya mengembalikan nilai yang berbeda, bukan NULL .

Semuanya bekerja persis 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 seharusnya mengembalikan null saat memanggil metode getInt() , maka metode wasNull() akan mengembalikan nilai true, jika tidak, metode wasNull() akan mengembalikan false.

Ini berfungsi tidak hanya untuk tipe 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 tentu saja kruk. Tapi tidak masalah dengan NullPointerException . Lihat hal positif dalam segala hal :)

Apa yang salah dengan tipe data di JDBC?

Mari kita lanjutkan dengan tes. Perhatikan baik-baik metode getDate(column) ? Apa yang salah dengan dia? Metode ini memiliki jenis hasil sebagai berikut:

java.sql.Date

Itu bisa menyimpan null, yang cukup bagus. Tapi tetap saja, ada yang salah dengan dirinya. Petunjuk! Inilah tampilan tipe Tanggal yang benar:

java.util.Date

Mereka memiliki paket yang berbeda! Ini umumnya adalah jenis data yang berbeda. Dan inilah alasannya...

Basis data sejak tahun 70-an abad ke-20 mendukung 3 jenis data untuk menyimpan waktu:

  • DATE - menyimpan tanggal: tahun, bulan, hari.
  • WAKTU - menyimpan waktu: jam, menit, detik.
  • TIMESTAMP - menyimpan titik waktu tertentu: tanggal, waktu, dan milidetik.

Bahasa Java selama 10 tahun pertama keberadaannya hanya memiliki satu tipe data, java.util.Date , yang menyimpan titik waktu dalam format UNIX TIME: jumlah milidetik sejak awal tahun 1970.

Oleh karena itu, pembuat standar JDBC menambahkan tiga tipe data lagi ke Java - khusus untuk JDBC:

  • java.sql.tanggal
  • java.sql.Waktu
  • java.sqlTimestamp

Jadi metode antarmuka ResultSet berisi tipe data tetap:

JENIS SQL Tipe Jawa metode
TANGGAL java.sql.tanggal java.sql.date getDate()
WAKTU java.sql.Waktu java.sql.Waktu getTime()
URUTAN WAKTU 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...
pengenal java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tingkat java.lang.Integer INT 4
tanggal_dibuat java.sql.tanggal TANGGAL 91
Proses selesai dengan kode keluar 0

Coba tebak apa yang hilang di sini? Tipe data yang muncul di Java DateTime API:

  • Tanggal Lokal
  • Waktu lokal
  • TanggalWaktu Lokal