开发者社区 问答 正文

使用PrepareStatement查询时报错的原因(已经查找了一晚上了QWQ)?报错

小白在练习使用 prepareStatement 进行增删改查时遇到一个问题,查找了一晚上也不知道有什么问题,所以在这里发帖,希望有路过的大佬能帮我解决一下。部分代码如下:

//username 在数据库中的类型为 varchar

//sql = "select * from  user  where username = "+ "\""+ username + "\"";  可以通过拼接字符串获取数据

//使用下面这种方法会报错:You have an error in your SQL syntax; check the manual that corresponds to your //MySQL server version for the right syntax to use near '?' at line 1

        sql = "select * from  user  where username=?";
        preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1, username);
        resultSet = preparedStatement.executeQuery(sql);

//通过 id 查找数据也报错,id 在数据库中为 int,报错情况与上面一样

sql = "select * from `user` where id = ?"         
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setInt(1, id);
resultSet = preparedStatement.executeQuery(sql);

注:下面的代码可以正常运行:

        sql = "insert into `user`(`username`,`password`,`type`) values (?,?,?);";
        preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1, username);
        preparedStatement.setString(2, password);
        preparedStatement.setString(3, type);
        int result = preparedStatement.executeUpdate();

请问我这是什么原因啊,请大佬帮我解答一下,我先在这里跪谢了

展开
收起
爱吃鱼的程序员 2020-06-05 15:58:59 1251 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        mysql版本多少?
                    
    
                            可能是因为MySQL版本的问题么,我是今年下的,具体的版本记不得了,我明天才用电脑然后才可以看
                        
    
                        <p>我mysql的版本是 8.0.15,今天又试了一遍,清理工作空间、重新创建工作空间也还是一样报错</p>
                    
    
                        <p>最好把堆栈或异常信息贴出来。user或者其他字符有可能是特殊字符,用‘’括起来</p>
                    
    
                        我之前也考虑过关键字的问题,但是不是的。我今晚看看能不能把异常信息贴出来
                    
    
                        <p><img height="752" src="https://oscimg.oschina.net/oscnet/8cb5b9c8d16d996e1cf65e32302dcaef333.jpg" width="1415">这是我全部的报错信息。另外,在 sqlyog 中使用 SELECT * FROM  USER  WHERE username ="aaa"; 是可以查询的,同时直接将 sql = "SELECT * FROM  USER  WHERE username =?"; 直接换成 sql = "SELECT * FROM  USER  WHERE username =\"aaa\";";  是可以运行的。但是一旦使用 SQL 注入就会报错</p>
                    
    
                        <p>控制台输出或者开调试看下替换后的sql语句,用得到的sql去查下看看是不是替换出问题了,数据库里好像是用的 ' 单引号而不是 " 双引号</p>
                    
    
                        <p>应该是自己哪里写错了,String sql = "select * from t_user where uname=? and pwd=?"; 这个在myeclipse 跑起来了,真的迷。。。</p>
                    
    
                        <p>代码,应该没有问题,重新编译下试试吧</p>
                    
    
                        <p>resultSet = preparedStatement.executeQuery(sql);  <strong>错误产生的地方就在这里。把参数sql去掉</strong></p> 
    

    resultSet = preparedStatement.executeQuery();

    执行正确。

     

                            我傻了,之前没这个想过。谢谢大哥(有段时间没有登oschina了,所以现在才回)
    
    2020-06-05 15:59:19
    赞同 展开评论