最近都没怎么用JAVA了,一直写C#,原来写JAVA也不常用Hibernate和spring这类框架,多数都是jsp + javabean 或者Ejb了。写C#时发现C#几乎没有成熟度较高的框架,多数C#的程序员们好像也不太爱考虑系统框架的问题。所以没事儿时,就用C#写了一个免配置的DB访问组件。基本结构是这样的----------------------------------------------
public interface IDBEngine
{
/// 保存数据
int insert(Object pojo) ;/// 更新数据
int update(Object pojo);/// 删除数据
int delete(Object pojo);
/// 提取结果集
ArrayList select(Object pojo);/// 提取结果集到DataTable
DataTable selectIntoDataTable(Object pojo);/// 提取结果集
ArrayList select(Object pojo, Pagination pagination);/// 提取连接 
OleDbConnection getConnection();/// 打开事务
void beginTrans();/// 提交
void commit();/// 回滚
void rollback();/// 执行单条SQL
void executeSQL(String SQL);/// 带返回执行存储过程语句
ArrayList executeProcedureCall(String SQL, Object[] param, Object voclass);/// 不带返回执行存储过程语句
void executeProcedureCall(String SQL, Object[] param);int getInt(string SQL);int getColumnMaxValue(string TableName, string ColumnName);DataTable executeSqlProcedureCall(String SQL, object[] param);/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表
ArrayList SelectFromSQL(string SQL, object pojo);/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表,同时分页
ArrayList SelectFromSQL(string SQL, object pojo, Pagination pagination);/// 注销对象
void Release();/// 得到当前事务状态
int getTransStates();/// 得到数据库类型
string getDBType();/// 得到数据库当前时间
string getDBDateTime();----------------------------------所有的实体bean都要与对应的数据库表同名,字段名列名就是加get\set
并且必须要继承以下类
public class BasePojo
{//设置查询条件
public void setCondtion(Condtion c)//获取查询条件
public Condtion getCondtion()
//设置排序
public void setOrderBy_DESC(string FiledName)
public void setOrderBy_ASC(string FiledName)
public string getOrderBy()-----------------------------------我在写这个之前看了speedframework的结构,也没有太仔细看,糊里糊涂的就写了这个组件目前我看到的缺点:1、没有自主的分页功能,要依靠数据库里的一个分页存储过程(我自己也感觉这样比较垃圾,而且我只写了oracle和mssql下的分页存储过程)2、没有cache3、没有connection pool,主要是因为MS的驱动里自带了。4、实体类完全反映了数据库中的表或视图的结构。------------------------
以下有我调用时的一些示例public int CancelAssignedSalePlanCollect(SalePlan.v_SalePlan_Collect sale_plan)
        {
            Engine db = Engine.getInstance();            try
            {
                
                //检查计划是否已经审核
                string SQL = "SELECT count(*) FROM T_ProducePlan WHERE stat != 1 AND collect_id = " + sale_plan.getId();
                if (db.getInt(SQL) > 0)
                {
                    //计划已经审核,无法取消
                    db.Release();
                    return 0;
                }                db.beginTrans();                //删除相关计划
                T_ProducePlan produce_plan = new T_ProducePlan();
                produce_plan.setCondtion(new Condtion(" and collect_id = " + sale_plan.getId()));
                
                this.Remove(produce_plan, db);                WriteLog(Config.BaseInfo.getInstance().LogString_Remove, "[删除生产计划] 删除所有汇总ID是“" + sale_plan.getId() + "”生产计划");
                
                //将原销售计划汇总更新状态成“未分配”
                SalePlan.SalePlanManager spm = new SalePlan.SalePlanManager(db);
                SalePlan.v_SalePlan_Collect pln = new SalePlan.v_SalePlan_Collect();
                pln.setStat("1");
                pln.setCondtion(new CSDN.DBQuery.Condtion(" and id = " + sale_plan.getId()));
                spm.modifyCollectSalePlan(pln, db);                WriteLog(Config.BaseInfo.getInstance().LogString_Modify, "[修改市场需求汇总] 修改ID是" + sale_plan.getId() + "的市场需求汇总,其状态更改为“未分配”");                db.commit();                db.Release();                return 1;
            }
            catch (Exception ex)
            {
                if (db.getTransStates() == 1)
                {
                    db.rollback();
                }
                Utils.LogWriter.Error("取消一个销售计划汇总所分配的生产计划时出错:" + ex.Message);
                return -1;
            }        }-------------------------------------
想请高手给我指点一下,这个组件在设计结构上都有哪些缺陷,我应该怎么要改进它。只管说,我知道和Hibernate比,它一无是处

解决方案 »

  1.   

    IDBEngine这个类里面的方法差不多比较齐全了
    c#我就不会玩了
      

  2.   

    我现在比较头痛的是---4、实体类完全反映了数据库中的表或视图的结构。表或者视图的列名变动,那实体类的方法名就得变,要是想做成与数据库表对象分离的,是不是就必须要使用XML?
      

  3.   

    C#的怎么发到这来了?
    .net里不是有DataSet吗?
    使用强类型的数据集,相当于数据持久层。
      

  4.   

    spring的jdbctemplate
    .net也应该有的