ประเภทข้อมูล

ลองดูที่ตาราง:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
รหัส java.lang.จำนวนเต็ม INT 4
ชื่อ java.lang.string วาร์ชาร์ 12
ระดับ java.lang.จำนวนเต็ม INT 4
วันที่สร้าง java.sql.date วันที่ 91
กระบวนการเสร็จสิ้นด้วยรหัสออก 0

ในคอลัมน์ที่สามเราจะเห็นประเภท: INT , VARCHAR , DATE นี่คือประเภทเซิร์ฟเวอร์ SQL เซิร์ฟเวอร์หมายถึงให้ข้อมูลประเภทที่เขารู้ ประเภทเหล่านี้ถูกแปลงเป็นประเภท Java อย่างไร

นี่เป็นหนึ่งในสิ่งที่ได้รับมาตรฐานจาก JDBC ผู้สร้าง JDBC เริ่มต้นด้วยการแก้ไขรายการประเภท SQL มีคลาสพิเศษที่มีค่าคงที่:

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

หมายเลขนี้ไม่ใช่หมายเลขซีเรียลในคลาส แต่เป็นประเภท ID ในรายการประเภท SQL ในข้อกำหนด SQL นี่คือตัวเลขที่คุณเห็นในตัวอย่างเมื่อเริ่มการบรรยาย

นอกจากนี้ในคลาส ResultSet ยังมีเมธอดที่สามารถแปลงข้อมูลประเภทหนึ่งไปเป็นอีกประเภทหนึ่งได้ ไม่ใช่ทุกประเภทที่สามารถแปลงซึ่งกันและกันได้ แต่ตรรกะนั้นชัดเจนเพียงพอ นี่คือสเปรดชีตที่ดีสำหรับคุณ:

วิธี ชนิดข้อมูล SQL
int getInt() ตัวเลข จำนวนเต็ม ทศนิยม
ลอย getFloat() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
สองเท่า getDoublel() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
วันที่ getDate() วันที่ เวลา ประทับเวลา
เวลา getTime() วันที่ เวลา ประทับเวลา
การประทับเวลา getTimestamp() วันที่ เวลา ประทับเวลา
สตริง getString() ชาร์, วาร์ชาร์

ในบรรดา SQL ทุกประเภท บางกลุ่มสามารถแยกแยะได้อย่างชัดเจน:

  • ตัวเลข
  • เวลา
  • เส้น
  • ไบต์วัตถุ

คุณสังเกตเห็น เมธอด getInt()หรือไม่

JDBC และ NULL

คุณสังเกตเห็นว่ามีอะไรผิดปกติกับ เมธอด getInt()ของ คลาส ResultSetหรือไม่ ลองดูที่ลายเซ็นอีกครั้ง:

int getInt(column)

เมธอดนี้คืนค่าเป็น intไม่ใช่จำนวนเต็ม เนื่องจากในขณะที่สร้างจำนวนเต็มประเภท JDBC นั้นยังไม่มีอยู่ เอาล่ะมาพูดกัน จากนั้นฉันมีคำถาม:

ฉันมีตารางในฐานข้อมูลที่มีคอลัมน์ INT NULL ที่สามารถเป็น INT แต่สามารถเป็น NULL ได้เช่นกัน ฉันจะรับค่า Null จากคอลัมน์นี้ได้อย่างไร

ไม่ต้องกังวล ทุกอย่างได้รับการคิดสำหรับคุณ

ทางออกที่หนึ่ง หากประเภท SQL ใน Java แสดงโดยประเภทการอ้างอิง เช่น Date หรือ String แสดงว่าไม่มีปัญหา ตัวแปรประเภทนี้สามารถใช้ค่า Null ได้

แนวทางที่สอง ประเภทดั้งเดิมไม่สามารถเป็น ค่าว่างได้ ดังนั้นเมธอดอย่างgetInt()ก็จะคืนค่าเริ่มต้น สำหรับ int มันคือ 0 สำหรับ float = 0.0f สำหรับ double = 0.0d และอื่น ๆ

แล้วจะเข้าใจสิ่งที่อยู่ในคอลัมน์ได้อย่างไร: 0 หรือ NULL และพรรคมีคำตอบสำหรับคำถามนี้

แนวทางที่สาม คลาส ResultSet มีเมธอดพิเศษwasNull()ที่ คืน ค่าจริงหากเมธอดส่งคืนค่าอื่นแทนค่า NULL

ทุกอย่างทำงานได้ตรงตามที่ฉันเขียนไว้ที่นี่ ตัวอย่าง:

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

ถ้า ควรจะคืนค่า null เมื่อเรียก เมธอด getInt() เมธอด wasNull()จะคืนค่าจริง มิฉะนั้นเมธอด wasNull()จะส่งคืนค่าเท็จ

สิ่งนี้ใช้ได้ไม่เฉพาะกับประเภทดั้งเดิมเท่านั้น:

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

แน่นอนว่านี่คือไม้ค้ำยัน แต่ไม่มีปัญหากับNullPointerException มองโลกในแง่ดีในทุกสิ่ง :)

เกิดอะไรขึ้นกับประเภทข้อมูลใน JDBC

มาทดสอบกันต่อครับ ดู เมธอด getDate(column) อย่างละเอียด ? เกิดอะไรขึ้นกับเขา? วิธีการนี้มีผลลัพธ์ประเภทต่อไปนี้:

java.sql.Date

มันสามารถเก็บ null ซึ่งดีพอ แต่ถึงกระนั้นก็มีบางอย่างผิดปกติกับเขา เบาะแส! ประเภทวันที่ที่ถูกต้องมีลักษณะดังนี้:

java.util.Date

พวกเขามีแพ็คเกจที่แตกต่างกัน! ข้อมูลเหล่านี้มักเป็นข้อมูลประเภทต่างๆ และนี่คือเหตุผล...

ฐานข้อมูลตั้งแต่ทศวรรษที่ 70 ของศตวรรษที่ 20 รองรับข้อมูล 3 ประเภทสำหรับการจัดเก็บเวลา:

  • DATE - เก็บวันที่: ปี, เดือน, วัน
  • TIME - จัดเก็บเวลา: ชั่วโมง นาที วินาที
  • TIMESTAMP - เก็บช่วงเวลาเฉพาะ: วันที่ เวลา และมิลลิวินาที

ภาษา Java ในช่วง 10 ปีแรกของการดำรงอยู่มีประเภทข้อมูลเพียงประเภทเดียวคือjava.util.Dateซึ่งจัดเก็บจุดเวลาในรูปแบบ UNIX TIME ซึ่งเป็นจำนวนมิลลิวินาทีตั้งแต่ต้นปี 1970

ดังนั้น ผู้สร้างมาตรฐาน JDBC จึงเพิ่มประเภทข้อมูลอีกสามประเภทให้กับ Java - สำหรับ JDBC โดยเฉพาะ:

  • java.sql.date
  • java.sql.Time
  • java.sqlประทับเวลา

ดังนั้นเมธอดของ อินเทอร์เฟ ซ ResultSetจึงประกอบด้วยประเภทข้อมูลคงที่:

ประเภท SQL ประเภทจาวา วิธี
วันที่ java.sql.date java.sql.date getDate()
เวลา java.sql.Time java.sql.Time getTime()
ประทับเวลา java.sql.timestamp java.sql.ประทับเวลา getTimestamp()

และนี่คือประเภทที่คุณเห็นที่นี่:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
รหัส java.lang.จำนวนเต็ม INT 4
ชื่อ java.lang.string วาร์ชาร์ 12
ระดับ java.lang.จำนวนเต็ม INT 4
วันที่สร้าง java.sql.date วันที่ 91
กระบวนการเสร็จสิ้นด้วยรหัสออก 0

เดาว่ามีอะไรหายไปที่นี่? ชนิดข้อมูลที่ปรากฏใน Java DateTime API:

  • วันที่ท้องถิ่น
  • เวลาท้องถิ่น
  • LocalDateTime