循环加载数据库中的数据

时间:2015-09-17 08:37:50

标签: java mysql swing for-loop

我想问:为什么当我加载我的程序时它不会出现?

我的程序是当我点击我的按钮时,它将从我的数据库中的所有组件加载。我使用方法getRow();中的循环。奇怪的是,netbeans没有错误,但图片并不想显示。我认为SQL没有错误。如何解决?

public void loaddata(){
try{
    ImageIcon img;
    koneksi_db();
    java.sql.Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery("Select * FROM component where UsernameID ='"+jLabel5.getText()+"' ");    // query for load as username login

    for (int i=1; i<rs.getRow(); i++){   // loading data using loop from get row
        rs.getRowId(i);
        JLabel draggy = new JLabel();
        String imagePath =  rs.getString("source");
        int x = rs.getInt("coordinatX");
        int y = rs.getInt("coordinatY");
        String nama = rs.getString("UniqueID");
        img = new ImageIcon(getClass().getResource(imagePath));
            draggy.setIcon(img);
            draggy.setText(nama);
            this.add(draggy);
            draggy.setBounds(x, y, 70, 70); //calling dragy (jlabel) in frame.
    }
    }catch(Exception e){

     JOptionPane.showMessageDialog(null,"error in sql");
    }
}

1 个答案:

答案 0 :(得分:2)

您的for循环未运行,因为i<rs.getRow()始终为false

引用ResultSet.getRow()的javadoc:

  

检索当前行号。第一行是数字1,第二行是数字2,依此类推。 [...]返回当前行号; 0,如果没有当前行

由于您从未检索过某行,因此会返回0

引用ResultSet的javadoc:

  

ResultSet对象维护一个指向其当前数据行的光标。最初,光标位于第一行之前。 next方法将光标移动到下一行,因为当false对象中没有更多行时它返回ResultSet,它可以在while中使用循环迭代结果集。

所以,你写这样的循环:

while (rs.next()) {
    // call rs.getXxx methods to retrieve column values
}

此外,不要通过使用字符串连接和用户输入的字符串来构建SQL语句。这将使您容易受到SQL Injection攻击,允许用户窃取或删除所有数据

相反,请使用PreparedStatement

String sql = "SELECT * FROM component WHERE UsernameID = ?";
try (PreparedStatement stmt = conn.prepareStatement()) {
    stmt.setString(1, jLabel5.getText());
    try (ResultSet rs = st.executeQuery()) {
        while (rs.next()) {
            // code here
        }
    }
}