介绍

Java 数据库连接 (JDBC) API 允许 Java 程序员访问不同的关系和 NoSQL 数据库,如 Oracle、MySQL、SQL Server 等。它有助于存储、访问和操作存储在这些数据库中的数据。

在这篇文章中,我们将探讨如何在 PreparedStatement 中设置 NULL 值。
 

空字符串数据类型

对于 String 数据类型,在 SQL 查询中设置为参数的值是否为 NULL 无关紧要。  

其他数据类型,如 Integer、Float、Double、Date 等。

对于IntegerFloatDoubleDate等数据类型,我们必须显式调用 setNull 方法。

例子

String name = null;
Long id = null;
   
PreparedStatement ps = connection.prepareStatement("select * from person where first_name = ? and id = ?"); 

ps.setString(1,name);
上面的行将执行而不抛出任何异常
ps.setLong(2, id);

上面这行代码,由于id为null,所以会抛出java.lang.NullPointerException

解决方案

检查值的可空性并调用setNull方法,即
 
if( id == null ) {
 ps.setNull(2, Types.INTEGER);
}else {
        ps.setLong(2, id);
}
JDBC 要求程序员使用 java.sql.Types 为 Null 值指定正确的数据类型。

完整代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;

public class JDBCNullExample {

 public static void main(String[] args) throws Exception{
  Connection connection = null;
  try {   
   connection = openConnection();
   String name = null;
   Long id = null;
   
   PreparedStatement ps = connection.prepareStatement("select * from person 
                                                                            where first_name = ? and id = ?");
   ps.setString(1,name);
   
   if(id == null) {
    ps.setNull(2, Types.INTEGER);
   }else {
    ps.setLong(2, id);
   }
   ResultSet rs = ps.executeQuery(); 
   
   System.out.println(rs.getFetchSize());
   rs.close();
  }catch(Exception exception) {
   exception.printStackTrace();
  }finally {
   if(connection != null) {
    connection.close();
   }
  }  
 }
 
 private static Connection openConnection() throws Exception{  
   Class.forName("oracle.jdbc.OracleDriver");
   return DriverManager.getConnection("jdbc:oracle:thin:@IP:orcl", "user","password");   
 }
}

结论

除了 String 数据类型,如果其他数据类型的值为 Null,我们必须显式指定数据类型。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐