三层架构-------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层调用
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

 

 //未完待续.............................以后可能不更细此文,而是新增 V2  V3 .......................................

//写此文只是我想对正在工作中使用工具的学习,希望有人能看懂,有些概念我还是比较混沌.......................................................

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值