近几日试用了NHibernate和ibatisnet这两个比较流行,功能也算不错的orm framework,感觉有收获也有遗憾。

说收获是因为这两者确实对orm支持得很不错,结构框架的定义模式也很值得学习,从效果和使用的难易程度来讲应该说各有特点,个人更喜欢ibatisnet一点。

说遗憾是不管是哪一个,感觉都摆脱不了使用反射的固有性能损失,同时,对于需要动态构造sql的复杂查询等等的支持,感觉也都不是很完美。

想到反射,总是忍不住去想代码生成,因为,虽然这两者的出发点都是为了减少编程人员的工作量,但某种程度是对立的,前者可能减少了总代码量和生成的程序集的大小,换来了清晰的结构,后者,则可以获得更好的性能,同时,个人感觉似乎扩展性更强。

所以,看完这两个orm构架,一度的code review时的兴奋过后,还是,直观上,更倾向于用代码生成,而不是orm来较少我们的工作量。

下面想再举例说明一下以上倾向性的来源(用于比较的代码分别采用ibatisnet所带的NPetShop的数据库表及其代码,和我自己的一个代码生成工具以同样的数据表为基础生成的代码):

1、首先来看看两者需要的DomainObject,我个人更愿意称呼ValueObject,这样的对象,在orm来讲,肯定是与数据库表Accounts相对应,代码生成的话也是类似的

NPetShop的Account.cs
再谈orm和代码生成
再谈orm和代码生成
using System;
再谈orm和代码生成
再谈orm和代码生成
namespace NPetshop.Domain.Accounts
{

再谈orm和代码生成    
/// Business entity used to model user account
再谈orm和代码生成    
/// </summary>
再谈orm和代码生成    [Serializable]
再谈orm和代码生成    
public class Account 
{
再谈orm和代码生成

再谈orm和代码生成        
private string _login = string.Empty;
再谈orm和代码生成        
private string _password = string.Empty;
再谈orm和代码生成        
private string _email = string.Empty;
再谈orm和代码生成        
private string _status = string.Empty;
再谈orm和代码生成        
private Address _address = new Address();
再谈orm和代码生成        
private Profile _profile = new Profile();
再谈orm和代码生成        
#endregion
再谈orm和代码生成

再谈orm和代码生成        
public string Login
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Password 
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Email 
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Status 
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public Address Address
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成
再谈orm和代码生成        
public Profile Profile
{
 

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
#endregion
再谈orm和代码生成
再谈orm和代码生成    }

再谈orm和代码生成}

再谈orm和代码生成

CodeGen生成的AccountInfo.cs
再谈orm和代码生成// Code Generated By Code Generator For CN.Teddy.Helper.Data V2.0
再谈orm和代码生成
// 2005-4-10 15:43:27
再谈orm和代码生成

再谈orm和代码生成
using System;
再谈orm和代码生成
再谈orm和代码生成
namespace NPetshop.ValueObject
{
再谈orm和代码生成    [Serializable]
再谈orm和代码生成    
public class AccountInfo
{
再谈orm和代码生成        
private string _Account_Id;
再谈orm和代码生成        
private string _Account_Email;
再谈orm和代码生成        
private string _Account_FirstName;
再谈orm和代码生成        
private string _Account_LastName;
再谈orm和代码生成        
private string _Account_Status;
再谈orm和代码生成        
private string _Account_Addr1;
再谈orm和代码生成        
private string _Account_Addr2;
再谈orm和代码生成        
private string _Account_City;
再谈orm和代码生成        
private string _Account_State;
再谈orm和代码生成        
private string _Account_Zip;
再谈orm和代码生成        
private string _Account_Country;
再谈orm和代码生成        
private string _Account_Phone;
再谈orm和代码生成
再谈orm和代码生成        
public string Account_Id
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Email
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_FirstName
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_LastName
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Status
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Addr1
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Addr2
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_City
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_State
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Zip
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Country
{


再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public string Account_Phone
{


再谈orm和代码生成        }

再谈orm和代码生成

再谈orm和代码生成
;
再谈orm和代码生成
再谈orm和代码生成        
public static string[] GetMemberNames(params string[] exceptMembers)
{
再谈orm和代码生成            
if (exceptMembers == null)
{
再谈orm和代码生成                
return _Members;
再谈orm和代码生成            }

再谈orm和代码生成            
else
{
再谈orm和代码生成                
string[] retMembers = new string[_Members.Length - exceptMembers.Length];
再谈orm和代码生成                
int i = 0;
再谈orm和代码生成                
foreach (string item in _Members)
{
再谈orm和代码生成                    
bool isExcept = false;
再谈orm和代码生成                    
foreach (string str in exceptMembers)
{
再谈orm和代码生成                        
if (item == str)
{
再谈orm和代码生成                            isExcept 
= true;
再谈orm和代码生成                            
break;
再谈orm和代码生成                        }

再谈orm和代码生成                    }

再谈orm和代码生成
再谈orm和代码生成                    
if (!isExcept)
{
再谈orm和代码生成                        retMembers[i
++= item;
再谈orm和代码生成                    }

再谈orm和代码生成                }

再谈orm和代码生成                
return retMembers;
再谈orm和代码生成            }

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public static object[] GetMemberValues(AccountInfo obj, params string[] exceptMembers)
{
;
再谈orm和代码生成            
if (exceptMembers == null)
{
再谈orm和代码生成                
return values;
再谈orm和代码生成            }

再谈orm和代码生成            
else
{
再谈orm和代码生成                
object[] retValues = new object[_Members.Length - exceptMembers.Length];
再谈orm和代码生成                
int i = 0;
再谈orm和代码生成                
int j = 0;
再谈orm和代码生成                
foreach (string item in _Members)
{
再谈orm和代码生成                    
bool isExcept = false;
再谈orm和代码生成                    
foreach (string str in exceptMembers)
{
再谈orm和代码生成                        
if (item == str)
{
再谈orm和代码生成                            isExcept 
= true;
再谈orm和代码生成                            
break;
再谈orm和代码生成                        }

再谈orm和代码生成                    }

再谈orm和代码生成
再谈orm和代码生成                    
if (!isExcept)
{
再谈orm和代码生成                        retValues[i
++= values[j];
再谈orm和代码生成                    }

再谈orm和代码生成                    j
++;
再谈orm和代码生成                }

再谈orm和代码生成                
return retValues;
再谈orm和代码生成            }

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public static AccountInfo CreateObject(System.Data.DataRow row)
{
再谈orm和代码生成            
if (row == null)
{
再谈orm和代码生成                
return null;
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            AccountInfo newObj 
= new AccountInfo();
再谈orm和代码生成            
object item = null;
再谈orm和代码生成
再谈orm和代码生成            item 
= row["Account_Id"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Id 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Email"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Email 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_FirstName"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_FirstName 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_LastName"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_LastName 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Status"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Status 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Addr1"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Addr1 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Addr2"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Addr2 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_City"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_City 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_State"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_State 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Zip"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Zip 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Country"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Country 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成            item 
= row["Account_Phone"];
再谈orm和代码生成            
if (item != DBNull.Value)
{
再谈orm和代码生成                newObj.Account_Phone 
= (string)item;
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            
return newObj;
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public static System.Collections.IList CreateObjectList(System.Data.DataTable table)
{
再谈orm和代码生成            
if (table == null)
{
再谈orm和代码生成                
return null;
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            System.Collections.ArrayList retList 
= new System.Collections.ArrayList();
再谈orm和代码生成            
foreach (System.Data.DataRow row in table.Rows)
{
再谈orm和代码生成                retList.Add(CreateObject(row));
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            
return retList;
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public static System.Collections.IList CreateObjectList(System.Data.IDataReader rdr)
{
再谈orm和代码生成            
if (rdr == null)
{
再谈orm和代码生成                
return null;
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            System.Collections.ArrayList retList 
= new System.Collections.ArrayList();
再谈orm和代码生成            System.Data.DataTable table 
= new System.Data.DataTable();
再谈orm和代码生成            
for (int i = 0; i < rdr.FieldCount; i++)
{
再谈orm和代码生成                table.Columns.Add(rdr.GetName(i), rdr.GetFieldType(i));
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            
while (rdr.Read())
{
再谈orm和代码生成                
object[] rowObjs = new object[rdr.FieldCount];
再谈orm和代码生成                rdr.GetValues(rowObjs);
再谈orm和代码生成                table.Rows.Clear();
再谈orm和代码生成                table.Rows.Add(rowObjs);
再谈orm和代码生成                retList.Add(CreateObject(table.Rows[
0]));
再谈orm和代码生成            }

再谈orm和代码生成
再谈orm和代码生成            
return retList;
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
#endregion
再谈orm和代码生成    }

再谈orm和代码生成}

再谈orm和代码生成
再谈orm和代码生成

比较两者的DomainObject,当然都可以用工具来生成,CodeGen的代码在基本的属性之外要多一些辅助的静态函数,这些静态函数的作用就是用于避免使用反射而被DbHelper内部调用的,这些对业务逻辑是透明的。 从总的手工编码量来讲,都可以借助工具生成,所以工作量都为0。

2、下面再来看看逻辑层分别怎么调用各自的数据处理层

首先是NPetShop的AccountSqlMapDao.cs(可能是出于演示目的该代码没有加入事务保护,不过它实际是支持)
再谈orm和代码生成
再谈orm和代码生成
using System;
再谈orm和代码生成
using System.Collections;
再谈orm和代码生成
再谈orm和代码生成
using NPetshop.Domain.Accounts;
再谈orm和代码生成
using NPetshop.Persistence.Interfaces.Accounts;
再谈orm和代码生成
using NPetshop.Persistence.MapperDao;
再谈orm和代码生成
再谈orm和代码生成
namespace NPetshop.Persistence.MapperDao.Accounts
{

再谈orm和代码生成    
/// Summary description for AccountSqlMapDao
再谈orm和代码生成    
/// </summary>
再谈orm和代码生成    public class AccountSqlMapDao : BaseSqlMapDao, IAccountDao
{

再谈orm和代码生成
再谈orm和代码生成        
public Account GetAccount(string login)
{
再谈orm和代码生成            
return (ExecuteQueryForObject("GetAccountByUsername", login) as Account);
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public IList GetUsernameList()
{
再谈orm和代码生成            
return ExecuteQueryForList("GetUsernameList"null);
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public Account GetAccount(string login, string password)
{
再谈orm和代码生成            Account account 
= new Account();
再谈orm和代码生成            account.Login 
= login;
再谈orm和代码生成            account.Password 
= password;
再谈orm和代码生成            
return (ExecuteQueryForObject("GetAccountByLoginAndPassword", account) as Account);
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public void InsertAccount(Account account)
{
再谈orm和代码生成            ExecuteInsert(
"InsertAccount", account);
再谈orm和代码生成            ExecuteInsert(
"InsertProfile", account);
再谈orm和代码生成            ExecuteInsert(
"InsertSignon", account);
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public void UpdateAccount(Account account)
{
再谈orm和代码生成            ExecuteUpdate(
"UpdateAccount", account);
再谈orm和代码生成            ExecuteUpdate(
"UpdateProfile", account);
再谈orm和代码生成
再谈orm和代码生成            
if (account.Password.Length > 0
{
再谈orm和代码生成                ExecuteUpdate(
"UpdateSignon", account);
再谈orm和代码生成            }

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
#endregion
再谈orm和代码生成    }

再谈orm和代码生成}

再谈orm和代码生成

接下来是CodeGen的AccountLogic.cs
再谈orm和代码生成// Code Generated By Code Generator For CN.Teddy.Helper.Data V2.0
再谈orm和代码生成
// 2005-4-10 15:58:19
再谈orm和代码生成

再谈orm和代码生成
using System;
再谈orm和代码生成
using System.Collections;
再谈orm和代码生成
using System.Data;
再谈orm和代码生成
using CN.Teddy.Helper.Data;
再谈orm和代码生成
using CN.Teddy.Helper.DataAccess;
再谈orm和代码生成
using CN.Teddy.Helper.Logic;
再谈orm和代码生成
using NPetshop.ValueObject;
再谈orm和代码生成
using NPetshop.DataAccess;
再谈orm和代码生成
再谈orm和代码生成
namespace NPetshop.TransactionLogic
{
再谈orm和代码生成    
public sealed class AccountLogic
{
再谈orm和代码生成        
private AccountLogic()
{
再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
public static void CreateAccountInfo(AccountInfo obj)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.InsertAccountInfo(obj, tran);
再谈orm和代码生成
                
再谈orm和代码生成                AccountAccess.InsertAccountInfo(obj);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static void UpdateAccountInfo(AccountInfo obj)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.UpdateAccountInfo(obj, new Condition("ID", "ID", OP.Equals, obj.ID), tran);
再谈orm和代码生成

再谈orm和代码生成                AccountAccess.UpdateAccountInfo(obj, 
new Condition("ID""ID", OP.Equals, obj.ID));
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static void UpdateAccountInfo(string[] updateColumns, object[] updateValues, Condition condition)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.UpdateAccountInfo(updateColumns, updateValues, condition, tran);
再谈orm和代码生成

再谈orm和代码生成                AccountAccess.UpdateAccountInfo(updateColumns, updateValues, condition);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static void UpdateAccountInfo(AccountInfo obj, Condition condition)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.UpdateAccountInfo(obj, condition, tran);
再谈orm和代码生成

再谈orm和代码生成                AccountAccess.UpdateAccountInfo(obj, condition);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static void DeleteAccountInfo(Condition condition)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.DeleteAccountInfo(condition, tran);
再谈orm和代码生成

再谈orm和代码生成                AccountAccess.DeleteAccountInfo(condition);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static void DeleteAccountInfo(int id)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                AccountAccess.DeleteAccountInfo(new Condition("ID", "ID", OP.Equals, id), tran);
再谈orm和代码生成

再谈orm和代码生成                AccountAccess.DeleteAccountInfo(
new Condition("ID""ID", OP.Equals, id));
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static AccountInfo GetAccountInfo(int id)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                return AccountAccess.SelectAccountInfo(id, tran);
再谈orm和代码生成

再谈orm和代码生成                
return AccountAccess.SelectAccountInfo(id);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static IList GetAccountInfo(Condition condition, OrderList orderList)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                return AccountAccess.SelectAccountInfo(condition, orderList, tran);
再谈orm和代码生成

再谈orm和代码生成                
return AccountAccess.SelectAccountInfo(condition, orderList);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static int[] GetAccountInfoIDs(Condition condition)
{
再谈orm和代码生成
//            IDbTransaction tran = Configuration.BeginTransaction();
再谈orm和代码生成
            try
{
再谈orm和代码生成
//                If need transaction, uncomment these commented lines, and add other operations here
再谈orm和代码生成
//                return AccountAccess.SelectAccountInfoIDs(condition, tran);
再谈orm和代码生成

再谈orm和代码生成                
return AccountAccess.SelectAccountInfoIDs(condition);
再谈orm和代码生成
再谈orm和代码生成
//                tran.Commit();
再谈orm和代码生成
            }
再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成
//                tran.Rollback();
再谈orm和代码生成
                throw e;
再谈orm和代码生成            }

再谈orm和代码生成
//            finally
再谈orm和代码生成
//            {
再谈orm和代码生成
//                if (tran.Connection != null && tran.Connection.State == ConnectionState.Open)
再谈orm和代码生成
//                {
再谈orm和代码生成
//                    tran.Connection.Close();
再谈orm和代码生成
//                }
再谈orm和代码生成
//            }
再谈orm和代码生成
        }
再谈orm和代码生成
再谈orm和代码生成        
public static PageAdapter GetAccountInfoPageAdapter(Condition condition, OrderList orderList)
{
再谈orm和代码生成            
try
{
再谈orm和代码生成                
return new PageAdapter(AccountAccess.SelectAccountInfoPageSplit(condition, orderList), new CreateObjectListHandler(AccountInfo.CreateObjectList));
再谈orm和代码生成            }

再谈orm和代码生成            
catch(Exception e)
{
再谈orm和代码生成                
throw e;
再谈orm和代码生成            }

再谈orm和代码生成        }

再谈orm和代码生成
再谈orm和代码生成        
再谈orm和代码生成    }

再谈orm和代码生成}

再谈orm和代码生成

以上后者是CodeGen默认生成的代码,如果要加入事务保护,则需要用户取消注释代码,并加入需要的代码;而前者是需要手工写的,不过观察其代码内容,除了事务相关的信息还是可能从xml映射文件生成的,也就是说,如果前者也采用工具来辅助生成代码的话,两种方式的工作量都是只要为事务写很小一部分代码,工作量还是基本相当。

以上两者的逻辑层调用的各自的数据访问层的代码对调用者都是透明的,不过观察后者的代码中的Condition类可以发现,后者对复杂查询的支持能够做到更灵活,如果允许表现层调用者构造并传入Condition实例的话,可以支持不可预知的条件的查询,而orm似乎不是很容易做到,这是CodeGen相较于SqlMap的优势。

3、第三点就不用列出代码了,orm不论是用xml还是自定义Attribute来描述映射关系,都不得不用反射,即使加入充分的缓存,总有必然的性能损失,而CodeGen可以做到完全不使用反射,性能有保证。

综上所述,使用代码生成,不论在哪个层面,在性能和编程人员的工作量和扩充性灵活性来比较,都比orm只好不差!

所以,orm很好,如果项目适合,那么用吧,但是没有必要迷信它~~

相关文章: