话说起来可能比较长,但是逻辑很简单,我尽量把它说清楚:我编写了一个 DAO 包用来封装数据库操作,其中有一个方法:DAO.update(Object obj, String tableName),这个方法的第一个参数 obj 表示要保存的对象,第二个参数 tableName 表示要将该对象保存到的表的名字。这个方法是通过根据表的字段和对象的属性之间的映射关系生成 insert 语句然后执行来实现的。这个实现在逻辑上有点问题,就是当属性的值为 null 的时候该怎么处理。为了方便,我决定在这种情况下忽略相应的字段,即如果 obj 的某个属性值为 null,则生成的 insert 语句中没有该字段的赋值。现在出现了另外的问题,如果我想主动将某条记录的指定字段改为 null,目前的实现是做不到的。我要如何实现这个方法?有人说你可以指定一个特殊的值,比如字符串 "NULL",当遇到这个值的时候就生成 “=null”。但问题是如果这个属性是 Date 类型的呢?如果是其他类型的呢?所以我一直想不出什么好的实现方案。在这里希望大家出出主意,谢谢!

解决方案 »

  1.   

    写错了写错了,是 update 语句,不是  insert。手误,手误!
      

  2.   

    我觉得你应该可以参考一下hibernate的思想。
    你可以多传进来一个参数,例如,第一个参数为检索得到的对象,第二个为用来更新表的对象,第三个为对应表名。
    比较第一个与第二个对象对应属性字段的值,不等则更新。
    也可以不修改接口 ,在方法中间加临时变量,得到检索后的对象。
      

  3.   

    难道真的没一点商量的余地吗?有没有一个既能让 DAO 选择字段更新,也能让它识别哪些字段要赋 null 的这样一个方案?
      

  4.   

    难道真的没一点商量的余地吗?有没有一个既能让 DAO 选择字段更新,也能让它识别哪些字段要赋 null 的这样一个方案?
    ====
    有啊,用动态代理对象,如果那个字段被赋值了(包括null),你就记录下来,SQL语句中就包括它。
    不过麻烦死你,呵呵
      

  5.   

    你可以写一个自动生成SQL语句的方法,专门用来判断这个字段是否为空,然后加上表,生成一个SQL语句.不过我建议你可以用HIBERNATE框架构架你的项目,那样的话你说你的问题就不是问题!它是直接对对象进行操作的!
      

  6.   

    经过考虑,我打算按照 hbwhwang(catmiw的ID已经停用,现在用这个) 的建议。