这个问题与从字符串散列生成预备语句并处理Date,Times和Int的一些字符串有关。
我有一个数据库,这个数据库的列名存储在列表"列"。
我也有一个hashmap" pdf"它存储PDF文档中的字段名和值。
下面的代码根据pdf hashmap查找数据库中匹配的列名,如果找到则插入它。
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(日期) 分数(Int) DateStart(日期) 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"和#34; TimeStart"让我头疼。
这里的任何帮助将不胜感激。我从Java7开始就已经在使用Joda了。
干杯
-Al
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);
}
答案 0 :(得分: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对象转换为其中之一,并在setDate
上使用正确的方法(setTime
,setTimestamp
或PreparedStatement
)。