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個類,如果覺得有想法或者疑問,歡迎你和我交流。如果你見多識廣,希望你繼續關注其它內容,同時真心希望你能提出建議,搞了這麼多年,雖然挺有收穫,但總覺得自己瞭解的面太窄,所以就拿來曬曬,希望這樣的交流對雙方都能有所幫助。

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