1、實體bean:學生表xgStudent,班級表xgClass.學生表xgStudent中有字段bjid存放xgClass的主鍵。
實體Bean如下:
xgStudent【xsid爲主鍵】:
package bean; public class xgStudent { public int xsid; public xgClass bjid; public String xsxm; public xgStudent(int xsid,xgClass bjid,String xsmx){ this.xsid = xsid; this.bjid = bjid; this.xsxm = xsxm; } public int getXsid() { return xsid; } public void setXsid(int xsid) { this.xsid = xsid; } public xgClass getBjid() { return bjid; } public void setBjid(xgClass bjid) { this.bjid = bjid; } public String getXsxm() { return xsxm; } public void setXsxm(String xsxm) { this.xsxm = xsxm; } }
xgClass【bjid爲主鍵】:
package bean; public class xgClass { public int bjid; public String bjmc; public xgClass(int bjid,String bjmc) { this.bjid = bjid; this.bjmc = bjmc; } public int getBjid() { return bjid; } public void setBjid(int bjid) { this.bjid = bjid; } public String getBjmc() { return bjmc; } public void setBjmc(String bjmc) { this.bjmc = bjmc; } }
2、ibatis的xml配置文件:xg_Student.xml中配置xgStudent別名時對於bjid字段調用了xg_Class.xml中的selectInfoById進行查詢,代碼如下:
【後續補充】
xg_Student.xml:
xg_Class.xml:
3、在對學生表xgStudent進行操作時,對於班級信息xgClass可以不進行選擇,主要的設計邏輯爲:
頁面提交學生數據-》action獲取頁面數據-》service-》ibatis的insert語句
數據更新到數據庫中對於bjid字段的值爲0.這裏是因爲xgClass中的主鍵爲int類型,不選擇時默認爲0.
基於新增的邏輯,出問題的地方就在於修改前的查詢,修改前的查詢action中獲取到的xgStudent.bjid實際上是空對象,判斷方法如下:
if(String.valueOf(xgStudent.getBjid())!=null)
這行代碼也是整個問題的核心,一直以來使用String.ValueOf()一直自認爲返回對象默認爲“null”字符串,但是通過這個使用環境發現,返回的是null對象。所以這裏的判定是比較特殊的
做了下功課,發現String.valueOf被重載了多次。其中一個比較特殊的方法是:
①:
public static String valueOf(char data[]) { return new String(data); }
再看String對象的構造函數:
public String(char value[]) {
this.offset = 0;
this.count = value.length; //※
this.value = StringValue.from(value);
}
②:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
在調試代碼中watch修改前action中xgStudent.getBjid()並不爲null對象或“null”字符串。而是一個xgClass對象,對象中的bjid字段爲0.這裏判定調用的是②的ValueOf
()方法。需要驗證下xgClass對象中是否重載了toString()【後續補充】
4、步驟3中更多是對目前解決方案的猜測,需要後續驗證。目前項目還可以採取另一種方式:
在插入xgStudent數據中,action在獲取到頁面內容後,判定是否選擇,未選,則將xgClass置爲null,代碼如下:
xgStudent.setBjid(xgStudent.getBjid()!=0?xgStudent.getBjid()?null);
然後再將xgStudent插入到數據庫中,此時從數據庫中看到該條記錄的bjid則爲空對象;【步驟3中操作後,數據庫顯示值爲0】
這種方式的操作,在修改前的查詢到xgStudent對象中的bjid則爲空
判定則更改爲:
if(!String.valueOf(xgStudent.getBjid()).equals("null"))
步驟3、步驟4實現效果是一樣的,步驟3需要進一步驗證原理