在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,若是篇中有错误的描述,欢迎批评指正,若是有不懂得地方,欢迎留言。