使用Mybatis继承特性应对数据库变化
数据库表结构变化,可以说是在开发过程中一个令人头痛的问题。问题头痛到很多程序员为了不变更表结构,宁愿在代码中写一堆“妥协”的代码也不愿去动表结构,结果造成问题越积越多,等到问题积累到表结构不得不改的时候,发现表结构的问题已经传播到很多其他的系统的模块了,已经不是通过修改一个模块就能简单解决的问题了,所以我的理解是表结构必要做的改动要早作,不要怕麻烦,因为现在一时避免的问题,会在未来引起指数倍增长的问题。
表结构一旦变化,那势必代码要进行大量的修改,这是不可避免的,我们能做的只能是让代码更加灵活来应对数据库的变化。这块Mybatis的继承特性可以一用。
经常使用mybatis-generator来生成对应数据库的model,dao和mapping,然后在上面的基础上修改,这样一旦数据库结构发生变化,想再用generator来重新生成代码会改动比较多,比较麻烦。这个问题可以使用mybatis的继承特性来解决。方案如下。
首先使用generator生成基类的model,dao,mapping: AttachSendTask AttachSendTaskMapper
Mybatis继承使用方式
model: public class AttachSendTaskExtend extends AttachSendTask
dao: public interface AttachSendTaskExtendMapper extends AttachSendTaskMapper
public List<AttachSendTaskExtend> doSelect(); // 使用子类作为查询结果对象
mapping: <mapper namespace="com.aaa.bbb.ccc.ddd.AttachSendTaskExtendMapper">
<resultMap id="BaseResultMap" type="com.aaa.bbb.ccc.ddd..AttachSendTaskExtend" extends="com.aaa.bbb.ccc.ddd.AttachSendTaskMapper.BaseResultMap">
// extends="${namespace}.${resultMap}"
这样表结构发生改变,重新使用generator生成基类的一套代码就行,自定义的虚拟属性和扩展属性,放在子类中,改变基类就应对了数据库表结构的变化。