程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CodeSmith 生成代碼解讀 V1 (20130311)

CodeSmith 生成代碼解讀 V1 (20130311)

編輯:C++入門知識

基於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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved