1. <tr id="722gv"></tr>

            實作CRUD

            2024-03-07 18:39 更新

            下面我們先做一個單表的CRUD,單表的CRUD比較簡單,實際開發的時候不會涉及到立體數據模型的概念,但是我們通過這個范例可以將前面單表數據模型中的相關概念,如:DataType, Dataset等有一個使用上的感覺。便于繼續后面知識點的深入了解,查看這個單表維護的基本界面,連接地址: ?http://dorado.bstek.com/sample-center/com.bstek.dorado.sample.data.SimpleCRUD.d 截圖如下: 這是一個產品列表的維護界面,屬于典型的CRUD界面?;竟δ苡?

            • 單擊添加新增按鈕;
            • 單擊刪除按鈕刪除當前選中行的記錄;
            • 單擊Grid中的某一行記錄,直接在Grid中編輯;
            • 編輯完成后通過Save按鈕完成記錄提交保存的工作;還有本頁面有翻頁標簽,可以進行數據翻頁;

            我們查看一下sample-center中該頁面對應視圖的定義,打com.bstek.dorado.sample.data目錄下的SimpleCRUD.view.xml: 其中我們注意到,本例中我們用到了model節點(之前的HelloWorld和AJAX范例中都未使用到),本例因為要定義數據模型,所以我們用到了model節點,在model節點中我們定義了一個DataType(ProductType),DataType我們在立體數據模型中提到過,它的目的是為了描述數據實體的各個屬性的校驗規則、數據類型、顯示格式等等。在這個DataType中我們定義了其parent屬性,表示這個DataType是Bean類型,另外我們設定其matchType屬性為:com.bstek.dorado.sample.entity.Product,表示Bean的類型為Product。 我們注意到前面瀏覽器中Grid有多個列,但是在這個View視圖中我們只定義了一個productName的PropertyDef對象,這是因為我們默認設置了其autoCreatePropertyDefs屬性為true,表示允許DataType自動根據相關配置(如Product)自動的創建屬性,事實上我們也可以在這個DataType上單擊右鍵,通過其GeneratePropertyDef功能自動創建相關的PropertyDefs: 但在一般情況下,如果不需要通過PropertyDef對象對Bean的屬性進行特別設定,我們就可以不用創建,只要保證autoCreatePropertyDefs屬性為true就可以,在本例中我們設置了它的required屬性為true,確保該屬性的非空特性: 在頁面上我們可以看到設置了required為true之后的productName在Grid的列中就可以看到一個小箭頭圖標,另外我們如果在Grid中將當前列的任何一個值清空都會出現一個紅色的警告圖標,該圖標就是告訴操作人員該列是非空的: 我們再來看一下剛才那個Bean的定義,Product.java:

            package com.bstek.dorado.sample.entity;
            
             
            import java.io.Serializable;
            ...
            import javax.persistence.Table;
            
             
            @Entity
            @Table(name = "PRODUCTS")
            public class Product implements Serializable {
                private static final long serialVersionUID = -6197184284268376113L;
            
             
                private long id;
                private Category category;
                private Long categoryId;
                private String productName;
                private String quantityPerUnit;
                private float unitPrice;
                private int unitsInStock;
                private int unitsOnOrder;
                private int reorderLevel;
                private boolean discontinued;
            
             
                @Id
                @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID")
                @SequenceGenerator(name = "SEQ_ID", sequenceName = "SEQ_ID")
                public long getId() {
                    return id;
                }
            
             
                public void setId(long id) {
                    this.id = id;
                }

            可以看出這個Bean的定義并沒有什么提別,其中用到的一些annotation的寫法都是Hibernate本身提供的,其中并沒有Dorado相關的東西。 定義好DataType之后,我們就還需要定義一個DataSet,就是我們所說的數據集,它用來封裝頁面的數據,這個數據集中提供了一個重要的屬性:dataProvider,如下圖: dataProvider是Dorado中為DataSet提供數據的一個對象,我們看它的值是一個典型的服務定位表達式,這個服務定位表達式之前我們學習過,我們很容易就可以知道它對應到simpleCRUD的getAll方法,我們找到這個方法,com.bstek.dorado.sample.data下SimpleCRUD中的getAll方法:

            @DataProvider
            public Collection<Product> getAll() {
                return productDao.getAll();
            }

            這個方法非常簡單,就是通過一個DAO獲取所有的產品對象,其中DAO的實現完全與Dorado無關,它完全取決與我們將來系統的設計。范例的DAO只做了一個簡單的工作,就是通過Hibernate獲取一個產品列表。這個getAll方法將最終獲得的產品列表直接作為方法調用的返回參數。有了這個數據之后DataSet怎么解析這些數據呢?我們再來看DataSet中的dataType屬性,它的值為:"[ProductType]"。這表示它認為自身是一個以ProductType結構為數據實體的一個集合。我們可以IDE中單擊這個屬性,打開其屬性編輯器: 其中的base節點下是Dorado默認提供的一些全局的DataType:Boolean,boolean, Short, shorg,Int,int等。另外這兒我們看到的ProductType就是當前View中私有的DataType。另外在選擇的時候需要注意objectType屬性的設定: 我們可以選擇默認的Default也可以選用Collection這種聚合的方式,如果選用聚合,則向導生成的表達式為:"[ProductType]",否則就是:"ProductType"。差別就在與是否有中括號,在本例中我們采用中擴號,其原因是因為前面我們從Java的getAll方法返回的是一個Collection這種聚合類的數據,如果getAll返回的是單個Bean,則此處的DataType屬性就可以為沒有中括號的:"ProductType"。 現在我們已經定義好了數據集,以及數據集的數據來源和數據來源的結構的定義。接下來事情就比較簡單了,無非就是在頁面上定義一個Grid,并將它與數據集關聯上,便于展示其中的Product數據。我們查看DataGrid的dataSet屬性配置: 這樣就完成了DataGrid與數據集的綁定。由于目前這個DataSet中的數據結構比較簡單,就是一個Collection結構的二維表,Grid不需要做特別多的設定就可以直接顯示其中的數據了。另外我們也注意到雖然瀏覽器中這個Grid中有很多列,但是在View設計器中這個Grid中卻只有一個列,這是因為我們設置了這個Grid的autoCreateColumn屬性為true,之前我們設置過DataType的autoCreatePropertyDefs為true,這樣DataType可以根據綁定的POJO自動的創建PropertyDef,之后Grid就可以根據綁定的數據集中的DataType自動的創建列對象。 上面我們描述了數據展現和數據提取的工作的大概開發過程,最終界面上所作的各種修改還是要提交的服務器端的,這個提交動作與數據提取的動作基本類似,容易理解,我們來看View中存在一個UpdateAction對象,這個對象就是負責數據提交工作的。其中的updateItem中我們通過dataSet屬性定義了要提交的數據集: 另外在UpdateAction中類似Provider的處理方式,定義了其中的dataResolver:"simpleCRUD#saveAll",這也是一個服務表達式,我們找到相關的Java代碼:

            @DataResolver
            @Transactional
            public void saveAll(Collection<Product> products) {
                productDao.persistEntities(products);
            }

            下面為屬性設置圖: 該方法接受客戶端提交上來的Product的集合,并調用Dao完成一個持久化的動作。定義好UpdateAction之后,我們只要將工具欄上的按鈕與這個Action綁定就可以: 這樣當我們單擊這個保存按鈕的時候,就可以自動的將當前的數據提交回數據庫了。

            基于數據模型的編程

            在實做單表CRUD的范例中我們初步接觸了Dorado基于數據模型開發的一系列對象:

            • DataSet:數據集
            • DataType:數據類型(通常用于描述以數據實體及其中各個屬性)
            • DataProvider:用于為Dorado提供數據(即將業務邏輯層中的數據導入到Dorado中)
            • DataResolver:與DataProvider的作用相反,用于將Dorado中的數據交還給業務邏輯層。

            其中DataProvider與DataResolver是剛剛新接觸的。 下面我們通過一張圖來查看這四中對象在數據環路中的作用: 這張圖我們在前面已經看到過好多次了,只不過將上面的四種對象放在其中而已。其中虛線框是Dorado的作用范圍,其中DataProvider與DataResolver相對來說功能較為明確。

            • DataProvider是用于提供數據的,其目的是將外部與Dorao對接的部分,將數據轉換為Dorado所需要的數據;
            • DataResolver的作用是將Dorado中的數據交給外面的業務系統;
            • DataType用來描述整個Dorado作用域中的數據,不僅僅是ViewObject,它在整個環路中都起作用,這樣我們拿到一個數據之后,就可以通過DataType知道其中是一個什么樣結構的數據,其中包含哪些屬性,有哪些子對象等等;
            • DataSet就是一堆數據的集合,有一個ID,便于其他數據感知控件與其綁定;

            如果我們將這些概念與自己較為熟悉的數據庫的各種術語做一個類比,就可以找到如下的概念翻譯: 其中DataPath,由于SimpleCURD較為簡單,尚未涉及。我們知道由于現在的DataSet是一顆樹形的結構,當我們想做一個較為復雜的數據綁定的時候,DataPath就可以告訴你如何從DataSet中抽取數據,其作用就類似于SQL,我們將在后面的文檔中再做描述。

            以上內容是否對您有幫助:
            在線筆記
            App下載
            App下載

            掃描二維碼

            下載編程獅App

            公眾號
            微信公眾號

            編程獅公眾號

            中文字幕人成乱码熟女|强行入侵女人a片|亚洲日本成本人观看|天天操天天操