【问题标题】:looping load data from database从数据库循环加载数据
【发布时间】:2015-09-17 08:37:49
【问题描述】:

我想问:为什么我加载我的程序时它没有出现?

我的程序是当我点击我的按钮时,它将从我的数据库中的所有组件加载。我正在使用来自方法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");
    }
}

【问题讨论】:

  • 容器是否使用了布局管理器?您是否尝试过重新粉刷容器?您是否验证了组件的位置?尝试使用ImageIO.read 而不是ImageIcon(URL)
  • 当然。我已经验证了组件的位置。当我尝试更改为 img = new ImageIO.read(getClass().getResource(imagePath)); 时出现错误找不到符号读取
  • 您是否添加了javax.imageio.ImageIO 的导入语句?
  • 是的,我一直在 import javax.imageio.ImageIO

标签: java mysql swing for-loop


【解决方案1】:

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

引用ResultSet.getRow()的javadoc:

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

由于您从未检索过一行,因此它返回 0

引用ResultSet的javadoc:

ResultSet 对象维护一个指向其当前数据行的游标。最初,光标位于第一行之前。 next 方法将光标移动到下一行,因为当ResultSet 对象中没有更多行时它返回false,所以可以在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
        }
    }
}

【讨论】:

  • 感谢建议。但是你能从我的脚本中给我一个例子来像我的脚本一样加载吗?没有 for.
  • 您的脚本中的一个示例。将// code here 替换为您的代码,以JLabel draggy = ... 开头并以draggy.setBounds(...) 结尾。
猜你喜欢
  • 2018-01-09
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2013-01-03
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多