ibatis關聯對象

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對象的構造函數:

  1. public String(char value[]) {  

  2.     this.offset = 0;  

  3.     this.count = value.length;  //※  

  4.     this.value = StringValue.from(value);  

  5.     }  


②:

  1. public static String valueOf(Object obj) {  

  2.     return (obj == null) ? "null" : obj.toString();  

  3.     } 

在調試代碼中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需要進一步驗證原理









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