用jdbc做查询操作时动态拼接参数报SQL语法错误的问题

本文介绍了一种常见的Java Web开发中使用JDBC时遇到的问题——动态拼接SQL语句引发的错误,并提供了解决方案,即使用PreparedStatement来防止SQL注入攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
自学用java开发后台服务的过程中,操作数据库的框架选用的jdbc。在用jdbc查询数据库时,有时需要动态的拼接查询语句(select...)所需要的参数,比如在servlet中获取到请求的url携带的参数IP:
String ip = request.getParameter("ip");
然后用这个ip动态的在servlet中拼接SQL语句:
String sql = "select *from <数据表名> where ip = "+ip;
然后用相关api执行SQL语句:

//省略连接数据驱动以及建立连接的代码
statement = connection.createStatement();
statement,executeQuery(sql);
上面的逻辑看似没有问题,但是结果却报错,主要是说从IP地址的第二个点号往后的语法有错,也就是拼接的类似192.168.xxx.xxx这样的参数时,会提示.xxx.xxx这附近的语法有错,而我手动拼接固定参数时,比如sql = "select *from xxx where ip=\"192.168.xxx.xx\"";这样却可以通过,初步怀疑是这个api的使用不熟,导致SQL语句写不正确。
解决方式:
用PreparedStatement代替Statement,借助通配符可以把参数进行挨个设置:
String SQL= "select *from xxx where ip = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,ip);//拼接IP
statement.setXxx(2,...);//其他需要配置的参数
ResultSet set = statement.executeQuery();
...
注意:SQL语句中的通配符个数和preparedstatement设置的参数个数保持相同,也就是select中有几个?号,preparedstatement就调用几个setXxx()方法按顺序相对应。
总结:自学的过程中难免会踩到很多坑,建议新开始使用任何一种工具之前先快速的读一下它的使用文档,磨刀不误砍柴工。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值