当前位置:编程学习 > C/C++ >>

CodeSmith 生成代码解读 V1 (20130311)

基于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
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,