JavaRush /Kurslar /All lectures for UZ purposes /JDBC'da Ma'lumot Turlari Moslashuvi

JDBC'da Ma'lumot Turlari Moslashuvi

All lectures for UZ purposes
Daraja, Dars
Mavjud

Ma'lumot Turlari

Keling, jadvalga e'tibor qarataylik:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe…
id java.lang.Integer INT 4
name java.lang.String VARCHAR 12
level java.lang.Integer INT 4
created_date java.sql.Date DATE 91
Jarayon tugadi exit code 0 bilan

Uchinchi ustunda biz turini ko'ramiz: INT, VARCHAR, DATE. Bu SQL-server turlari. Demak server o'ziga ma'lum bo'lgan turlar bilan ma'lumotlarni beradi. Qanday qilib bu turlar Java turlariga aylantiriladi?

Bu aniq JDBC bilan birga standartlashtirilgan narsalardan biri. JDBC yaratuvchilari SQL-turlar ro'yxatini tasdiqlashdan boshladilar. Konstantalar bilan maxsus sinf mavjud:


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

Son — bu sinfdagi tartib raqami emas, balki SQL spetsifikatsiyasidagi SQL-turlar ro'yxatidagi ID-turi. Aynan shu raqamlarni sen ilk lektsiya misolida ko'rding.

Shuningdek, ResultSet sinfida bir turdagi ma'lumotlarni boshqasiga aylantira olish metodlari mavjud. Hammasi ham bir-biriga aylantirilishi mumkin emas, lekin mantiqi aniq. Mana, birinchi marta uchun yaxshi jadval:

Metod SQL Ma'lumot Turi
int getInt() NUMERIC, INTEGER, DECIMAL
float getFloat() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
double getDouble() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
Date getDate() DATE, TIME, TIMESTAMP
Time getTime() DATE, TIME, TIMESTAMP
Timestamp getTimestamp() DATE, TIME, TIMESTAMP
String getString() CHAR, VARCHAR

Barcha SQL turlari orasida ba'zi guruhlarni aniq ajratish mumkin:

  • sonlar
  • vaqt
  • stringlar
  • byte obyektlari

Aytgancha, sen getInt() metodiga diqqat qildingmi?

JDBC va NULL

getInt() metodi ResultSet sinfida nimasdir noto'g'ri narsa borligiga e'tibor qaratdingmi? Keling, yana uning imzosiga qaraylik:


int getInt(column)

Bu metod int, ya'ni Integer emas, qaytaradi. Chunki JDBC turi yaratilganda Integer hali yo'q edi. Yaxshi, bo'pti. Mening savolim shunday:

Mening ma'lumotlar bazasida INT NULL turiga ega, INT qiymatini olishi mumkin bo'lgan, lekin shuningdek NULL qiymatini ham olishi mumkin bo'lgan kolonna bor. Qanday qilib men bu kolonadan null qiymatini olaman?

Xotirjam bo'l, hammasi sen uchun allaqachon o'ylangan.

Birinchi yechim. Agar SQL turi Java'ga String yoki Date kabi ob'ekt turi orqali taqdim etilsa, unda muammo yo'q. Bunday turdagi o'zgaruvchilar null qiymatini olishi mumkin.

Ikkinchi yechim. Primitiiv turlar null qiymatini qabul qila olmaydi, shuning uchun getInt() tipi metodlari oddiygina standart qiymatni qaytaradi. int uchun bu 0, float uchun 0.0f, double uchun 0.0d va hokazo.

Shunday ekan, qaysi qiymat kolonada turganini qanday bilish mumkin: 0 yoki NULL? Bu savolda ham yechim bor.

Uchinchi yechim. ResultSet sinfida maxsus wasNull() metodi mavjud, u faqatgina NULL o'rniga boshqa qiymat qaytganida true qiymatini qaytaradi.

Hammasi aynan shu tarzda ishlaydi. Misol:


ResultSet results = statement.executeQuery("SELECT * FROM user");
results.next();
int level = results.getInt("level");
 
if (results.wasNull()) {
  System.out.println("Level is null");
} else {
  System.out.println("Level is " + level);
}

Agar getInt() metodiga murojaat qilganda null qiymat qaytarilishi kerak bo'lsa, wasNull() metodi true qaytaradi, aks holda wasNull() metodi false qaytaradi.

Bu faqat primitiv turlar uchun emas:


ResultSet results = statement.executeQuery("SELECT * FROM user");
results.next();
String name = results.getString("name");
 
if (results.wasNull()) {
  System.out.println("Name is null");
} else {
  System.out.println("User name is " + name);
}

Bu albatta bir turi kostil. Lekin NullPointerException bilan hech qanday muammo yo'q. Barcha holatlarning ijobiy tomonlarini ko'rish lozim :)

JDBC'da ma'lumot turlari bilan nima noto'g'ri?

E'tiborga olingan testni davom ettiramiz. getDate(column) metodiga yaxshilab qarang? Nima noto'g'ri? Ushbu metod juda aniq natija turiga ega:


java.sql.Date

U null qiymatini saqlay oladi, bu yomon emas. Lekin bu bilan biror narsa xato. Ishora! To'g'ri Date turi quyidagicha ko'rinadi:


java.util.Date

Ularning paketlari turli! Bu aslida turli ma'lumot turlari. Sababi mana shu...

Ma'lumotlar bazalari hali 20-asrning 70-yillaridan boshlab vaqtni saqlash uchun 3 xil ma'lumot turini qo'llab-quvvatlaydi:

  • DATE – sana: yil, oy, kunni saqlaydi.
  • TIME – vaqt: soat, daqiqa, sekundni saqlaydi.
  • TIMESTAMP – aniq bir vaqtni: sana, vaqt va millisekundlarni saqlaydi.

Java dasturi o'zining birinchi 10 yilida faqat bir ma'lumot turiga ega edi — java.util.Date, u UNIX TIME formatida vaqtni saqlagan: 1970 yildan boshlab o'tgan millisekundlar miqdori.

Shuning uchun JDBC standarti yaratuvchilari JDBC uchun Java'ga yana uch ma'lumot turini qo'shdilar:

  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

Shuning uchun ResultSet interfeysi metodlari ta'sirlangan ma'lumot turlarini saqlaydi:

SQL TYPE Java Turi Metod
DATE java.sql.Date java.sql.Date getDate()
TIME java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()

Va aynan shu turini mana bu yerda ko'rasiz:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe…
id java.lang.Integer INT 4
name java.lang.String VARCHAR 12
level java.lang.Integer INT 4
created_date java.sql.Date DATE 91
Jarayon tugadi exit code 0 bilan

Java DateTime API'da paydo bo'lgan ma'lumot turlari nima yetishmayapti, deb o'ylaysan?

  • LocalDate
  • LocalTime
  • LocalDateTime
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION