關於數據庫的null小問題

前幾天,用wicket做了一個註冊界面,但是有以下要求:

1、用戶名不能爲空,且不能重複(從數據庫讀取,判定是否重複)。

2、密碼必須包含數字和字母的組合,且長度在8~20之間;

3、QQ號只能爲大於5位小於10位的數字;

4、安全問題是下拉列表選擇框,安全問題答案不少於5個字符,當不滿足上述要求時進行必要的提示;

今天在這裏主要是想記下當時對數據操作那塊出的問題:

用的數據庫是MySQL,具體怎麼連接,上一篇貼子講了的,網上資料也多,不祥述了。主要是在查詢數據庫裏的賬戶名那時,下面是提交註冊資料按鈕時進行的操作: 

  protected void onSubmit(AjaxRequestTarget target, Form<?> form)
   { // repaint the feedback panel so that it is hidden
    target.addComponent(feedback);
    System.out.println("onSubmit() has excuted!");
    。。。  。。。

    。。。 。。。    
    String seleAccount="select account from userinfo  where account="+"'"+acc+"'";

    //用戶名是否重複驗證
    UserDAO userdao=new UserDAO();


    List<User> userlist=new ArrayList<User>(); //用一個列表來裝查詢後的結果集
    
userlist=userdao.select(seleAccount);
    
    if(userlist!=null){
     feedback.error("用戶名已經存在");
    }else{
     //驗證兩次密碼要一致
     if(!pas.equals(repas)){
      //用equals()方法來判斷兩個對象有內容是否相同,切記不可用"=="
      feedback.error("兩次密碼不一致,請重新輸入!");
     }
     else{
      try{ //執行插入操作
       userdao.insert(acc, na, pas, repas, q, favor);
       feedback.error("提交成功");
      }
      catch (SQLException e){
      // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    }
   }

 

前面藍色部分的查詢操作,在下面代碼中:

public List<User> select(String sql)
    {
    。。。  。。。

     List<User> list = new ArrayList<User>();
     try{
         ReSt = dbAccess.Query(sql);
         while(ReSt.next())

         {
                user.setAccount((String)ReSt.getString("account"));
                list.add(user);
                System.out.println("This account is:"+ReSt.getString(1));
         }
         return list;
     }catch(SQLException e) {
      e.printStackTrace();
      return null;
     }finally{
      dbAccess.close();
      
      if
(!list.isEmpty()){
       System.out.println("查詢結果非空");
       return  list;
      }else{
       return null;
      }
     }
    }

本來我是寫的list!=null,結果就有問題,按理說,如果在數據庫中沒查詢到與輸入同名的帳戶名,返回來的肯定是空的,也就是list肯定是個空表,但是list不等於null也對呀。null不是沒有,空的意思的嗎?怎麼用list.isEmpty()——即自帶的判斷爲空的語句就對了呢?後來查了一下這個null與空的區別。

 

參考下面貼子http://jonsion.iteye.com/blog/560719,有所收穫。

“java中null的概念:java中,null表示類或變量是空,不代表任何對象或實例,可以將null賦給引用類型變量,但不可以將null賦給基本類型變量。數據庫中NULL的概念:數據庫中,null表示未填寫、未知、不可用的概念,和java不同的是數據庫中可以將null賦給任何數據類型。這樣一來,我們從數據庫中讀取字段的值後,在java程序中如何判斷讀取的值是否爲null呢?用x==null方法嗎?顯然不行,除非這個X是String類型的。ResultSet中的wasNull()方法可以解決這個問題:

wasNull():報告最後一個讀取的列是否具有值 SQL NULL。注意,必須首先對列調用一個獲取方法嘗試讀取其值,然後調用 wasNull 方法查看讀取的值是否爲SQL NULL。

如:String value="";
       int n;
       while(rs.next()){
        value=rs.getString("name");
        if(rs.wasNull()){
         System.out.println("null");
        }else{
         System.out.println(value);
        }
       
        n=rs.getInt("number");
        if(rs.wasNull()){
         System.out.println("null");
        }else{
         System.out.println(n);
        }
       }  ......”

 

另外,數據庫中表設置了主鍵,那麼要謹慎對主鍵的操作,特別是考查其爲空還是非空的時候一定要注意,因爲你一旦設定某個字段爲主鍵,那麼它就不可能再爲空了,判斷它的空與非空沒有意義,且還隱含犯錯機會。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章