我有以下简单的代码连接到并使用预准备语句查询数据库(它仅用于学习目的)。
import java.sql.*;
public class Prepared {
public static void main(String[] args) throws SQLException,Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/customerdb","myuser","luca01123581321");
String query="SELECT id,? FROM person WHERE id>=?";
PreparedStatement prep=conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
prep.setString(1,"name");
prep.setInt(2,2);
prep.executeQuery();
ResultSet res=prep.getResultSet();
ResultSetMetaData rsmd=res.getMetaData();
System.out.println("number of columns: "+rsmd.getColumnCount());
while (res.next()) {
int id=res.getInt(1);
String name=res.getString(2);
System.out.println(name);
}
}
}
当我执行查询并尝试打印结果时,我得到:
number of columns:2
name
name
name
name
换句话说,我想检索SQL类型为VARCHAR的第二列(即“name”)中的值。但是没有得到值,我得到所有记录的“名称”......那是怎么回事?
答案 0 :(得分:4)
您无法参数化结果列的名称。假设您的身份证是2,那么您实际上是在执行此声明:
SELECT id,'name' FROM person WHERE id>=2
这样可行:
String column = "name";
...
String query="SELECT id," + column+ " FROM person WHERE id>=?";
...
prep.setInt(1,2); // only one parameter