Prepared Statement to DB设置变量类型处理
Prepared Statement to DB setting variable type handling
这道题是关于从字符串的散列生成准备语句并处理一些日期、时间和 Int 的字符串。
我有一个数据库,这个数据库的列名存储在列表"columns"。
我还有一个 hashmap "pdf",它存储 PDF 文档中的字段名和值。
下面的代码根据 pdf 哈希图从数据库中查找匹配的列名,如果找到则将其插入。
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:
年龄(国际)
出生日期(日期)
得分(国际)
日期开始(日期)
时间开始(时间)
我还想将数据库修改为只有一个 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" 让我头疼。
如有任何帮助,我们将不胜感激。我已经在使用 Joda,因为它 Java7.
干杯
-铝
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);
}
标准 JDBC 仅接受 date/time 作为
的实例
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
.[=15 上使用正确的方法(setDate
、setTime
或 setTimestamp
) =]
这道题是关于从字符串的散列生成准备语句并处理一些日期、时间和 Int 的字符串。
我有一个数据库,这个数据库的列名存储在列表"columns"。
我还有一个 hashmap "pdf",它存储 PDF 文档中的字段名和值。
下面的代码根据 pdf 哈希图从数据库中查找匹配的列名,如果找到则将其插入。
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:
年龄(国际) 出生日期(日期) 得分(国际) 日期开始(日期) 时间开始(时间)
我还想将数据库修改为只有一个 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" 让我头疼。
如有任何帮助,我们将不胜感激。我已经在使用 Joda,因为它 Java7.
干杯
-铝
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);
}
标准 JDBC 仅接受 date/time 作为
的实例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
.[=15 上使用正确的方法(setDate
、setTime
或 setTimestamp
) =]