Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PreparedStatement Wilcard不';行不通_Java_Mysql_Prepared Statement - Fatal编程技术网

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+"%'");