java-JDBC中?占位符的使用问题,?占位符不可用来设置字段名,表明等。

Class.forName(“com.mysql.jdbc.Driver”);
con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/selldb”,“root”,“root”);
String sql = “select sum(?) a,sum(?) b from sell”;
ops = con.prepareStatement(sql);
ops.setString(1,“sellnumbers”);
ops.setString(2,“sellmoney”);

rs = ops.executeQuery();
System.out.println(rs);
rs.next();
int a = rs.getInt(“a”);
int b = rs.getInt(“b”);
System.out.println(a + “:” + b);
在如上代码中,结果集中查询出的数据总是0,一直没找出原因所在。
查询后才知道 PreparedStatement会为占位符?的两边自动加上单引号,这样会使得SQL语句不可执行,比如使用将表名设置为占位符,数据库执行sql语句时,表名会用单引号引起来,这样会使得sql语句执行出错或者查询不出数据。

用上面代码来说,如果将字段名sellnumbers,sellmoney使用占位符?代替,对于以上加粗代码来说,PreparedStatement会为占位符?的值(也就是sellnumbers和sellmoney)的两边自动加上单引号,sql语句中执行的代码将是这个样子:SELECT SUM(‘sellnumbers’) a,SUM(‘sellmoney’) b FROM sell;这句代码在sql中执行不会报错,但是查询的结果全部都是0.

**所以PreparedStatement只能用来为可以加引号’的参数(如参数值)设置动态参数,即用?占位,不可用于表名、字段名等,不然怎么生成预编译的语句对象呢~ 所以sql中你必须知道你先要查询或操作那些字段。

猜你喜欢

转载自blog.csdn.net/qq_38339561/article/details/85104156