尝试在插入数据库

时间:2016-11-05 19:45:48

标签: java jdbc arraylist foreach tostring

我尝试将带有很多值的ArrayList<LatLng> list1插入到数据库MySQL中的(99.9999999,99.9999999)表中,显示为1列,如下所示:

row 1 (99.9999999,99.9999999)  
row 2 (99.9999999,99.9999999)  
row 3 (99.9999999,99.9999999)

...全部为1列。

在我看来,目前我有一个很好的方法:

String sql = "INSERT INTO table1 VALUES(";
for(String s : list1) {
    sql = sql+"'"+s+"'"; 
}    
sql = sql+")";
stmt.executeUpdate(sql);

但Android Studio强调String s并说:

Incompatible types
Required: com.google.android.gms.maps.model.LatLng
Found: java.lang.String

在我看来,Android Studio试图说:我需要将所有值从ArrayList<LatLng> list1转换为String
是否可以在一种方法中转换ArrayList的所有值?

3 个答案:

答案 0 :(得分:3)

这样做的方法不好:

您可以通过以下方式将数据转换为字符串:

for(LatLng s : list1)
{
    String sql = "INSERT INTO table1 VALUES('"+s+"');
    stmt.executeUpdate(sql);
}

也就是说,你不必做任何特定的事情来转换它。我假设您在LatLng类中实现了toString()方法,以便为LatLng类型的对象提供有意义的字符串表示。

这样做的好方法:

String sql = "INSERT INTO table1 VALUES(?)";
PreparedStatement stmt = dbConnection.prepareStatement(sql);
for(LatLng s : list1){
    stmt.setString(1, s); // insert 's' in place of the 1st '?'
    stmt.addBatch();
}
stmt.executeBatch();

在最后一种情况下,您准备一批命令立即发送到您的数据库。这比发送许多sql语句要好得多,因为最终会减少很多开销。此外,您不是自己连接sql语句。你给初始的sql语句添加&#39;?&#39;占位符,然后使用&#39; setString()&#39;插入值。或者&#39; setInt()&#39;或者你要插入什么类型。

答案 1 :(得分:2)

错误告诉您ArrayList不包含字符串,而不是必须转换为字符串。您不能像现在这样隐式地将LatLng类型的数组条目转换为字符串。

您的for声明应为:

for(LatLng ll : list1)

假设您使用的是PostgreSQL / PostGIS,则应将LatLng值存储在point datatype中。正如@ juergen d在您的评论中所指出的,将逗号分隔的字符串存储在单个列中或自己引用字符串并不是一个好习惯。

这是一个解释如何store the LatLng data as a Point in PostGIS的链接。或者,您可以将lat和lng分别存储为“双精度”数据类型。

答案 2 :(得分:1)

  1. 使用toString实例上的LatLng方法将其转换为字符串。
  2. 不要尝试自己引用SQL查询中的参数;为此目的使用API​​对占位符的支持。试图自己引用字符串会使攻击者破坏或操纵您的数据库变得微不足道。