有了前面的基礎,這裏看看這這個框架下怎麼開發程序。
這是一個簡單的查詢,通過構建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個類,如果覺得有想法或者疑問,歡迎你和我交流。如果你見多識廣,希望你繼續關注其它內容,同時真心希望你能提出建議,搞了這麼多年,雖然挺有收穫,但總覺得自己瞭解的面太窄,所以就拿來曬曬,希望這樣的交流對雙方都能有所幫助。