Loại dữ liệu

Chúng ta hãy nhìn vào bảng:

"C:\Tệp chương trình\Java\jdk-17.0.3.1\bin\java.exe...
nhận dạng java.lang.Integer INT 4
tên java.lang.string VARCHAR 12
mức độ java.lang.Integer INT 4
ngày tạo ra java.sql.date NGÀY 91
Quá trình kết thúc với mã thoát 0

Trong cột thứ ba, chúng ta thấy các loại: INT , VARCHAR , DATE . Đây là các loại máy chủ SQL. Máy chủ có nghĩa là cung cấp dữ liệu với những loại mà anh ta biết. Các loại này được chuyển đổi thành các loại Java như thế nào?

Đây chính xác là một trong những thứ đã được chuẩn hóa với JDBC. Những người tạo ra JDBC đã bắt đầu bằng cách sửa một danh sách các kiểu SQL. Có một lớp đặc biệt với các hằng số:

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

Số này không phải là số sê-ri trong lớp mà là một loại ID trong danh sách các loại SQL trong đặc tả SQL. Đây là những con số bạn đã thấy trong ví dụ ở đầu bài giảng.

Ngoài ra trong lớp ResultSet còn có các phương thức có thể chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác. Không phải tất cả các loại đều có thể được chuyển đổi cho nhau, nhưng logic đủ rõ ràng. Đây là một bảng tính tốt cho bạn:

Phương pháp kiểu dữ liệu SQL
int getInt() SỐ, SỐ NGUYÊN, THẬP PHÂN
nổi getFloat() SỐ, SỐ NGUYÊN, THẬP PHÂN, FLOAT, REAL
nhân đôi getDoublel() SỐ, SỐ NGUYÊN, THẬP PHÂN, FLOAT, REAL
Ngày getDate() NGÀY, GIỜ, DẤU THỜI GIAN
Thời gian getTime() NGÀY, GIỜ, DẤU THỜI GIAN
Dấu thời gian getTimestamp() NGÀY, GIỜ, DẤU THỜI GIAN
Chuỗi getString() CHAR, VARCHAR

Trong số tất cả các loại SQL, một số nhóm có thể được phân biệt rõ ràng:

  • con số
  • thời gian
  • dòng
  • đối tượng byte

Nhân tiện, bạn có để ý phương thức getInt() không ?

JDBC và NULL

Bạn có nhận thấy điều gì sai với phương thức getInt() của lớp ResultSet không ? Hãy nhìn vào chữ ký của nó một lần nữa:

int getInt(column)

Phương thức này trả về một int , không phải là một số nguyên. Bởi vì tại thời điểm JDBC type Integer được tạo ra, nó chưa tồn tại. Được rồi, hãy nói. Sau đó, tôi có một câu hỏi:

Tôi có một bảng trong cơ sở dữ liệu có cột INT NULL có thể là INT nhưng cũng có thể là NULL. Làm cách nào tôi có thể nhận được giá trị null từ cột này?

Đừng lo lắng, mọi thứ đã được nghĩ đến cho bạn.

Giải pháp một . Nếu kiểu SQL trong Java được đại diện bởi một kiểu tham chiếu như Ngày hoặc Chuỗi, thì không có vấn đề gì . Các biến kiểu này có thể nhận giá trị null.

Giải pháp hai . Các kiểu nguyên thủy không thể rỗng, vì vậy các phương thức như getInt() sẽ chỉ trả về một giá trị mặc định . Đối với int nó là 0, đối với float = 0,0f, đối với double = 0,0d và tương tự.

Và làm thế nào để hiểu những gì trong cột: 0 hoặc NULL? Và đảng đã có câu trả lời cho câu hỏi này.

Giải pháp ba . Lớp ResultSet có một phương thức wasNull() đặc biệt trả về true nếu phương thức vừa trả về một giá trị khác thay vì NULL .

Mọi thứ hoạt động chính xác như tôi đã viết ở đây. Ví dụ:

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

Nếu nó được cho là trả về null khi gọi phương thức getInt() , thì phương thức wasNull() sẽ trả về true, nếu không thì phương thức wasNull() sẽ trả về false.

Điều này không chỉ hoạt động đối với các loại nguyên thủy:

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

Tất nhiên đây là một cái nạng. Nhưng không có vấn đề gì với NullPulumException . Nhìn thấy mặt tích cực trong mọi thứ :)

Có gì sai với kiểu dữ liệu trong JDBC?

Hãy tiếp tục với bài kiểm tra. Hãy xem kỹ phương thức getDate(column) ? Có chuyện gì với anh ấy vậy? Phương pháp này có loại kết quả sau:

java.sql.Date

Nó có thể lưu trữ null, thế là đủ tốt. Nhưng vẫn có gì đó không ổn với anh ta. Manh mối! Đây là loại Ngày chính xác trông như thế nào:

java.util.Date

Họ có các gói khác nhau! Đây thường là các loại dữ liệu khác nhau. Và đây là lý do...

Cơ sở dữ liệu từ những năm 70 của thế kỷ 20 hỗ trợ 3 loại dữ liệu để lưu trữ thời gian:

  • DATE - lưu trữ ngày: năm, tháng, ngày.
  • TIME - lưu trữ thời gian: giờ, phút, giây.
  • DẤU THỜI GIAN - lưu trữ một thời điểm cụ thể: ngày, giờ và mili giây.

Ngôn ngữ Java trong 10 năm tồn tại đầu tiên chỉ có một kiểu dữ liệu, java.util.Date , lưu trữ một thời điểm ở định dạng THỜI GIAN UNIX: số mili giây kể từ đầu năm 1970.

Do đó, những người tạo ra tiêu chuẩn JDBC đã thêm ba kiểu dữ liệu nữa vào Java - đặc biệt cho JDBC:

  • java.sql.date
  • java.sql.Thời gian
  • java.sqlDấu thời gian

Và do đó, các phương thức của giao diện ResultSet chứa các kiểu dữ liệu cố định:

LOẠI SQL Loại Java Phương pháp
NGÀY java.sql.date java.sql.date getDate()
THỜI GIAN java.sql.Thời gian java.sql.Time getTime()
DẤU THỜI GIAN java.sql.timestamp java.sql.Dấu thời gian getTimestamp()

Và đây là loại bạn thấy ở đây:

"C:\Tệp chương trình\Java\jdk-17.0.3.1\bin\java.exe...
nhận dạng java.lang.Integer INT 4
tên java.lang.string VARCHAR 12
mức độ java.lang.Integer INT 4
ngày tạo ra java.sql.date NGÀY 91
Quá trình kết thúc với mã thoát 0

Đoán những gì còn thiếu ở đây? Các kiểu dữ liệu đã xuất hiện trong Java DateTime API:

  • Ngày địa phương
  • Giờ địa phương
  • Địa phươngDateTime