由于代码生成系统需要支持多种数据库,因此在类的设计上需要仔细得思考下,把相同的部分抽取出来,不同的部分通过接口或抽象类来扩展.
先来看下不同的地方
- 获取数据库中所有的表
- 获取表中的字段信息
再来看相同的地方:
- 返回表名集合
- 返回SQL上下文集合(SQL上下文中已经封装好了表名,字段等信息)
针对于相同点和不同点,我分别用了两个抽象来来实现
如果所示,getShowTablesSQL()返回的是查询所有表名的SQL,getTableDetailSQL()返回具体表信息的SQL,buildColumnDefinition()是构建字段信息.这三个方法需要子类去实现.
getTableList()是抽象类中已经实现好的方法,用来返回表名集合
同样buildSQLContextList()也是抽象类中实现好的方法,用来构建SQL上下文,SQL上下文中已经封装好了表名,字段等信息
我们需要用到的也只有这两个方法而已
以后要添加其它数据库类型,只需要继承者两个类即可
下面贴上用户操作序列图
最后贴上系统生成代码的序列图
- 用户请求到Controller类
- Controller类调用Service中的generate()方法
- Service通过工厂类构建出对应的数据库类型SQLService,这个SQLService决定了使用哪种数据库
- 接着SQLService获取TableSelector
- TableSelector通过表名构建SQLContext上下文
- 遍历SQLContext上下文,通过velocity模板生成代码内容