我正在实施Java"忘记密码功能"并需要在重置密码页面添加一个到期时间。我为时间创建了一个Calendar类对象,并添加了30分钟。代码如下:
java.util.Date utilDate = new java.util.Date();
Calendar cal = Calendar.getInstance();
cal.setTime(utilDate);
cal.add(Calendar.MINUTE, 30);
在数据库查询中用作:
String query = "INSERT INTO forgotpasskeytab (keyId, emailid, expireIn) VALUES ('"+uniqueID+"','"+emailid+"','"+cal.getTime()+"')";
我的forgotpasskeytab
表格中的 expireIn 列的类型为timestamp
。
运行时出现以下错误:
com.mysql.jdbc.MysqlDataTruncation:数据截断:日期时间值不正确:' Fri Oct 09 20:39:14 IST 2015'对于列' expireIn'在第1行
还有其他更好的方法可以在mysql DB表中保存过期时间吗?
答案 0 :(得分:2)
从不使用字符串连接在SQL中插入文本值,除非您希望让自己对SQL Injection攻击持开放态度,允许黑客删除或窃取您的所有数据。请改用PrepareStatement
。
这也有助于日期/时间值:
String sql = "INSERT INTO forgotpasskeytab (keyId, emailid, expireIn) VALUES (?,?,?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, uniqueID); // or setInt?
stmt.setString(2, emailid); // or setInt?
stmt.setTimestamp(3, new java.sql.Timestamp(cal.getTimeInMillis()));
stmt.executeUpdate();
}
答案 1 :(得分:0)
为了使您的查询正常工作,您需要一个java.sql.Timestamp的时间戳实例和您的' cal.getTime()'返回错误的java.util.Date实例。
因此,以下查询应该适合您的情况:
String query = "INSERT INTO forgotpasskeytab (keyId, emailid, expireIn) VALUES ('"+uniqueID+"','"+emailid+"','"+ new java.sql.Timestamp(cal.getTime()) +"')";