今天碰到一个问题,那就是数据库的空值处理问题;其实这个问题也是老生常谈了,如果是在命令行里面打命令的话估计不会有什么问题;关键是现在的开发中到少不了用orm进行持久层的处理的了,具体原因在这里不在赘述;现在的开发中,我用的是ibatis;今天的问题是这样的把 一个对象的各个属性保存到为一条记录的字段,这问题才普通不过了;问题是如果属性是空的话怎么办了,想过把一个默认值赋予对象的属性,但感觉这样的思路非常的别扭,一个方面是由于加大了不必要的工作量,二是数据库那端也比较难管理;为了健忘,整理如下:
<insert id="saveMpsOperatorAuthority">
insert into mps_OperatorAuthority (infoId,companyId,localId,operatorId)
values (mps_OperatorAuthority_seq.nextVal,#companyId:NUMERIC#,#localId:VARCHAR# ,#operatorId#)
</insert>
以上的配置的意思就是如果插入对象的companyId属性为null,则把numberic类型的默认值插入数据库,localid属性做同样的处理;需要留意的是 一定要写成NUMERIC 不能写成NUMBER(如果是日期类型,精确到秒的则用TIMESTAMP) ,否则插入时候就会有异常,今天为这个问题搞了好几个小时 ;
同样的道理,如果要把数据库中的记录影射成对象的各个属性也面临着同样的问题,那 就是如果数据库中该字段为空则对象属性作何处理,具体如下:
<resultMap id="result"
class="com.pre.mps.model.Account">
<result property="infoId" column="infoId" columnIndex="1" />
<result property="companyId" column="companyId" columnIndex="2" jdbcType="NUMERIC" />
<result property="localId" column="localId" columnIndex="3" jdbcType="VARCHAR"/>
<result property="operatorId" column="operatorId" columnIndex="4" jdbcType="VARCHAR" />
</resultMap>
这里的jdbcType="NUMERIC"中的NUMERIC和NUMBER可以互换,也就是两者中写哪一个都可以,为了这个问题弄了半天真是郁闷,不过到头来还是很High