Java/MySQL dao 存储空值和空指针异常 - 保持简单

标签 java mysql sql dao

我正在为我的应用程序使用一个简单的 DAO。它是 MySQL 5.5 和 MySQL Connector for Java。我使用框架并不是为了让事情变得简单。我只是使用 EclipseLink JPA 创建模型对象,然后手动编码 daos。

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

但是当我尝试使用 DAO 存储用户对象时,它会因为将 null 值放入 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;
}

最佳答案

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

关于Java/MySQL dao 存储空值和空指针异常 - 保持简单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20579588/

相关文章:

sql - 查找与 hive 中先前时间戳的天数差异

java - JLabel 不会更新/显示。初始化问题?

java - 如何使用 Java 将一个字符串切割成 1 兆字节的子字符串?

php - 长期 session 存储(php 购物车)

带有匹配和反对的Mysql全文搜索

sql - PostgreSQL:使用动态名称联合多个表

java - 写入多个文件时,为 MultiResourceItemWriter 创建的所有文件指定页眉和页脚 -spring batch

java - 手动代码计算

mysql - 如何避免 MySQL 的隐式转换(截断不正确的 DOUBLE 值)

mysql - 根据计数查询的结果插入记录数