Java / MySQL dao存储空值和nullpointerexceptions - 保持简单

时间:2013-12-14 04:11:37

标签: java mysql sql dao

我正在为我的应用使用简单的DAO。它是MySQL 5.5和MySQL Connector for Java。我没有使用框架,希望保持简单。我只是使用EclipseLink JPA来创建模型对象,然后手动编写daos。

DAO创建一个用户对象,其中包含一些可选字段,用于将ID存储到其他表中。我将ID存储为Long。创建对象时,ID字段为空。这对我来说没问题,因为那些其他表对于用户来说是可选的。所以......在数据库中,ID字段可以是Long或null。 MySQL也可以。

但是当我尝试使用我的DAO存储用户对象时,它会将空值上的barf转换为Long。见下面的代码。

我知道我可以测试空值并将ID设置为零。但这并不比null更正确。这是额外的工作。

处理这种情况的最有效方法是什么?我创建第一个对象时将它们默认为0?看起来像一个软糖。

我也对我创建新唱片的方式持批评态度。我看到有一个单独的addUser和updateUser因为重复而更容易出错。这看起来更有效率。评论

由于

public User updateUser(User user) {
    Connection conn = DbUtil.getConnection();
    PreparedStatement ps;
    Statement st;
    ResultSet rs;

    try {

        if (user.getId()==null) {
            st = conn.createStatement();
            st.executeUpdate("INSERT INTO users (created, modified) VALUES(NOW(), NOW());");
            rs = st.executeQuery("SELECT LAST_INSERT_ID() AS id;");
            if (rs.next()) {
                Long id = rs.getLong("id");
                user.setId(id);
            }
        }

        String SQLupdate = "UPDATE users SET "
                + "travid      = ?, "
                + "busid       = ?, "
                + "email       = ?, "
                + "type        = ?, "
                + "name        = ?, "
                + "handle      = ?, "
                + "password    = ?, "
                + "passencr    = ?, "
                + "passhint    = ?, "
                + "question    = ?, "
                + "answer      = ?, "
                + "modified    = NOW(), "
                + "lastlogin   = ? "
                + "WHERE id    = ?";

        ps = conn.prepareStatement(SQLupdate);          
        ps.setLong(  1, user.getTravid());
        ps.setLong(  2, user.getBusid());
        ps.setString(3, user.getEmail());
        ps.setString(4, user.getType());
        ps.setString(5, user.getName());
        ps.setString(6, user.getHandle());
        ps.setString(7, user.getPassword());
        ps.setString(8, user.getPassencr());
        ps.setString(9, user.getPasshint());
        ps.setString(10, user.getQuestion());
        ps.setString(11, user.getAnswer());
        ps.setObject(12, user.getLastlogin());
        ps.setLong(13, user.getId());
        ps.executeUpdate();

    } catch (SQLException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();

    } finally {
        DbUtil.close(conn);
    }

    return user;
}

1 个答案:

答案 0 :(得分:0)

请查看JDBC API。通过使用PreparedStatement.setXxxx(index,null)设置null,不会将空值写入数据库。请改用setNull(index,sqlType)方法。