2.10 业务开发(给开发人员的样例程序)

  有了前面的基础,这里看看这这个框架下怎么开发程序。
  这是一个简单的查询,通过构建Query对象,并增加查询条件,最后调用Business实现查询,结果存储在RetInfo中。
  SynchroLogQryAction属于业务层,负责完成查询,如果需要,还可以实现其它功能。
  SynchroLogQryBusiness负责查询,其实可以不要,后来实现了一个通用的SimpleQueryBusiness,作为示例程序,现在这样更清晰。
  SynchroLogAccess是数据结构定义,由于id是自增id,所以多了一个insert方法,当然也可以不要,那样开发人员自己设置好id。后来这个类也改进了,Access类都不要了,通过配置文件或者数据库自动生成,而配置文件或数据库的来源是直接从数据库导出。
  这是AccessManager的自动生成方法。
  /**
   * 构建一个Access
   * @param request  Request,用于权限认证
   * @param name     表名
   * @return         Access
   * @throws java.lang.Exception
   */
  public BaseAccess getAccess(Request request,String name) throws Exception
  
  下面是3个类的源程序 
/**
 * <p>同步监控信息查询</p>
 * @author lws
 */
public class SynchroLogQryAction extends BaseAction
{
  /**
   * <p>Business 实现基础类的抽象方法,完成查询的组织</p>
   * @param request     封装的请求
   * @return            BaseForward
   * @throws java.lang.Exception
   */
  public BaseForward operate(Request request) throws Exception{
    //由于还没有做查询条件,所以进入页面时reqfrompage为空,若为空,则设其等于qryItem。
    if(request.getParameter("reqfrompage") == null)
    {
      return new BaseForward("SUCCESS");
    }
    if(request.getParameter("reqfrompage").equals("qryItem"))
    {
      String OrderClause = request.getString("OrderClause");
      if(OrderClause == null)
      {
        OrderClause = "order by SHL_EndTime desc";
        request.setOrderBy(OrderClause);
      }

      String Date_start = request.getString("Date_start");
      String Date_end = request.getString("Date_end");
      String SendReceive = request.getString("SendReceive");
      Query query = new Query(request);
      query.clearWhere();
      if(Date_start != null)
      {
        query.addStringOperate("SHL_BeginTime",">=",Date_start);
      }
      if(Date_end != null)
      {
        query.addStringOperate("SHL_EndTime","<=",Date_end);
      }
      if(SendReceive != null)
      {
        query.addEqualInt("SHL_SendReceive",SendReceive);
      }
      request.setWhere(query.getSetPageWhere());

      request.setQuery(query);
      RetInfo retInfo = new SynchroLogQryBusiness().business(request);
      request.setReturnObject(retInfo);
      return new BaseForward("SUCCESS");
    }
    if(request.getParameter("reqfrompage").equals("orderby"))
    {
      operateOrderBy(request,new SynchroLogQryBusiness());
      return new BaseForward("SUCCESS");
    }
    // 不应该发生
    return new BaseForward("SUCCESS");
  }
}

/**
 * <p>同步监控信息查询</p>
 * @author lws
 */
public class SynchroLogQryBusiness extends QueryBusiness
{

  /**
   * <p>实现基本的查询方法
   * @param ds 数据库连接
   * @param request      Request,包含需要的全部参数
   * @return             查询结果
   * @throws java.lang.Exception
   */
  public RetInfo business(DataSource ds,Request request) throws Exception{
    Query query = (Query) request.getQuery(getName());

    SynchroLogAccess qryAccess = new SynchroLogAccess();
    query.setAccess(qryAccess);

    RetInfo retInfo = query.query(ds);
    return retInfo;
  }
}

/**
 * 同步日志的Access
 * @author lws
 */
public class SynchroLogAccess extends BaseAccess0 {

  /**
   * 定义对应的数据库表
   * @return   对应的数据库表名
   */
  public String getTable() {
    return "CRT_SynchroLog";
  }

  /**
   * 定义对应的数据库表的结构
   * @return   对应的数据库表的结构
   */
  public FieldGroup getFieldGroup() {
    FieldGroup fieldGroup = new FieldGroup();
    fieldGroup.addField(new Field("SHL_ID", Type.INT_TYPE)); // id    长度16
    fieldGroup.addField(new Field("SHL_SendReceive", Type.INT_TYPE)); // 长度1
    //fieldGroup.addField(new Field("SHL_Type", Value.INT_TYPE)); // 统计类型   长度8
    fieldGroup.addField(new Field("SHL_BeginTime", Type.STRING_TYPE)); // 统计开始时间  长度24
    fieldGroup.addField(new Field("SHL_EndTime", Type.STRING_TYPE)); // 统计结束时间  长度24
    fieldGroup.addField(new Field("SHL_Delay", Type.INT_TYPE)); // 延迟时间  长度16
    fieldGroup.addField(new Field("SHL_SetMaxNum", Type.INT_TYPE)); // 设置的最大数  长度16
    fieldGroup.addField(new Field("SHL_Times", Type.INT_TYPE)); // 同步次数   长度16
    fieldGroup.addField(new Field("SHL_Time", Type.INT_TYPE)); // 同步时间    长度16
    fieldGroup.addField(new Field("SHL_SQLNumbers", Type.INT_TYPE)); // 同步sql命令数   长度16
    fieldGroup.addField(new Field("SHL_MaxTimes", Type.INT_TYPE)); // 满负同步次数   长度16
    fieldGroup.addField(new Field("SHL_MaxTime", Type.INT_TYPE)); // 满负同步时间    长度16
    fieldGroup.addField(new Field("SHL_MaxSQLNumbers", Type.INT_TYPE)); // 满负同步sql命令数  长度16
    fieldGroup.addField(new Field("SHL_MinTimes", Type.INT_TYPE)); // 0同步次数   长度16
    fieldGroup.addField(new Field("SHL_MinTime", Type.INT_TYPE)); // 0同步时间    长度16
    fieldGroup.addField(new Field("SHL_ReceiveSQL", Type.INT_TYPE)); // 接收的sql数   长度16
    fieldGroup.addField(new Field("SHL_SkipReceiveSQL", Type.INT_TYPE)); // 无效的sql数  长度16
    return fieldGroup;
  }

  static private int autoIndex = 0;
  /**
   * 相关字段在记录中的位置
   */
  final public static int ID = autoIndex++;
  final public static int SHL_SendReceive = autoIndex++;
  final public static int SHL_BeginTime = autoIndex++;
  //省略了其它的位置定义

  /**
   * 插入数据,完成id的生成
   * @param ds     数据库连接, 调用方法应创建连接,不能为空
   * @param record 要插入的记录
   * @throws java.lang.Exception
   */
  protected void insert(DataSource ds, Record record) throws Exception {
    Integer id = IdentityManager.getIdentity(getTable());
    record.set(ID, id);
    super.insertRecord(ds, record);
  }
}
  如果你仔细看了这3个类,如果觉得有想法或者疑问,欢迎你和我交流。如果你见多识广,希望你继续关注其它内容,同时真心希望你能提出建议,搞了这么多年,虽然挺有收获,但总觉得自己了解的面太窄,所以就拿来晒晒,希望这样的交流对双方都能有所帮助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章