How to handle null database fields with Java

Content is king and large software cannot get away from serving content. In this post, I shall document how to use Java to access relational databases, with the MySQL database as an example. Suppose we have created a database instance with two tables with the following SQL commands:

CREATE DATABASE `db-instance`;
USE `db-instance`;

CREATE TABLE Job (
        `id` INT NOT NULL AUTO_INCREMENT,
        `name` VARCHAR(255),
        `description` TEXT,
        PRIMARY KEY(id)
) ENGINE=INNODB;

CREATE TABLE Person (
	`id` INT NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255),
	`address` VARCHAR(255),
	`job-id` INT,
	PRIMARY KEY (ID),
        FOREIGN KEY (`job-id`) REFERENCES Job(`id`)
) ENGINE=INNODB;

The above SQL commands will create a Job table and a Person table in the db-instance database.

Steps to interact with the database through JDBC

  • Load the database driver.
  • Provide a username and password pair and name of database instance to get a Connection object.
  • Create a Statement object from the Connection object.
  • Use the Statement object to execute SQL commands to interact with the database.

Sample code to interact with the database through the JDBC api.

Connection dbConnection = null;
try {
     // Load the MySQL driver
     Class.forName("com.mysql.jdbc.Driver");
     // Connect to the database instance (db-instance)
     // @ localhost with a user account (identified by user and password).
     dbConnection = DriverManager.getConnection("jdbc:mysql://localhost/"
             + "db-instance", "user", "password");
     // Execute a SQL select statement on the database.
     Statement sqlStat = dbConnection.createStatement();
     ResultSet sqlResult = sqlStat.executeQuery("SELECT * FROM Person");
     // Traverse sqlResult
     while(sqlResult .next()) {
         // Get the value of job-id
         int jobId = sqlResult.getInt("job-id");
         System.out.println("Job ID: " + jobId);
     } // end while

} catch (ClassNotFoundException cnfe) {
     System.out.println(cnfe.getMessage());
} catch (SQLException sqle) {
     System.out.println(sqle);
} finally {
     // Free up resources used
     if (dbConnection != null) {
         try {
             dbConnection.close();
         } catch (SQLException sqle) {
             // Swallow any exceptions when closing the connection.
         } // end try-catch block
     } // end if
} // end try-catch block

What is wrong with the above code?

Based on the database schema shown earlier, we can see that the job-id column of the Person table can contain null values. However, in the above coding, we are using the getInt() method of the ResultSet class to retrieve a the job-id value. The int data type being one of Java's primitive types is not able to store the null. On my machine, the getInt() method returns 0 when it hits a null on the job-id.

How to solve the problem?

There are two ways to detect whether a null value is read.

1) Use the wasNull() method provided by the ResultSet class.

// Traverse sqlResult
while(sqlResult.next()) {
    // Get the value of job-id
    int jobId = sqlResult.getInt("job-id");
    // if jobId is supposed to be null
    if (sqlResult.wasNull()) {
            System.out.println("Job ID: null");
    } else {
            System.out.println("Job ID: " + jobId);
    }
} // end while

2) Use the getObject() method instead of the getInt() method to retrieve the value of the job-id column. By using the getObject() method, we are able to get null values if there any appears.

// Traverse sqlResult
while(sqlResult.next()) {
    Object jobId = sqlResult.getObject("job-id");
    if (jobId == null) {
        System.out.println("Job ID: null");
    } else {
        System.out.println("Job ID: " + jobId);
    } // end if (jobId == null)
} // end while

About Clivant

Clivant a.k.a Chai Heng enjoys composing software and building systems to serve people. He owns techcoil.com and hopes that whatever he had written and built so far had benefited people. All views expressed belongs to him and are not representative of the company that he works/worked for.