小白在练习使用 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();
请问我这是什么原因啊,请大佬帮我解答一下,我先在这里跪谢了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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了,所以现在才回)