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 = ?;//正确,因为加了单引号会当成参数处理
    

然鹅--------------------------------------------[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZwhG1c4-1586312889719)(file:///C:\Users\Gumption\AppData\Local\Temp\SGPicFaceTpBq\19284\0C784D2F.png)]

还不对!!!!!!!!!

因为我是模糊查询!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+"%") ;

结果来了:成功完活;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPxTneNW-1586312889731)(C:\Users\Gumption\AppData\Roaming\Typora\typora-user-images\1586227331115.png)]

结语:可喜可贺,虽然这个小问题排错的时间说出来都丢人,但是在排错中还是有很多收获。写文记录与君共享。

特此鸣谢在java起步路上热心指导的乔帮主。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐