在使用DButils时发现SQL语句如:select * from admin where username=? 中
where子句中带?参数时就会查不到数据,而把?直接改成值时如select * from admin where username='test' 就可以。
如果参数不是在where子句中的则可以正常,包括查询和更新插入操作都是这个问题。
代码如下:DataSource ds=null;
            Context initContext;
    try {
    initContext = new InitialContext();
    ds = (DataSource) initContext.lookup("java:/comp/env/jdbc/oracleds");
    } catch (NamingException e) {
    e.printStackTrace();
    }
            String param[] = {"test"}; 
            QueryRunner qr = new QueryRunner(ds);
    Map result = null;
    try {
    result = qr.query("select * from admin where username=?", param,new MapListHandler());
    } catch (SQLException e) {
    e.printStackTrace();
    }
if(map.size()==0)
   //.....

解决方案 »

  1.   

    哦,那就是拼字符串出问题了;String sql="select * from admin where username="+"'"+?+"'";
      

  2.   

    ?没明白你的意思 出问题的只在where条件中的。
      

  3.   

    把查询语句在执行之前输出一下,看下你的语句是不是在直接执行
    select * from admin where username=?, 
    很可能直接语句执行的就是?不是替换后的值
    也可能是替换后的值是test非‘test’
    毕竟在SQL语句中字符串必须带''比较
      

  4.   

    使用占位符,不想拼SQL就
    使用PreparedStatement.setString(1,"test");
      

  5.   

    param没有正常的替换掉?吧~,。debug过去看看~。
      

  6.   

    但是如果是不带where条件的参数都能正常执行 如:update admin set usename=? 这条语句就能正确执行 说明参数是传进去了的啊
      

  7.   


    唉,还没看明白啊,你把问好换成任意一个值  ‘test’ 试试,如果可以查出一条,就证明你问号用的有错误
      

  8.   

    把问号替换成'test'是可以查出数据 但就是不明白为什么where条件中的问号替换有问题 而像我上面举例的update语句中的问号替换就正常呢
      

  9.   

    那要看你底层封装的statement是普通的Statement还是PreparedStatement
    只有PreparedStatement才支持预处理语句,也就是?的替换
    而且设置替换的时候数据类型也要设置正确
    即pstat.setString(1,"test");
    而普通的Statement对象就必须是拼接了,不能替换的。
      

  10.   

    这个封装不是我自己封装 是用的DBUtils Apache网上下的 我只是使用他封装好的函数传参数进去而已  所以也找不出为什么会出现这个问题,这个是从官网下的感觉他自己的又不会有错误的样子。所以想在这问问有用过这组件的人有没有出现这问题。
      

  11.   

    汗,那这个应该算BUG
    一般这种底层我不习惯用别人封装的东西,除非用hibernate一类的框架,
    不然都是自己写底层SQL执行
    你这个问题看来不会有结果了。
      

  12.   

    String sql="select * from admin where username?;这样就行啦
      

  13.   

    我也经常用dbutils这个组件请楼主注意 插入 更新等操作的时候 可以问号来替换要插入和更新的字段。但是条件是不能用问号的楼主做的是查询操作 select * from admin where username=? 这里不应该用 问号 这却的写法是 String sql= “select * from admin where username= '” + username + "'" ;
      

  14.   

    java程序与数据库连接那点是整 个项目的瓶颈,楼主得小心呀!
      

  15.   

    我是刚学的 也不大了解  没想到Apache网上尽然会有这样的存在如此问题的组件,太让我失望了。
      

  16.   

    param没有正常的替换掉?吧~,。debug过去看看~。