java - 无法在Java中的数据库中存储日期变量

标签 java database jsp jakarta-ee servlets

我试图在数据库中保留用户的最后登录日期。以下是必要的部分:

在我的登录页面中,我创建一个 Date 对象并将其放入我的 session 中,我导入 java.util.Date:

<% 
Calendar c = Calendar.getInstance();

Date l = new Date(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),c.get(Calendar.HOUR),c.get(Calendar.MINUTE)); //the midnight, that's the first second of the day.


//Globals.customer.lastlogin=l;
session.setAttribute("lastlogin", l);   %>

然后,当登录成功时,我会更新 servlet 中的数据库,单击登录按钮时会调用此 servlet:

try {
    int result=-1;
    PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
            "UPDATE users set lastlogin='"+(Date)session.getAttribute("lastlogin")+"' where username='"+session.getAttribute("username")+"'");


        result= checkDB.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我将laSTLogin 作为日期变量保留在我的数据库中。但在尝试更新上次登录时出现以下错误:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'Wed Jul 02 05:49:00 VET 3913' for column 'lastlogin' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2936)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1601)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1710)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2436)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1402)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1694)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1608)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1593)
at classes.LoginServlet.service(LoginServlet.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)

有人可以帮我解决这个问题吗?谢谢

最佳答案

您应该利用PreparedStatement 并使用 ?参数的占位符。

PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
                "UPDATE users set lastlogin=? where username=?");

checkDB.setDate(1, (Date)session.getAttribute("lastlogin"));
checkDB.setString(2, session.getAttribute("username"));

这将根据数据库的要求正确格式化日期。

关于java - 无法在Java中的数据库中存储日期变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17423247/

相关文章:

java - Eclipse > .html 文件未打开

java - 需要 SQLite 仅用新信息替换行

mysql - 数据库设计 : Multiple tables vs a single table

java - libgdx font.setscale 给出巨大的值

python - 将初始数据从数据库传递到 Django 表单向导模板

php - 聚集活跃的访客;在数据库中为每个访问者分配一个唯一的用户行

javascript - 注销后不要返回jsp中的上一页

javascript - 合并JSP表中的重复行

java - 使用 c :import in a . jsp 导入特定元素

javascript - 尝试在 xslt 中调用 javascript 函数时出错(Java JDK 8)