基於CODESMITH生成模板解析 WEB->BLL->DLL->ENTITY WEB->Info->Entity->EntityData 所有解釋基於兩個類 Student(學生) Score(分數),不考慮太復雜,假設是幼兒園,只設一門課“玩” Student.Id(ID) Student.Name(姓名) Score.Id(ID) Score.StudentId(學生ID) Score.mark(分數) 0 CodeSmith 會自動生成類 BL Student_Info DL Student_Entity EL Student_EntityData 自下向上講 1.實體層 EntityData 1.與所有其它架構實體層一樣,此層主要功能是映射數據庫字段, 方法就是在此類中將所有的數據庫字段一一定義屬性。 private int _Id=0; //學號 public int Id { get{return _Id;} set{_Id=value;} } private string _Name=""; //學生姓名 public string Name { get{return _Name;} set{_Name=value;} } private string _OrderBy_Name=""; //排序字段 public string OrderBy_Name { get{return _OrderBy_Name;} set{_OrderBy_Name=value;} } private string _OrderBy_Type=""; //排序類型 public string OrderBy_Type { get{return _OrderBy_Type;} set{_OrderBy_Type=value;} } 屬性寫法不用做太多解釋, 1).定義私有字段 2).定義公共屬性 ,命名方法,私有字段下劃線開頭,去掉下劃線為其屬性名 3).注意整型數據默認值0(如果有需要可能是-1,比如是否字段0否,1是,默認-1);字符串默認值"" 4).字段會比數據庫中的多兩個"排序字段"及"排序類型" 2.將DataRow中的數據加載到實體中去 public void LoadData(DataRow dr) { if(dr["ID"]!=System.DBNull.Value) { _Id=Convert.ToInt32(dr["ID"].ToString()); } if(dr["NAME"]!=System.DBNull.Value) { _Name=dr["NAME"].ToString(); } } 分析 2.1 意義 傳入參數DataRow,無返回值,但會填寫Entity中的字段,這樣就可以將一個DataTable=>Entity 2.2 應用 用於通過ID實列化類 dl層有方法 GetSingelData(int intId) public static Student_EntityData GetSingelData(int intId) { //定義實體對象並對其主鍵賦值 Student_EntityData obj=new Student_EntityData(); obj.Id=intId; //通過id==>DataTable==>Entity DataTable dt=GetSelectList(obj); //GetSelectList(obj)方法為dl層默認生成的增刪改查四大方法中的查。 //注意其參數為EntityData,從BL層傳過來的。 //因為主鍵以及賦值,所以數據最多一條 if(dt!=null && dt.Rows.count>0) { //此處用到el層中的方法,將DataRow中的內容更新到實體中去 obj.LoadData(dt.Rows[0]); } //返回實體對象 return obj; } 3.定義SQL語句 //*******************************************************select //訪問類型是public ,因為需要被DL層調用 public string GetSelectSql() { StringBuilder sb=new StringBuilder(); sb.Append(" SELECT "); sb.Append(" ID"); sb.Append(" ,NAME"); sb.Append(" FROM STUDENT"); sb.Append(" WHERE 1=1"); sb.Append(" AND IS_DELETED=0"); //如果ID不為0,表示對單條數據的操作 //注意此處0是默認的,若在Web層實例化時給定了值,此值就是傳的值,若不給則是默認為0 //為什麼默認為0而不是其他值呢?因為在el層聲明字段時給其默認賦值為0,若默認其他值,web層不賦值時其就是那個值 if(this._Id!=0) { strSql.Append(" AND ID="+this._Id); } //如果排序字段不為空,進行排序--此處默認判斷是基於web層同時給Name及type賦值的。 if(!string.IsNullOrEmpty(this._OrderBy_Name)) { strSql.Append(" ORDER BY "+this._OrderBy_Name+" "+this._OrderBy_Type); } return strSql.ToString(); } //*******************************************************update public string GetUpdateSql() { StringBuilder strSql=new StringBuilder(); strSql.Append(" UPDATE STUDENT SET"); strSql.Append(" ID="+this._Id); strSql.Append(" NAME="+BaseTool.SqlQ(this._Name)); //sql語句中字符串需要加單引號,因經常要用每次寫太煩,common類中定義了此方法 //BaseTool.SqlQ()在字符串前後加上單引號 str="'" + str + "'"; == aa==>"aa" strSql.Append(" "); strSql.Append(" WHERE ID="+this._Id); return strSql.ToString(); } //*******************************************************delete //默認的刪除都是邏輯刪除,所以數據庫在設計的時候需要增加字段"是否刪除" "刪除時間",示例STUDENT沒有這些字段 //還要設計插入時間 插入用戶 更新時間 更新用戶 這樣才正規 public string GetDeleteSql(string strIdList) { StringBuilder strSql=new StringBuilder(); strSql.Append(" UPDATE STUDENT SET"); strSql.Append(" IS_DELETED=1"); strSql.Append(" DELETE_TIME=SYSDATE"); strSql.Append(" "); strSql.Append(" WHERE ID IN("+ strIdList +")"); //通常的刪除ID是從列表的多選按鈕的到ID, //strIdList內容是通過web層 ICallBackEventHandler.RaiseCallbackEvent(string eventArg) //方法的到參數,得到的機制與CODESMITH無關 } //*******************************************************insert public string GetInsertSql() { StringBuilder strSql=new StringBuilder(); strSql.Append(" INSERT INTO STUDENT("); strSql.Append(" ID"); strSql.Append(" ,NAME"); strSql.Append(" ) VALUES ("); strSql.Append(" "+this._Id); strSql.Append(" ,"+BaseTool.SqlQ(this._Name)); strSql.Append(" )"); return strSql.ToString(); } 2.數據訪問層 增、刪、改、查、分頁查詢、單條記錄查詢 六個默認方法 2.1.增-- 2.1.1)注意DL層中的方法都是靜態static的,方便BL層調用 2.1.2)增、改、查 都會將 EntityData作為參數傳遞,(實體作為參數傳遞的優勢很大,就不細說了) public static int InsertData(Student_EntityData obj) { string strSql=obj.GetInsertSql(); int intReturn=0; intReturn=OracleHelper.ExecuteNonQuery(strSql); return intReturn; } 2.2 刪 2.2.1 注意穿參數格式 ***,***,*** public static int DeleteData(string strIdList) { Student_EntityData obj=new Student(); string strSql=obj.GetDeleteSql(string strIdList); int intReturn=0; intReturn =OracleHelper.ExecuteNonQuery(strSql); return intReturn; } 2.3 改 2.3.1 public static int UpdateData(Student_EntityData obj) { string strSql=obj.GetUpdateSql(); int intReturn=0; intReturn=OracleHelper.ExecuteNonQuery(strSql); return intReeturn; } 2.4 查 2.4.1 public static DataTable GetSelectList(Student_EntityData obj) { string strSql=obj.GetSelectSql(); return OracleHelper.FillDataTable(strSql); } 2.4 分頁查詢 2.4.1 此方法的執行依賴OracleHelper中的RunPagerProcedure方法與數據庫中的GETPAGEDATA存儲過程的配合,不單獨分析 2.4.2 輸入參數 EntityData PageIndex PageSize 2.4.3 返回值 RowCount dtList 2.4.4 public static bool GetSelectListWithPageIndex(Student_EntityData obj, int intPageIndex, int intPageSize, ref int intRowCount, ref DataTable dtList) { string strSql=obj.GetSelectSql(); bool bSuccess=OracleHelper.RunPageProcedure(strSql,intPageIndex,intPageSize,ref intRowCount,ref dtList); return bSuccess; } 2.4 單條記錄 2.4.1 單條記錄方法返回值是自定義實體,不是系統默認類string ,int 等 2.4.2 此方法參數是ID 不是實體 需根據ID 調用 查詢方法(得到table) 轉化為實體(LoadData方法) public static Student_EntityData GetSingelData(int intId) { Student_EntityData obj =new Student_EntityData(); obj._Id=intId; DataTable dt=GetSelectList(obj); //調用本層的查詢方法 if(dt!=null && dt.Rows.Count>0) { obj.LoadData(dt.Rows[0]); } return obj; } 3.業務邏輯層 增、刪、改、查 、分頁查詢、按ID單條記錄實例化 3.1 新建對應實體類型的字段及其屬性 private Student_EntityData _InfoDetail=new Student_EntityData(); public Student_EntityData InfoDetail { get{ return _InfoDetail;} set{ _InfoDetail=value;} } 3.2 根據ID實例化對應實體 //注意其用到dl層了返回值為entity的獲取單條記錄方法 public Student_Info(int intId) { _InfoDetail=Student_Entity.GetsingelData(intId); } 3.3 增 3.3.1 DL層的方法是靜態的,不用先實列化再調用方法(靜態方法優勢再議) 3.3.2 參數為空 3.3.3 會用到其私有實體字段(此實體字段一定是web層先實例化的) public int InsetData() { return Student_Entity.InsertData(_InfoDetail); } 3.4 刪 public int DeleteData(string strIdList) { return Student_Entity.DeleteData(strIdList); } 3.5 改 public int UpdateData() { return Student_Entity.UpdateData(_InfoDetail); } 3.6 查 4。UI