元组表模式:
序列化实体模式的缺点是:二进制代码难以理解,当格式发生变化时很难该变。若就用一行元组来表示完整的数据(对象)(即普通的数据库表示方式),当我们对数据格式的要求有变化时,比如添加一个属性列,我们就不能用原来的表了,必须重建表。
元组表模式把一个数据对象拆分成多个表,每个表有key,fieldname,属性1的值,属性2的值。。。,一个表中,只有一个属性的值非NULL,其它都为NULL。通过具有相同key的表的组合,我们就能得到完整的数据了。
实现:MemberDTO,实现标准的get set方法,这些方法名隐含了属性的名称,这些信息在使用反射时用到。首先,saveMember(MemberDTO member),用反射机制,得到member所有的方法。现在我们要做的是,得到所有member的信息,并更新到数据库中(添加记录)。得到member信息当然是用member的get方法啦。所以我们遍历member中所有以get开头的方法,然后调用这个方法(反射机制,invoke)。得到了这个值,就要把它更新到数据库中,但之前我们必须知道这个值的类型,才能确定是调用setString还是setLong之类,这个类型由反射机制从get方法返回类型中得到。用这样一套复杂的反射机制的初衷,是使我们不能关注MemberDTO内部的具体实现,我们可以改变MemberDTO的实现,增加get set或减少,但我们不必改变saveMember 和findMember.
但这边作者写的代码却未能实现这一点,所以我以为他的这段代码是有问题的。试想一下,我们为DTO增加get set 方法,我们必然要对saveMember作大的改动。
最好的方法就是在fieldname和元组下标之间有个映射,而不管是否增删了字段(删除字段时,我们可仍然保留读字段的位置)