无法从DB获取所需数据

时间:2014-03-20 02:50:07

标签: java jdbc collections

我有一张这样的桌子。

AreaId  LineId  ShapePointno    x   y
1             0    0            2   3
1             0    1            2   5
1             0    2            3   8
1             1    0            2   6
1             1    1            3   2

在此之前,我会解释这些问题。 属于AreaId1 1的线Id 0具有3个形状点,编号为0,1和2.其x和y对应于其坐标位置。

有了这样的背景,让我把问题放在手中。

我需要获取这些记录并将其带到 java

引入时,我需要将它作为一条线的形状点块。 (即)前3行作为一个块,接下来2个在不同的块中。这背后的原因是我需要修改x& y值和修改函数需要以下参数。

  i)AreaID, LineId, A 2D array of its shape points).

这是我尝试过的。

 Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/task4DB?"
              + "user=root&password=123");
    PreparedStatement st = con.prepareStatement("select Distinct AreaId from TableName")
    ResultSet r1=st.executeQuery();
   while (r1.next())
    {
    int id = r1.getInt("AreaId");
    PreparedStatement st1 = con.prepareStatement("select Distinct LineId where AreaId = id")
    ResultSet r2=st1.executeQuery();
    while (r2.next())
    {
      int lineid = r2.getInt("LineId");
      PreparedStatement st2 = con.prepareStatement("select x,y  where AreaId = id and LineId = lineid")
      ResultSet r3=st2.executeQuery();
      int size = 0;
      int [][]xy = new int[r3.getCount()][r3.getCount()]
       while (r3.next())
      {

       xy[size][0] = r3.getInt("x");
       xy[size][1] = r3.getInt("y");
       size++;
      }
     callShapePointConv(id,lineId,xy);
    }
 }

我没有得到预期的结果而是显示垃圾值/

请帮帮我。

此外,还有其他更好的替代可用而不是三个while循环吗?

请帮助我。 提前谢谢!

3 个答案:

答案 0 :(得分:1)

我找到了 - 在第14行,您正在执行st1.executeQuery()但它应该是st2.execute查询

我评论了你的专栏,并添加了正确的专栏。

Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/task4DB?"
              + "user=root&password=123");
    PreparedStatement st = con.prepareStatement("select Distinct AreaId from TableName")
    ResultSet r1=st.executeQuery();
   while (r1.next())
{
int id = r1.getInt("AreaId");
 PreparedStatement st1 = con.prepareStatement("select Distinct LineId where AreaId = id")
 ResultSet r2=st1.executeQuery();
 while (r2.next())
{
 int lineid = r2.getInt("LineId");
 PreparedStatement st2 = con.prepareStatement("select x,y  where AreaId = id and LineId = lineid")
 //ResultSet r3=st1.executeQuery();
  ResultSet r3 = st2.executeQuery();
int size = 0;
int [][]xy = new int[r3.getCount()][r3.getCount()]
 while (r3.next())
{

 xy[size][0] = r3.getInt("x");
 xy[size][1] = r3.getInt("y");
 size++;
}
callShapePointConv(id,lineId,xy);
}
}

答案 1 :(得分:1)

除了Java代码之外,您还可以通过以下方式降低数据库设计的复杂性,

<强> TABLE_1:

AreaLineId(FK) ShapePointno   x     y
    0              0          2     3
    0              1          2     5
    0              2          3     8
    1              0          2     6
    1              1          3     2

表_2:

AreaLineId   AreaId   LineId    
   0           1        0    
   1           1        1       

现在查询将是,

select x,y from table_1 where AreaLineId = id;

和另一个从table_2获取id的选择wapper查询将以较低的复杂度完成工作。

答案 2 :(得分:1)

我只是在这里讨论,但你的选择在很多方面存在缺陷。

select Distinct LineId where AreaId = id

首先,你在哪里FROM表声明。 第二:你想根据以前检索到的id获取LineId的不同列表吗?

如果是这样,您的参数化选择应如下所示:

select Distinct LineId from table_2 where AreaId = ?

但你应该查看的是如何在select语句中使用连接。

<强>更新

您的代码不再有意义。

首先,您将获得唯一的AreaIds。 - &GT; 1

然后你会获得独特的LineIds - &gt; 0,1

然后从表中选择所有元素,其中

(1) while: AreaId = 1 
   and L
   (2) while:
          (loop 1) lineId = 0 
          (loop 2) lineId = 1

这将最终返回表格内容:)

也许,这可以帮到你:

这将基于areaId和lineId将x和y分组为值列表。

SELECT
    AreaId,
    LineId,
    GROUP_CONCAT(table.x),
    GROUP_CONCAT(table.y)
FROM
    `table`
GROUP BY
    AreaId,
    LineId
ORDER BY
    table.ShapePointno

结果:

AreaId LineId GROUP_CONCAT(table.x)  GROUP_CONCAT(table.y)
1      0      "2,2,3"                "3,5,8"
1      1      "2,3"                  "6,2"