这是我目前的java程序。我需要制作一个准备好的语句并连接到MySql数据库。
try {
Connection connect = DriverManager.getConnection(host, username, password);
System.out.println("works fine connected");
/*
*
* */
String Dquery = ("SELECT * FROM ?");
//create the java statement
PreparedStatement st = connect.prepareStatement(Dquery);
st.setString(1, "lmgs_Book");
System.out.println("mySql statemnt: "+Dquery);
//execute the query, and get a java resultset
ResultSet rs = st.executeQuery();
//iterate through the java resultset
while (rs.next())
{
String id = rs.getString(Column1);
String firstName = rs.getString(Column2);/*
String lastName = rs.getString(Column3);
String dateCreated = rs.getString(Column4);
int isAdmin = rs.getInt (Column5);*/
//print the results
System.out.println(id+"|\t"+firstName/*+"|\t\t"+lastName+"|\t\t"+dateCreated+"|\t"+isAdmin*/);
}
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我无法将“lmgs_Book”字符串插入预处理语句中。
答案 0 :(得分:2)
Prepared语句用于列值而非表名。
但您可以使用占位符代替表名,然后替换 用你的表名。
String Dquery = ("SELECT * FROM $tableName");
Dquery = Dquery.replace("$tableName","lmgs_Book");
PreparedStatement st = connect.prepareStatement(Dquery);
Remove this:
st.setString(1, "lmgs_Book");
<强>注意:强>
与
相比有什么优势 String Dquery = "SELECT * FROM lmgs_Book";
? 的 [推荐] 强>
答案:完全没有优势。如果您在上面的表名中使用占位符,则可能会遇到潜在的危害。
(特别是因为你不应该在替换调用中使用变量 而不是文字,因为这可能使声明易受攻击 到SQL注入)
答案 1 :(得分:0)
试试这个,请确保queryString
column Name
必须是database
中的varchar。
String Dquery = ("SELECT * FROM tablename where column_name =?");
//create the java statement
PreparedStatement st = connect.prepareStatement(Dquery);
st.setString(1, "lmgs_Book"); //this line will be set Imgs Books as search Parameter.