我正在为我的应用使用简单的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;
}
答案 0 :(得分:0)
请查看JDBC API。通过使用PreparedStatement.setXxxx(index,null)
设置null,不会将空值写入数据库。请改用setNull(index,sqlType)
方法。