我想问:为什么当我加载我的程序时它不会出现?
我的程序是当我点击我的按钮时,它将从我的数据库中的所有组件加载。我使用方法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");
}
}
答案 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
}
}
}