基于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 .......................................
//写此文只是我想对正在工作中使用工具的学习,希望有人能看懂,有些概念我还是比较混沌.......................................................