Vấn đề
Cần insert giá trị NULL cho cột DATE trong MySQL từ Java (JDBC). Dùng PreparedStatement.setNull() thay vì setDate(null).
Code Java hoàn chỉnh
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class InsertNullDateDemo {
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
try {
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web?useSSL=false",
"root", "123456");
String query = "INSERT INTO DemoTable(AdmissionDate) VALUES (?)";
ps = con.prepareStatement(query);
// Quan trọng: setNull với kiểu SQL DATE
ps.setNull(1, java.sql.Types.DATE);
ps.executeUpdate();
System.out.println("check the table......");
} catch (Exception e) {
e.printStackTrace();
} finally {
// Đóng resource
try { if (ps != null) ps.close(); } catch (Exception e) {}
try { if (con != null) con.close(); } catch (Exception e) {}
}
}
}
Giải thích
ps.setNull(parameterIndex, sqlType): Tham số 1 là vị trí placeholder (?), tham số 2 làjava.sql.Types.DATE(hoặc TIMESTAMP, TIME...).- Không dùng
ps.setDate(1, null)→ có thể ném NullPointerException hoặc driver không hiểu kiểu SQL. java.sql.Typesđịnh nghĩa hằng số kiểu SQL chuẩn JDBC.
Tạo bảng MySQL
CREATE TABLE DemoTable (AdmissionDate DATE);
Kết quả kiểm tra
Sau khi chạy Java, cột AdmissionDate sẽ là NULL.
mysql> SELECT * FROM DemoTable; +---------------+ | AdmissionDate | +---------------+ | NULL | +---------------+
Best Practice JDBC
- Luôn dùng
try-with-resources(Java 7+) để tự đóng Connection/Statement. - Dùng Connection Pool (HikariCP) thay vì DriverManager.getConnection trực tiếp.
- Externalize config (URL, user, pass) ra file properties/yaml.