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需要进一步验证原理
转载于:https://blog.51cto.com/bcptdtptp/1591890