在学习JDBC中PrepareStatement,想实现一个需求:
输入列名称,返回查询得到的列。
其实就是想构造SQL语句:
select id from websites;
但是使用setNString(1,"id");得到的是
select ‘id’ from websites;
希望有大佬能告知如何主动去掉默认的单引号,或者有其他方式来实现这个需求,比如同时想查多个列的时候
出现问题的语句段:
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//1、连接数据库
conn = JDBCUtils.getConnection();//自己写的登录类
//2、执行语句
String sql = "SELECT "+"?"+" FROM websites";
//"SELECT id, name, url FROM websites"
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"id");
pstmt.setNString(1,"id");
rs = pstmt.executeQuery();
//输出SQL语句
System.out.println(pstmt.toString());
建议就不要用?了,直接拼字符串。一般?用在where条件的,而且直接“selecct * from websites where id=?”,不用拼接的。
如果多个筛选值建议先StringBuilder,在循环加入。要注意空格
StringBuilder sb = new StringBuilder("select ");
for(String column: columns){
sb.append(column).append(",")
}
sb.deleteCharAt(sb.length()-1);
sb.append(" FROM websites")
PreparedStatment 的这种参数设置机制是基于占位符的,必须用字符串引用,才能防止 SQL 注入攻击的。
按楼主的需求,不能用这种方式,占位符只是针对 where 后面的参数的。这里连 SQL 语句都需要动态的话,只能用拼接 select columns 的方式了。