这个问题我之前解决过几次,都是这样解决的:
1.) 选择(继承自 Vector,它使用标准类存储所有行,具体取决于您使用的语言)结构:
ID(以及有助于识别您的选择的 ID)
(作为 Vector 类的子类的 Select 的所有元素都是行)
行号:整数
列号:整数
usedFilter: 字符串
usedGroupBy: 字符串
usedHavingCaluse: 字符串
usedOrderBy: 字符串
表名:字符串
getID()
getRowNumber(): int
getColumnNumber(): int
getUsedFilter(): 字符串
getUsedGroupBy(): 字符串
getUsedHavingClause(): 字符串
getUsedOrderBy(): 字符串
getTableName(): 字符串
Select(tableName: String, filter:String, groupBy: String, havingCaluse: String, orderBy: String, columns: Vector)
2.) 我有一个与数据库直接通信的类,我们称之为 DataAccessLayer。让我们看看这个类的结构:
数据访问层
connect(...): 布尔值
断开连接(...):布尔值
使用(数据库名称:字符串):布尔值
selectedData: Vector(其实这是一组Select的)
createSelect(tableName: String, filter: String, groupBy: String, havingCaluse: String, orderBy: String, columns: Vector): boolean(判断是否成功)
deleteSelect(ID): 布尔值
插入(表名:字符串,列:向量,值:向量):布尔值
更新(tableName:字符串,columnsToSet:向量,值:向量,过滤器:
字符串):布尔值
delete(tableName: String, filter: String): int(删除了多少行,如果是-1
发生异常,或者只是简单地将异常抛出到更高的级别)
//创建/删除表/视图/数据库/约束也可以实现,我只是//懒惰这样做,因为我相信你已经理解了这个想法
DataAccessLayer()
前两步完成后,你可以用两个类来处理任何数据库查询(其实Select的功能也可以放到DataAccessLayer中,做一个类,但是这样更优雅),但是,您可能想为几张桌子处理一些额外的事情。解决方案很简单,每当你发现一个表难以与这些一起使用时,你只需要从 DataAccessLayer 继承并重新定义你想要重新定义的内容,因此在 DataAccessLayer 中你应该只使用 protected 和 public 修饰符而忘记 private 修饰符。因此,关系将是:
选择 1 n DataAccessLayer
ClassInheritedFromDataAccessLayer 扩展 DataAccessLayer
前端使用 ClassInheritedFromDataAccessLayer1, ..., ClassInheritedFromDataAccessLayern, DataAccessLayer。
这样您的项目将是:
- 可管理
- 订购
- 易于计划
- 易于实施
- 易于修改
- 容易被其他人理解
希望对你有帮助,
问候。