带有多行循环的SQL INSERT

时间:2014-10-29 12:33:28

标签: java sql postgresql loops jdbc

我试图使用jdbc将骨架数据插入数据库。

到目前为止,我的代码是:

   Statement st=con.createStatement();
   String sql = "INSERT INTO student (studentid, titleid, forename, familyname, dateofbirth) "
                    + "VALUES (1, 1, 'forename1', 'surname1', '1996-06-03');";

我需要为此创建100个条目,而且我不太清楚如何去做。 我想要的只是学生ID,titleid,forename和familyname增加1,直到它达到100个条目并填入这些行,出生日期不需要改变。我问的是如何为这个

做一个循环

2 个答案:

答案 0 :(得分:2)

一般答案 - 您应该使用PrepareStatement代替Statement并批量执行。

插入多个条目或执行

的常用方法
String sql = "INSERT INTO student (studentid, titleid, forename, familyname, dateofbirth) "
                    + "VALUES (?, ?, ?, ?, ?);";
ps = connection.prepareStatement(SQL_INSERT);
for (int i = 0; i < entities.size(); i++) {
    ps.setString(1, entity.get...());
    ...
    ps.addBatch();
}
ps.executeBatch();

重要提示:

  1. Why you should use PrepareStatement Over Statement

  2. SQL Injection Example

答案 1 :(得分:0)

有两种方法可以做到这一点。您可以将插入查询放在循环中,也可以将循环放在插入查询中。我发现更好的方法取决于数据库引擎(但我从未使用过postresql)和你想要插入的记录数。您可能会遇到最大查询长度或参数数量等。

以下代码示例是ColdFusion,但它旨在显示在查询中包含循环的一般概念。你必须在java中编写等效的代码。

<cfquery>
insert into yourtable
(field1
, field2
, etc)
select null
, null
, null
from SomeSmalllTable
where 1 = 2
<cfloop>
union
select <cfqueryparam value="#ValueForField1#">
, <cfqueryparam value="#ValueForField#">
, etc
</cfloop>
</cfquery>