Java PreparedStatement Wilcard不';行不通
我有一个带有表Java PreparedStatement Wilcard不';行不通,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,我有一个带有表users的DDBB,我试图通过搜索user\u name来获取字段user\u id和user\u pass。 因此,当我运行以下查询时: SELECT `user_id`, `user_pass` FROM `users` WHERE `user_name` LIKE '%aName%'; 它返回,即aName=“John”: 好的,那么我想使用PreparedStatement执行此操作,因此我创建了此函数: private final String QUERY_GETUS
users
的DDBB,我试图通过搜索user\u name
来获取字段user\u id
和user\u pass
。
因此,当我运行以下查询时:
SELECT `user_id`, `user_pass` FROM `users` WHERE `user_name` LIKE '%aName%';
它返回,即aName=“John”:
好的,那么我想使用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;
}
此函数是侦听器对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);
}
}
可以想象,有一个JDialog和一个JComboBox,下面列出了所有用户。
由于表users
是自动递增的,因此user\u id
有一些间隙(或者可能会有),构建JComboBox的唯一方法是不将user\u id
与JComboBox索引关联
但是,问题是,每当我从JComboBox中选择一个项目,并运行该过程以基于所选项目(或索引)获取user\u id
和user\u pass
,结果集总是空的
有什么想法吗?
谢谢。更换
st.setString(1, "'%"+usrName+"%'");
与
单引号由PreparedStatement
自动添加。使用引号,查询将查找字符串'%usrname%'
,而不是%usrname%
替换
st.setString(1, "'%"+usrName+"%'");
与
单引号由PreparedStatement
自动添加。使用引号,查询将查找字符串'%usrname%'
,而不是%usrname%
st.setString(1, "%"+usrName+"%");
而不是
st.setString(1, "'%"+usrName+"%'");
试一试
而不是
st.setString(1, "'%"+usrName+"%'");
解决方案
正如Marco Forberg所指出的,用于envolve字符串参数(')的引号不是强制性的。删除它们可以解决问题。解决方案
正如Marco Forberg所指出的,用于envolve字符串参数(')的引号不是强制性的。删除它们可以解决问题。您可以发布生成的查询吗?@Stephan iirc这是不可能的,因为准备好的语句将与参数一起发送到db。没有在java上生成查询字符串side@MarcoForberg为了澄清这一点,我没有使用事先准备好的声明before@dasblinkenlight这不会产生SQL注入的风险,问题是他的参数值中有引号。您能发布生成的查询吗?@Stephan iirc这是不可能的,因为准备好的语句与参数一起发送到db。没有在java上生成查询字符串side@MarcoForberg为了澄清这一点,我没有使用事先准备好的声明before@dasblinkenlight这不会产生SQL注入的风险,问题是参数值中的引号。
st.setString(1, "'%"+usrName+"%'");