【问题标题】:Prepared Statement to DB setting variable type handling [duplicate]Prepared Statement to DB设置变量类型处理[重复]
【发布时间】:2016-03-10 21:02:30
【问题描述】:

这个问题是关于从字符串散列生成preparedstatement并处理一些字符串,包括日期、时间和整数。

我有一个数据库,这个数据库的列名存储在列表“columns”中。

我还有一个哈希图“pdf”,它存储 PDF 文档中的字段名和值。

下面的代码根据 pdf hashmap 从 DB 中查找匹配的列名,如果找到则插入它。

StringJoiner col = new StringJoiner(",");
StringJoiner val = new StringJoiner(",");
//First Iteration: Create the Statement
for(String c : columns) {
//Your PDF has a matching formfield 
   if(pdf.hasKey(c)) {
   col.add(c);
   val.add("?");
   }
 }
 String sql = String.format("INSERT INTO table (%s) VALUES (%s)",     col.toString(), val.toString());
 try(PreparedStatement insert = con.prepareStatement(sql)) {
   //Insert position in statement
   int pos = 0;
   //Second iterations: Bind the values to the statement
   for(String c : columns) {
     //Your PDF has a matching formfield 
    if(pdf.hasKey(c)) {
       insert.setString(++pos, pdf.get(c));
   }
 }
     insert.executeUpdate();
     } catch (SQLException e) {
       e.printStackTrace();
 }

这很好用,但我需要处理一些情况。 pdf 具有以下字段,即 Int 和 Date、Time:

年龄(智力) DOB(日期) 分数(智力) 日期开始(日期) TimeStart(时间)

我还想将数据库修改为只有一个 DateTimeStart 字段,可以同时保存两者。

现在我确实尝试过用类似的方法来处理这个问题:

                if (c.toLowerCase().contains("date")) {
                System.out.println("A Date field has been found: " +c);
                DateTimeFormatter formatter = DateTimeFormat.forPattern ("dd/mm/yyyy");
                DateTime startdt = formatter.parseDateTime(pdf.get(c));
                insert.setDate(++pos, startdt);
            }
            if (pdf.containsKey(c) && !c.toLowerCase().contains("date")) {
                insert.setString(++pos, pdf.get(c));
            }

但这不起作用。对于初学者 setDate 不接受 DateTime 对象,即使它们只包含一个日期。还试图了解新的准备好的语句,数据库现在只包含“DateTimeStart”而不是“DateStart”和“TimeStart”,这让我很头疼。

我们将不胜感激。我从 Java7 开始就在使用 Joda。

干杯

-铝

                if (c.toLowerCase().contains("date")) {
                    System.out.println("A Date field has been found: " +c);
                    DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/mm/yyyy kk:mm");
                    long millis = formatter.parseMillis(pdf.get("DateStart") +" " +pdf.get("TimeStart"));
                    Timestamp timeStamp = new Timestamp(millis);
                    insert.setTimestamp(++pos, timeStamp);
            }

【问题讨论】:

    标签: java date prepared-statement jodatime


    【解决方案1】:

    标准 JDBC 仅接受日期/时间作为

    的实例
    java.sql.Date       (date only)
    java.sql.Time       (date/time with 1 second resolution)
    java.sql.Timestamp  (date/time with fractional second resolution)
    

    您必须将您的 Joda 对象转换为其中之一,并在 PreparedStatement 上使用正确的方法(setDatesetTimesetTimestamp)。

    【讨论】:

    • 谢谢@Jim 所以看来我需要使用 setTimestamp 来进行插入?
    • 我想这就是我在回答中所说的...您选择所需的精度,将时间戳转换为 java.sql 类之一,并在 PreparedStatement 上使用正确的 set 方法.
    • 感谢@Jim,所以我最终会将我的 DateTime 作为毫秒时间值存储在数据库(MS Access)中。那对用户很不友好?仍在研究如何将我的日期字符串转换为 JDBC 接受的毫秒值。
    • 不,它将以数据库用于日期/时间的任何本机格式存储。您将接口 (java.sql.Timestamp) 与后端的实现混淆了。如果您的 DB 列是日期/时间,它将保持这种状态,并且 JDBC 将确保转换正确。你真的应该试验一下,看看你会得到什么。你可以回答很多你自己的问题。实验是最好的学习方式。
    • 嗨@Jim。感谢您的回复。我做了一些实验,我认为我已经接近我添加到问题中的代码(见上文)
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多