您的位置:首页 > 运维架构 > 网站架构

三层架构-------CodeSmith 生成代码解读 V1 (20130311)

2013-03-11 09:07 459 查看
基于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 .......................................

//写此文只是我想对正在工作中使用工具的学习,希望有人能看懂,有些概念我还是比较混沌.......................................................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: