本文已参与「新人创作礼」活动,一起开启掘金创作之路。
S Q L 中 ? 不匹配问题
(观看提醒:数据库:MySql8.0版本,驱动:5.1.4.7,jdk:MyEclipse 自带;对mybatis也有帮助)
报错
Parameter index out of range (1 > number of parameters, which is 0)
我的目的:通过while循环连接数据库,调取所有含有关键字的Newsname;
//原代码 conn =DaoConnect.getConnect(); String sql="SELECT * FROM news WHERE NewName LIKE '%?%'"; pt=conn.prepareStatement(sql);
pt.setString(1,string) ; rs=pt.executeQuery();
for (String string : str) { while(rs.next()){ KW=new KW_packeg(rs.getString("NewName"),rs.getString("NewLink"), rs.getString("PublishTime")); list.add(KW); } }
首先,报错后,经过长达6个小时的搜索奋战,网上出现的以下解决方案都没解决问题:
格式错误 :?中文 ? 英文
mybatis中:“xml被注释掉的的SQL代码中含有获取值得表达式 ,例如:/id=#{params.id}/或者/id=’${params.id}’/都会抛出此异常”
sql语句中**没有?**号,在后面用到了set语句。
“连接已经关闭。 如果与其他操作语句一起公用conn时,如果上一操作已经关闭连接,则会报错。表现为:时而能够进行操作,时而不能。”
在java中的预编译prepareStatement中:查询的写法:
SELECT * FROM news WHERE NewName = '****'//sql语句
String sql="SELECT * FROM news WHERE NewName = '?';//错误
String sql="SELECT * FROM news WHERE NewName = ?;//正确,因为加了单引号会当成参数处理
还不对!!!!!!!!!
因为我是模糊查询!Sql是长这样的:“SELECT * FROM news WHERE NewName LIKE ‘%***%’ ”
网上有这样的答案:在预编译语句中写成这样:’%’,?,’%‘
等等等等这样的格式问题,查询语句依然与占位符不匹配。
后来在大佬的远程协助下,发现一个问题,就是连接要写在循环里,即使你的循环体中只有一个值;
for (String string : str) {
//所有东西放进循环体
conn =DaoConnect.getConnect();
String sql="SELECT * FROM news WHERE NewName LIKE ?";
pt=conn.prepareStatement(sql);
//激动,终于查到了:不加单引号
pt.setString(1,"%"+string+"%") ;
rs=pt.executeQuery();
while(rs.next()){
KW=new KW_packeg(rs.getString("NewName"),rs.getString("NewLink"),rs.getString("PublishTime"));
System.out.println(rs.getString("NewName"));
list.add(KW);
}
}
此时,错误终于变了,,,变成了空指针,所以看来首当其冲的竟然不是格式问题。
继续,,,,改变格式,,,都不行。
于是,我把Like后面的一片都扣出来!!
在pt.setString里去拼接字符串!;
String sql="SELECT * FROM news WHERE NewName LIKE ?"; pt.setString(1,"%"+string+"%") ;
结果来了:成功完活;
结语:可喜可贺,虽然这个小问题排错的时间说出来都丢人,但是在排错中还是有很多收获。写文记录与君共享。
特此鸣谢在java起步路上热心指导的乔帮主。