在apex中經過soql查詢可使用兩種方式,使用DML語句或者使用Database的方法。html
使用DML語句和使用Database類的方法對於咱們來講用的都不少,而且都很常見。對於數據庫常見的操做:增,刪,改,查,經過DML語句和Database類的方法實現以下所示:數據庫
DML語句:fetch
查找:[queryString] 添加:insert 修改:update 刪除:delete 添加或修改:upserturl
Database類的方法:spa
查找:Database.query() 添加:Database.insert() 修改:Database.update() 刪除:Database.delete() 添加或者修改:Database.upsert()debug
在功能層次上來講,使用DML語句和使用Database類的方法均能實現DML相關操做,不過兩者使用起來是有區別的:code
1.使用DML語句進行批量操做時,好比批量添加,當有一個有錯誤的時候,便會報錯,以前添加的內容便添加失敗,可是使用Database的方法時,能夠設置參數來控制,當有錯誤出現的時候是否跳過本條記錄進行下一條記錄的操做;htm
2.使用Database的方法能夠進行事務處理,使用DML語句無法實現此功能。blog
對於咱們來講,使用哪一種方式比較好?事務
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,若是篇中有錯誤的描述,歡迎批評指正,若是有不懂得地方,歡迎留言。