Java 尝试转换Arraylist<;LatLng>;在插入数据库之前插入字符串

Java 尝试转换Arraylist<;LatLng>;在插入数据库之前插入字符串,java,jdbc,arraylist,foreach,tostring,Java,Jdbc,Arraylist,Foreach,Tostring,我尝试将我的ArrayList列表1插入到数据库MySQL中的表中,例如插入到一列,类似这样的值:(99.999999,99.999999): 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

我尝试将我的
ArrayList列表1
插入到数据库MySQL中的表中,例如插入到一列,类似这样的值:
(99.999999,99.999999)

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在字符串s下加了下划线,并说:

Incompatible types
Required: com.google.android.gms.maps.model.LatLng
Found: java.lang.String
在我看来,Android Studio试图告诉我:您需要将所有值从
ArrayList list1
转换为
String


是否可以用一种方法转换my
ArrayList
中的所有值?

不好的做法:

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();
您可以通过以下方式将数据转换为字符串:

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语句,然后使用“setString()”或“setInt()”或任何您想要插入的类型插入值。

不好的做法:

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();
您可以通过以下方式将数据转换为字符串:

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语句,然后使用“setString()”或“setInt()”或任何您想要插入的类型插入值。

错误告诉您ArrayList不包含字符串,而不是您必须转换为字符串。不能像以前那样将LatLng类型的数组项隐式转换为字符串

您的
for
声明应为:

for(LatLng ll : list1)
假设您使用的是PostgreSQL/PostGIS,则应将LatLng值存储在中。正如@在您的注释中指出的,将逗号分隔的字符串存储在单个列中或自己引用该字符串不是一个好的做法


这里有一个链接解释如何使用。或者,您可以将lat和lng分别存储在“双精度”数据类型中。

错误告诉您ArrayList不包含字符串,而不是您必须转换为字符串。不能像以前那样将LatLng类型的数组项隐式转换为字符串

您的
for
声明应为:

for(LatLng ll : list1)
假设您使用的是PostgreSQL/PostGIS,则应将LatLng值存储在中。正如@在您的注释中指出的,将逗号分隔的字符串存储在单个列中或自己引用该字符串不是一个好的做法

这里有一个链接解释如何使用。或者,您可以将lat和lng分别存储在“双精度”数据类型中

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


  • 你正在使用哪个版本的jave?不,不,不,不,不!!!!!永远不要在一列中存储多个值!!!你应该做的第一件事是学习如何使用,这样你的Android应用程序就不会包含一个称为SQL注入的严重安全漏洞。你不是在每个值之间缺少一个逗号吗?你使用的是哪个版本的jave?不,不,不,不,不!!!!!永远不要在一列中存储多个值!!!你应该做的第一件事是学习如何使用,这样你的Android应用程序就不会包含一个称为SQL注入的严重安全漏洞。你不是在每个值之间缺少一个逗号吗?有点成功!但应用程序将所有值添加到表中的一行中,你们知道如何修复它吗?@patrick1980我的上一次编辑应该可以满足你们的需要。基本上,您每行发送一个insert命令。您已经回答了问题,但正在推广糟糕的编程,所以我对您的答案投了反对票。@Genemayers是的,您完全正确。我已经用更好的方法编辑了我的答案。“若泽,我再次支持你,但是Palrk1980仍然应该考虑使用一个更好的数据类型来存储这个值:-一个小小的成功!但应用程序将所有值添加到表中的一行中,你们知道如何修复它吗?@patrick1980我的上一次编辑应该可以满足你们的需要。基本上,您每行发送一个insert命令。您已经回答了问题,但正在推广糟糕的编程,所以我对您的答案投了反对票。@Genemayers是的,您完全正确。我已经用更好的方法编辑了我的答案。“若泽,我再次投票支持你,但是Palrk1980仍然应该考虑使用一个更好的数据类型来存储这个值: