基于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++ ,