从最初做JAVA开发到现在致力于.NET平台,经手的大大小小的项目也不在少数。刚开始每写成一个程序还能获得不少的成就感,但随着开发年限的增加、项目代码行的增加,写代码更多时候变成一种糊口的工具而非兴趣时,越来越被大量相似的SQL搅得头晕脑胀,尤其维护旧程序时,对SQL的调试更是让人头大。于是,一直致力于找出一个方法,可以不用每次都去编写那些烦人的SQL。
答案是肯定的,JAVA平台下有个Hibernate的ORM框架,它应该是最早的一个成熟的ORM软件,貌似可以解决我的问题。迫不及待的下载、使用MyEclipse去写测试程序,却发现并不如想象中的好,对我来说,最大的障碍在于那个XML配置文件。借助于IDE,配置工作或许还不是太繁琐,但脱离IDE之后,我发现对这个配置文件维护的困难绝对不在直接维护SQL命令之下。当然,好处还是有的,比如不用去调试每一条SQL。
虽然不太情愿,但毕竟脱离IDE的情况还是很少,所以也就“爱用不用”地用了一段时间。
之后,机缘巧合的转向.NET平台,从.NET Framework 1.1和VS2003开始,到现在的.NET Framework 2.0和VS2005,随着在.NET平台开发经验的日渐丰富,对C#特性越来越全面的了解,终于决定要自己写一个更加符合C#口味的ORM框架,完全的面向对象,更加简洁,更加高效,对IDE的智能感知支持更好(早期绑定) 。
一起来看看它的工作方式。
假设有一个员工表,字段为 id,employee_id,name,department_id
有一个实体类EmployeeInfo与上表各字段对应
现在我们需要为这个表写一个访问类,提供对数据库的增、删、改、查工作。
下面是实现以上功能的所有代码:
public class EmployeeTable : TableAccess<EmployeeInfo> {
internal override ColumnParameter[] FillColumnParameters(EmployeeInfo entity) {
return base.BuildColumnParameter(
entity.ID,
entity.EmployeeID,
entity.Name,
entity.DepartmentID
);
}
public override string TableName {
get { return "employee_table"; }
}
public override TableColumnCollection TableColumns {
get {
TableColumnCollection list = new TableColumnCollection(4);
list.AddRange(new TableColumn[] {
new TableColumn("id", true), // 自增只读字段
new TableColumn("employee_id"),
new TableColumn("name"),
new TableColumn("department_id")
});
return list;
}
}
internal override EmployeeInfo BuildEntity(MySqlDataReader reader, int startIndex) {
EmployeeInfo info = new EmployeeInfo();
info.ID = reader.GetInt32(0);
info.EmployeeID = reader.GetString(1);
info.Name = reader.GetString(2);
info.DepartmentID = DataReadyUtility.GetInt32(reader,3);
return info;
}
}