Java 日期 - 插入到数据库中准备语句检索

2022-09-03 09:41:25

我需要找到一种方法将带有java.util.Date字段的记录插入到数据库中,然后我就卡住了。

有谁知道我该怎么做?现在我有类似的东西。

        java.util.Date myDate = new java.util.Date("01/01/2009");

        sb.append("INSERT INTO USERS");
        sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
        sb.append("VALUES ( ");
        sb.append("  '" + userId + "'");
        sb.append(", '" + myUser.GetFirstname() + "' ");
        sb.append(", '" + myUser.GetLastname() + "' ");
        sb.append(", '" + myUser.GetSex() + "' ");
        sb.append(", '" + myDate  + "'");
        sb.append(")");

        Util.executeUpdate(sb.toString());

但是当我运行这样的东西时,我得到错误:datetime值的字符串表示的语法不正确。

下面是 sql 语句的样子:

INSERT INTO USERS (USER_ID
    , FIRST_NAME
    , LAST_NAME
    , SEX
    , CRDATE) 
VALUES (   
    'user'
    , 'FirstTest' 
    , 'LastTest' 
    , 'M'
    , 'Thu Jan 01 00:00:00 CST 2009')

谢谢


答案 1

在我回答你的问题之前,我想提一下,你可能应该考虑使用某种ORM解决方案(例如,Hibernate),包装在数据访问层后面。你正在做的事情似乎非常反OO。诚然,我不知道你的代码的其余部分是什么样子的,但一般来说,如果你开始看到自己使用了很多 Utility 类,你可能采取了过于结构化的方法。

要回答您的问题,正如其他人所提到的,请查看 ,并使用 或 。类似的东西(为了尽可能多地使用你的原始代码,你可能想进一步改变它):java.sql.PreparedStatementjava.sql.Datejava.sql.Timestamp

java.util.Date myDate = new java.util.Date("10/10/2009");
java.sql.Date sqlDate = new java.sql.Date(myDate.getTime());

sb.append("INSERT INTO USERS");
sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
sb.append("VALUES ( ");
sb.append("?, ?, ?, ?, ?");
sb.append(")");

Connection conn = ...;// you'll have to get this connection somehow
PreparedStatement stmt = conn.prepareStatement(sb.toString());
stmt.setString(1, userId);
stmt.setString(2, myUser.GetFirstName());
stmt.setString(3, myUser.GetLastName());
stmt.setString(4, myUser.GetSex());
stmt.setDate(5, sqlDate);

stmt.executeUpdate(); // optionally check the return value of this call

这种方法的另一个好处是,它会自动为您转义字符串(例如,如果要插入姓氏为“O'Brien”的人,您的原始实现就会出现问题)。


答案 2

准备语句

您绝对应该使用ReadyStatement。(教程)

这样,您就可以调用:

pstmt.setDate( 1, aDate );

JDBC 驱动程序将执行适合您的特定数据库的日期时间处理。

此外,ReadyStatement会阻止任何SQL注入黑客攻击尝试 - 非常重要!)

它应该看起来像这样:

SimpleDateFormat format = new SimpleDateFormat( "MM/dd/yyyy" );  // United States style of format.
java.util.Date myDate = format.parse( "10/10/2009" );  // Notice the ".util." of package name.

PreparedStatement pstmt = connection.prepareStatement(
"INSERT INTO USERS ( USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE ) " +
" values (?, ?, ?, ?, ? )");

pstmt.setString( 1, userId );
pstmt.setString( 3, myUser.getLastName() ); 
pstmt.setString( 2, myUser.getFirstName() ); // please use "getFir…" instead of "GetFir…", per Java conventions.
pstmt.setString( 4, myUser.getSex() );
java.sql.Date sqlDate = new java.sql.Date( myDate.getTime() ); // Notice the ".sql." (not "util") in package name.
pstmt.setDate( 5, sqlDate ); 

就是这样,JDBC驱动程序将为您创建正确的SQL语法。

检索

检索 Date 对象时,可以使用 SimpleDateFormat 创建日期时间值的格式化字符串表示形式。

下面是一个快速的示例行,但搜索 StackOverflow 以获取更多内容

String s = new SimpleDateFormat("dd/MM/yyyy").format( aDate );