• 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
    

      

  • 相关阅读:
    A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
    Fliptile 开关问题 poj 3279
    Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
    Aggressive cows 二分不仅仅是查找
    Cable master(二分题 注意精度)
    B. Pasha and String
    Intervals poj 1201 差分约束系统
    UITextField的快速基本使用代码块
    将UIImage转换成圆形图片image
    color转成image对象
  • 原文地址:https://www.cnblogs.com/hephec/p/4570549.html
Copyright © 2020-2023  润新知