jlcfighting 2020-04-16 17:12 采纳率: 100%
浏览 1977
已采纳

JAVA,JDBC中使用PrepareStatement进行查询,如何去除setString时自动添加的引号?

问题描述

在学习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());

  • 写回答

2条回答 默认 最新

  • VICTOR_fusheng 2020-04-17 00:09
    关注

    建议就不要用?了,直接拼字符串。一般?用在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")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 毕小宝 博客专家认证 2020-04-17 07:12
    关注

    PreparedStatment 的这种参数设置机制是基于占位符的,必须用字符串引用,才能防止 SQL 注入攻击的。
    按楼主的需求,不能用这种方式,占位符只是针对 where 后面的参数的。这里连 SQL 语句都需要动态的话,只能用拼接 select columns 的方式了。

    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 spyder运行重复
  • ¥15 我考考你,这代码是对的还是错的?
  • ¥15 我用C语言easyx图形库绘制了一个3d游戏方框透视,但进入游戏时候鼠标准星对准方框边缘 鼠标光标就会弹出来这是啥情况怎样让光标对准绘制的方框点击鼠标不弹出光标好烦这样
  • ¥20 用Power Query整合的问题
  • ¥20 基于python进行多背包问题的多值编码
  • ¥15 相同型号电脑与配置,发现主板有一台貌似缺少了好多元器件似的,会影响稳定性和使用寿命吗?
  • ¥15 C语言:数据子序列基础版
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题