我的DDBB上有一个表格users
,我正在尝试通过搜索user_id
来获取字段user_pass
和user_name
。
所以,当我运行以下查询时:
SELECT `user_id`, `user_pass` FROM `users` WHERE `user_name` LIKE '%aName%';
它返回,即aName =“John”:
+---------+-----------+
| user_id | user_pass |
+---------+-----------+
| 5 | "1234" |
+---------+-----------+
好的,那么我想使用PreparedStatement执行此操作,因此我已经完成了这个功能:
private final String QUERY_GETUSERNAME2 =
"SELECT `user_id`, `user_fname`"
+ " FROM `users`"
+ " WHERE `user_fname` LIKE ?;";
private String[][] getUsersInv(String usrName){
ArrayList<String[]> alAux = new ArrayList();
String[][] ret = null;
try{
PreparedStatement st = _conn.prepareStatement(QUERY_GETUSERNAME2);
st.setString(1, "'%"+usrName+"%'");
ResultSet rs = st.executeQuery();
while(rs.next()){
String[] asAux = {String.valueOf(rs.getInt(1)), rs.getString(2)};
alAux.add(asAux);
}//while
}catch(SQLException e){
e.printStackTrace(System.out);
}finally{
if (!alAux.isEmpty()){
ret = new String[alAux.size()][alAux.get(0).length];
for (int i = 0; i < alAux.size(); i++)
ret[i] = alAux.get(i);
}//fi
}
return ret;
}
如您所见,该函数返回一个String [] [],因此如果返回值为null,我会检入上一个函数:
public void insertUsersInvTableModel(JTable table, String user){
DefaultTableModel model = (DefaultTableModel) table.getModel();
String[][] row = getUsersInv(user);
if (row != null)
model.addRow(row);
}
此函数是来自侦听器的JButton调用:
private void addUserActionPerformed(java.awt.event.ActionEvent evt) {
if (comboUsers.getSelectedIndex() != 0){
new Users(_conn).insertUsersInvTableModel(_target, String.valueOf(comboUsers.getSelectedItem()));
_target.validate();
_target.repaint();
setVisible(false);
}
}
你可以想象,有一个带有JComboBox的JDialog,其中列出了所有用户。
由于表users
是AUTO_INCREMENT,user_id
有一些空白(或者它可能会有),而构建JComboBox的唯一方法是没有关联user_id
到JComboBox索引。
但问题是,无论何时我从JComboBox中选择一个项目,我运行该过程以根据所选项目(也不是索引)获取user_id
和user_pass
,结果集永远是NULL。
有什么想法吗? 感谢。
答案 0 :(得分:2)
替换
st.setString(1, "'%"+usrName+"%'");
与
st.setString(1, "%"+usrName+"%");
单引号由PreparedStatement
自动添加。使用引号,查询将查找字符串'%usrname%'
而不是%usrname%
答案 1 :(得分:1)
试
st.setString(1, "%"+usrName+"%");
而不是
st.setString(1, "'%"+usrName+"%'");
答案 2 :(得分:0)
解 正如Marco Forberg指出的那样,用于envolve字符串参数(')的引号不是强制性的。删除它们可以解决问题。