String sql = "select * from forder where uid=?";
PreparedStatement pStatement = conn.prepareStatement(sql);
pStatement.setInt(1,users.getUid());
// 这样写不行
                        //结果为  select * from forder where uid=?
rSet = pStatement.executeQuery();
System.out.println(sql);
while (rSet.next()) {
Forder forder = new Forder();
forder.setFid(rSet.getLong("fid"));
forder.setFtotal(rSet.getDouble("ftotal"));
forder.setFre(rSet.getString("fre"));
forder.setFdate(rSet.getString("fdate"));
fUsers.setUname(rSet.getString("uname"));
fUsers.setUphone(rSet.getString("uphone"));
fUsers.setUemail(rSet.getString("uemail"));
fUsers.setUpost(rSet.getInt("upost"));
fUsers.setUaddress(rSet.getString("uaddress"));
fUsers.setUid(rSet.getInt("uid"));
forder.setSid(rSet.getInt("sid"));
forder.setUsers(fUsers);
forders.add(forder);

解决方案 »

  1.   

     System.out.println(sql);
    sql 就是你定义的 String sql = "select * from forder where uid=?";
    ps不会通过setint就把你的这个sql中的?给替换掉,它是内部执行替换的,你也不用关心,空间替换的是什么值。
    这叫做sql预编译,通过设置参数值,再进行访问的技术。而不像普通的statement直接把参数值写到?里面去。
      

  2.   

    预编译 不等于 字符串替换...
    很汗啊...
    预编译是首先将带动态参数的SQL发给服务器进行缓存
    然后再发送具体参数,由数据库负责提取缓存命令并执行命令有SQLSERVER的可以打开跟踪功能,你会看到实际提交的不是一般的SQL,是一个特殊的由服务器执行的存储过程
      

  3.   

    这样写肯定是?,你又不是直接把sql拼接好转入的
      

  4.   

    users.getUid 方法返回的是int?Java报错是什么啊?然后就是,你确定"select * from forder where uid=?" 里那个问号是ASCII(英文)的,而不是Unicode??