天天看點

salesforce 零基礎學習(三十七) DML及Database方法簡單描述

在apex中通過soql查詢可以使用兩種方式,使用DML語句或者使用Database的方法。

使用DML語句和使用Database類的方法對于我們來說用的都很多,并且都很常見。對于資料庫常見的操作:增,删,改,查,通過DML語句和Database類的方法實作如下所示:

DML語句:

查找:[queryString]    添加:insert    修改:update    删除:delete    添加或修改:upsert

Database類的方法:

查找:Database.query()    添加:Database.insert()    修改:Database.update()    删除:Database.delete()   添加或者修改:Database.upsert()

在功能層次上來說,使用DML語句和使用Database類的方法均能實作DML相關操作,不過二者使用起來是有差別的:

1.使用DML語句進行批量操作時,比如批量添加,當有一個有錯誤的時候,便會報錯,之前添加的内容便添加失敗,但是使用Database的方法時,可以設定參數來控制,當有錯誤出現的時候是否跳過本條記錄進行下一條記錄的操作;

2.使用Database的方法可以進行事務處理,使用DML語句沒法實作此功能。

對于我們來說,使用哪種方式比較好?

 1.普通增删改查,遇到異常就抛出的可以選擇DML語句,畢竟寫起來友善

 2.如果需要用到批處理,需要使用Database類

 3.在批進行中,遇到錯誤繼續下一條處理的使用Database類的方法

 4.需要用到事務,對操作有可能進行復原操作的使用Database類的方法。

常用Database類的方法介紹

普通操作篇:

1.public static sObject[] query(String queryString)

此方法用于查詢,與DML中[queryString]功能相同,eg:

1 String fetchAccount = 'select Id from Account limit 10';
2 List<Account> accountList = Database.query(fetchAccount);
3 system.debug(JSON.serialize(accountList));      

注意:使用List接收查詢結果,如果查詢結果為空的情況下,上面的accountList并不是null,而是()代表長度為空,是以如果判斷目前查詢是否有值,

不能通過accountList == null來判斷,而是需要通過accountList.size() == 0來判斷

2.public static Database.SaveResult insert(sObject recordToInsert, Boolean allOrNone)

  public static Database.SaveResult[] insert(sObject[] recordsToInsert, Boolean allOrNone)

 這兩個方法功能與DML語句中的insert相似,差別為多了一個allOrNone參數,當設定成false的情況下,允許部分插入成功,當設定成true的情況下,其功能和DML的insert相同。當需求中要求可以部分插入成功,将不成功的資訊顯示出來情況下,使用Database.insert是最好不過了,Database.SaveResult類用于儲存插入,修改的記錄是否成功,如果失敗情況下的失敗資訊等訊息。此種方式可以常常用于批處理操作中。

3.public static Database.SaveResult update(sObject recordToUpdate, Boolean allOrNone)

   public static Database.SaveResult[] update(sObject[] recordsToUpdate, Boolean allOrNone)

 這兩個方法功能與DML語句中的update相似,其中allOrNone與insert描述相同,這裡不作解釋。

4.public static Database.DeleteResult delete(ID recordID, Boolean allOrNone)

   public static Database.DeleteResult[] delete(ID[] recordIDs, Boolean allOrNone)

 這兩個方法功能與DML語句中的delete相似,其中allOrNone與insert描述相同,這裡不做解釋。

批處理篇:

批處理可以檢視此部落格:http://www.cnblogs.com/zero-zyq/p/5287343.html

事務篇

Database類的方法可以實作資料庫的事務處理,主要通過兩個方法實作:

public static System.Savepoint setSavepoint():此方法用于設定一個事務的儲存點,傳回類型為Savepoint類型。

public static Void rollback(System.Savepoint databaseSavepoint):此方法用于復原到指定的儲存點。

1 SavePoint sp1 = Database.setSavePoint();
 2 List<Goods__c> goodsList;
 3 Goods__c goods = new Goods__c();
 4 goods.GoodsName__c = 'goodsNameTest';
 5 goods.GoodsPrice__c = 200;
 6 goods.GoodsCostPrice__c = 100;
 7 insert goods;
 8 goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];
 9 if(goodsList != null && goodsList.size() > 0) {
10     Goods__c currentGoods = goodsList.get(0);
11     system.debug('rollback以前 : ' + JSON.serializePretty(currentGoods));
12 }
13 Database.rollback(sp1);
14 goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];
15 if(goodsList != null && goodsList.size() > 0) {
16     Goods__c currentGoods = goodsList.get(0);
17     system.debug('rollback以後 : ' + JSON.serializePretty(currentGoods));
18 } else {
19     system.debug('rollback 以後,不存在剛才添加的記錄');
20 }      

傳回結果:

rollback以前 : {
  "attributes" : {
    "type" : "Goods__c",
    "url" : "/services/data/v37.0/sobjects/Goods__c/a0528000008U6SHAA0"
  },
  "Id" : "a0528000008U6SHAA0",
  "GoodsName__c" : "goodsNameTest",
  "GoodsPrice__c" : 200.000000,
  "GoodsCostPrice__c" : 100.000000
}

rollback 以後,不存在剛才添加的記錄      

本篇隻是介紹最基礎的關于資料操作的知識,如果想深入了解請看官方PDF,如果篇中有錯誤的描述,歡迎批評指正,如果有不懂得地方,歡迎留言。

作者:zero

部落格位址:http://www.cnblogs.com/zero-zyq/

本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接

個人下載下傳了一些相關學習的PDF檔案,如果需要下載下傳請通路百度雲 點選此處通路 密碼:jhuy

如果文章的内容對你有幫助,歡迎點贊~

為友善手機端檢視部落格,現正在将部落格遷移至微信公衆号:Salesforce零基礎學習,歡迎各位關注。