使用dorado開發模式,我們可以實現以下開發技巧
開發技巧1.實現動態查詢功能:
1.?查詢按鈕的onClick事件中寫入:
datasetEmployee.parameters().setValue(“employee_id”, editor_employee_id.value);
datasetEmployee.parameters().setValue(“employee_name”, editor_employee_name.value);
datasetEmployee.parameters().setValue(“dept_id”, editor_employee_id.value);
datasetEmployee.parameters().setValue(“sex”, editor_sex.checked);
datasetEmployee.parameters().setValue(“married”, editor_married.checked);
…對其它的查詢條件也進行賦值
?
2.??向服務器發出查詢請求:
Dorado中如果希望向服務器端發出動態的數據請求,方法比較多,比較常用的是dataset的flushData方法或者dataset的loadPage方法,兩者的區別是是否清除瀏覽器客戶端dataset中已有的緩存數據,其中loadPage會保留原有的數據。這樣當我們想查看已經在客戶端存在的其它頁的數據時,系統就不再需要向服務器端發出新的數據請求,而是直接采用緩存到客戶端的數據提供給調用者。兩個方法也都可以具體指定一個數字參數,用以通知服務器該請求具體是想要獲取哪一頁的數據。
在1代碼的基礎上,我們在查詢條件賦值語句的最后寫入代碼:
datasetEmployee.flushData();//向服務器發出新的數據請求,并清理瀏覽器中dataset的數據
?
3.??服務器端的代碼實現對查詢條件的處理:
服務器端的代碼實現如下:
String employee_name =dataset.parameters().getString(“employee_name”);
…//獲取各種用戶輸入的查詢條件
String sql = “”; if (employee_name!=null && “”.equlas(employee_name)==false){sql += “employee_name like “ + “’” + employee_name + “,”; }
…//拼寫sql語句
Connection conn = getConnection();//獲取數據庫連接 Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);//獲取查詢結果
以上代碼和原始模型中的差別是,查詢條件的獲取從Request改為dataset.parameters(),其中dataset為客戶端發出數據請求的dataset在服務器端的映射對象。
接下來我們就可以利用dataset.insertRecord()方法插入記錄了
While (rs.next()) {dataset.insertRecord();dataset.setString(“employee_id”, rs.getString(“employee_id”));dataset.setString(“employee_name”, rs.getString(“employee_name”));dataset.setBoolean(“sex”, rs.getBoolean(“sex”));dataset.setFloat(“salary”, rs.getFloat(“salary”));dataset.setDate (“birthday”, rs.getDate(“birthday”));
}
這段代碼執行之后,客戶端的datasetEmployee的flushData()動作執行結束,dorado的引擎會自動將服務器端得到的新記錄插入datasetEmployee中,從而完成一次查詢動作。
?
開發技巧2.動態查詢技巧進階QueryCommand
?
對于以上的查詢,dorado中提供了一種給為易于管理的開發方式
1.??利用AutoForm的自動布局功能優化查詢條件中Form的使用.利用一個FormDataset統一管理查詢條件中的所有條件變量,并利用AutoForm綁定該記錄集,以及利用AutoForm實現布局的靈活變化,這樣頁面上查詢條件編輯框的輸出,開發人員只需要寫一行代碼:
<d:AutoForm id=”formQuery” />
2.?利用QueryCommand自動完成datasetEmployee的parameters的賦值動作
QueryCommand中設定兩個參數:
conditionDataset:存儲查詢條件的FormDataset的id
queryDataset:查詢結果集對應的dataset的id,我們的范例就是datasetEmployee
設定好這兩個屬性后,QueryCommand提供一個execute()方法用戶執行命令默認的標準動作,內部代碼為:
for (i=0; i<conditionDataset.getFieldCount(); i++){//遍歷所有查詢條件并存儲到需要得到查詢結果的記錄集的parameters中var fieldName = conditionDataset.getField(i).getName();var value = conditionDataseet.getValue(fieldname);queryDataset.parameters().setValue(fieldname, value); }
queryDataset.flushData();//調用需要得到查詢結果的記錄集的數據下載請求動作
這樣我們在查詢按鈕的單擊事件中寫入代碼:
commandQuery.execute();從而完成開發技巧1中的前臺處理功能,而后臺的代碼我們保持不變。
該技巧主要解決:
l?查詢條件通過FormDataset加強管理,可以更方便的加入一些dorado特性,例如日期輸入,數字輸入的控制
l??查詢條件界面布局采用AutoForm實現,使得修改頁面布局變得更為快捷
l??查詢參數賦值自動完成,不需要寫js代碼
開發技巧3.動態查詢技巧進階AutoSqlDataset
?
對于直接使用dorado提供的datasource實現編程的系統,dorado提供了AutoSqlDataset幫組開發人員實現開發技巧1中服務器端代碼的自動完成功能,看一個簡單的sql查詢語句
Select * from employee where dept_id = ‘D11’;
對應AutoSqlDataset中提供一個BaseMatchRule對象,其中幾個屬性
orginField對應為要查詢的字段名,該范例中應該為dept_id
operator對應為查詢匹配方式,該范例中應該為=
實際可以匹配的條件可以為:=,<>,>,<,>=,<=,like
value對應為查詢匹配條件,該范例中對應為D11
在AutoSqlDataset中我們都是通過MatchRule提供條件匹配的描述
查詢中開發人員還通常面臨加入用戶的查詢條件中不包含dept_id的值的情況下,用戶需要查出所有的的記錄。這個功能我們稱他為有條件逃逸。該實例中,條件是dept_id查詢條件的值為null或者空字符串,就在sql中不拼寫where語句。
BaseMatchRule中通過兩個屬性對該功能描述
escapeEnabled:是否允許逃逸