我正在尝试将一些数据插入数据库。为了实现这一目标,我创建了一个方法,该方法返回boolean
并接收ArrayList
Objects
类型Point
。一切都运行良好,直到我检查我的表,我发现它只是插入了一个点(每次的第一个点),虽然我有很多点(arrayList.size() > 0
)。如果我的arrayList.get(2).getXcoordinate()
,我可以达到arrayList.size(2)
,但我的方法只插入第一个索引(arrayList.size(0)
)。
我根本无法弄清楚我做错了什么。任何帮助或提示非常感谢。谢谢,卡尔 -
我的方法:
public boolean insertPoints(ArrayList<Point> arr) {
try {
con = this.getConnection();
st = con.createStatement();
if (con != null) {
for (int i = 0; i < arr.size(); i++) {
String id = arr.get(i).getId();
String x = arr.get(i).getXcoordinate();
String y = arr.get(i).getYcoordinate();
if (st.executeUpdate("INSERT INTO table (Id, X, Y)
VALUES (" + id + "," + x + "," + y + ")") > 0)
return true;
return false;
}
} else {
System.err.println("No connection, con == null ...");
return false;
}
} catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
return false;
} finally {
try {
if (rs != null) rs.close();
if (st != null) st.close();
if (con != null) con.close();
} catch (SQLException sqle) {
System.err.println("SQLException: " + sqle.getMessage());
}
}
return false;
}
答案 0 :(得分:2)
此代码不是您应该这样做的方式。
请使用PreparedStatement
绑定变量。
您的Connection
和PreparedStatement
不应该是班级成员。 Connection应该在其他地方实例化并传入。
PreparedStatement
应具有本地范围。
您应该在finally方法中关闭各个try / catch块中的资源。编写静态方法以重用并保持代码较小。
您也可以考虑批量调用这些调用,以便在一次往返中插入所有点。它会更高效。
// Your table's name is table? Terrible.
private static final String INSERT_SQL = "INSERT INTO table(Id, X, Y) VALUES (?, ?, ?)";
答案 1 :(得分:1)
以下内容:
if (st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
return true;
return false;
插入第一个值后将退出该方法,根据executeUpdate
的返回值返回true或false。
也许更像是这样的东西
for (int i = 0; i < arr.size(); i++) {
String id = arr.get(i).getId();
String x = arr.get(i).getXcoordinate();
String y = arr.get(i).getYcoordinate();
if (!st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
return false;
}
return true;
答案 2 :(得分:1)
这是有问题的
if (st.executeUpdate("INSERT INTO table (Id, X, Y)
VALUES (" + id + "," + x + "," + y + ")") > 0)
return true;
return false;
只需删除return语句并使用标志或计数器
答案 3 :(得分:-1)
试试这个:
public boolean insertPoints(ArrayList<Point> arr)
{
try
{
con = this.getConnection();
st = con.createStatement();
if (con != null)
{
boolean success = true;
for (int i = 0; i < arr.size(); i++)
{
String id = arr.get(i).getId();
String x = arr.get(i).getXcoordinate();
String y = arr.get(i).getYcoordinate();
if (st.executeUpdate("INSERT INTO table (Id, X, Y) VALUES (" + id + "," + x + "," + y + ")") > 0)
{
continue;
}
else
{
success = false;
break;
}
}
return success;
}
else
{
System.err.println("No connection, con == null ...");
return false;
}
}
catch (Exception e)
{
System.err.println("Exception: " + e.getMessage());
return false;
}
finally
{
try
{
if (rs != null) rs.close();
if (st != null) st.close();
if (con != null) con.close();
}
catch (SQLException sqle)
{
System.err.println("SQLException: " + sqle.getMessage());
}
}
return false;
}