我想用从数据库中选择的数据填充我的 ArrayList,但它复制了我没有得到的所有行。
Connection conn = DriverManager.getConnection(url, userid, password);
String strSql = "SELECT * FROM events, eventStats" ;
PreparedStatement Stmt = conn.prepareStatement(strSql);
ResultSet rs = Stmt.executeQuery(strSql);
while(rs.next()){
Events user = new Events();
user.seteName(rs.getString(2));
user.setePlace(rs.getString(4));
user.seteDate(rs.getString(5));
user.seteInscrit(String.valueOf(rs.getInt(8)));
user.seteTotal(String.valueOf(rs.getFloat(10)));
data.add(user);
}
感谢您的帮助!
您实际上并没有看到最严格意义上的"重复"行。
您看到的是笛卡尔积,即一个表中的每一行都连接到另一个表中的每一行。你得到这个是因为你的SQL语句中有一个笛卡尔连接(或者如果你愿意的话,有一个交叉连接):
SELECT * FROM events, eventStats
-- ^^^^^^^^^^^^^^^^^^
这意味着对于events
表中的每一行,您将获得等于eventStats
表中行数的结果数。将它们加在一起,看起来很多重复项实际上是两个表中所有行的大量唯一组合
。在很多情况下,笛卡尔联接是可取的,但它通常是查询错误的指标,如果其中一个表特别大,可能会对系统产生巨大的性能影响。1
为了避免这种情况,您需要指定每个表中的哪一列用于将两个表连接在一起,或者通过显式连接:
SELECT *
FROM events v
[INNER|LEFT OUTER|RIGHT OUTER] JOIN eventStats s
ON v.SomeColumn = s.SomeMatchingColumn
或隐式的:
SELECT *
FROM events v, eventStats s
WHERE v.SomeColumn = s.SomeMatchingColumn
如果不看到表结构,很难告诉您更多,但是这两个表之间可能存在外键关系,这就是您要连接的列。
1笛卡尔连接将返回的行数等于连接中涉及的表大小的乘积。例如,假设events
表包含 50,000 行,eventStats
表也有 50,000 行,每个event
一个。通过对这些表进行笛卡尔连接,您的查询将返回高达2,500,000,000,000,是的,即 25亿行数据。现在想象一下,把所有这些读成ArrayList
......除非你不能,因为 Java 数组不能变得那么大!在读取所有数据之前,应用程序将崩溃并显示java.lang.OutOfMemoryError: Requested array size exceeds VM limit
或java.lang.OutOfMemoryError: Java heap space
。