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需要进一步验证原理