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:
String fetchAccount = 'select Id from Account limit 10';
List<Account> accountList = Database.query(fetchAccount);
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):此方法用于回滚到指定的保存点。
SavePoint sp1 = Database.setSavePoint();
List<Goods__c> goodsList;
Goods__c goods = new Goods__c();
goods.GoodsName__c = 'goodsNameTest';
goods.GoodsPrice__c = 200;
goods.GoodsCostPrice__c = 100;
insert goods;
goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];
if(goodsList != null && goodsList.size() > 0) {
Goods__c currentGoods = goodsList.get(0);
system.debug('rollback以前 : ' + JSON.serializePretty(currentGoods));
}
Database.rollback(sp1);
goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];
if(goodsList != null && goodsList.size() > 0) {
Goods__c currentGoods = goodsList.get(0);
system.debug('rollback以后 : ' + JSON.serializePretty(currentGoods));
} else {
system.debug('rollback 以后,不存在刚才添加的记录');
}
返回结果:
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,如果篇中有错误的描述,欢迎批评指正,如果有不懂得地方,欢迎留言。
salesforce 零基础学习(三十七) DML及Database方法简单描述的更多相关文章
- 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(二十二)Test简单使用
本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...
- salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(四十)Custom Settings简单使用
有时候,项目中我们需要设置类似白名单的功能,即某些用户或者某种Profile的用户不走一些校验或者走一些校验,这时,使用Custom Settings功能可以很好的解决这一需求. Custom Set ...
- salesforce 零基础学习(六十一)apex:component简单使用以及图片轮转播放的实现
有的时候,我们项目有可能有类似需求:做一个简单的图像轮转播放功能,不同的VF页面调用可以显示不同的图片以及不同的图片描述.这种情况,如果在每个页面单独处理相关的图像轮转播放则显得代码特别冗余,此种情况 ...
- salesforce 零基础学习(二十五)PickList简单联动操作
有的时候,项目需要一些联动的操作,比如省和市之间的联动,不同的省应该显示不同的城市. 操作步骤如下: 1.新建provice字段,并且初始化相关的值 2.新建city字段,并且初始化相关的值 3.在P ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.234.0.apexref.meta/apexref/apex_methods_syst ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
随机推荐
- css3 2D动画的基本用法和介绍
<style> body{height:400px;border:1px solid #000;} .box{width:90px;height:30px;border:1px solid ...
- 给自己的Unity添加声音文件
下面说明一下,在Unity 里是怎么样加载声音文件的. Unity同时支持单声道和立体声音频资产. Unity支持导入以下音频文件格式:.aif, .wav, .mp3, 和 .ogg,和以下音轨模块 ...
- testng参数化及用例排序
http://blog.sina.com.cn/s/blog_6966650401012ra0.html 一.一个简单的测试谷歌搜索 import org.testng.annotations.Tes ...
- iOS CGContextRef画图时的常用方法
UIView的drawRect方法 CoreGraphics绘图 综述:描述系统会调用UIView的drawRect方法,所以coreGraphics的所有实现代码放在该函数内,setNeedsDis ...
- 口水话 闭包中this的指向
前言:高程这本书真是神奇,每复习一遍,都会有新的收获.话说我看书有个习惯,要是看得似懂非懂的地方就喜欢打个“?”.这次看到高程第七章“函数表达式”关于闭包与this对象的部分,发现已经积攒了2个问号了 ...
- 查看Linux内存状况的命令及工具
1.cat /proc/meminfo cat /proc/<pid>/statm 和 cat /proc/<pid>/status 获取特定的进程的内存信息: 2. ...
- 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
名字属性(The name Property) 在JavaScript中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
- 【String与基本类型之间的转换】以及【进制转换】
1. 基本数据类型---->字符串类型: 方法一:使用连接一个空字符串,例如 基本数据类型+“” : 方法二:静态方法 String.valueOf(),具体有: String.valueOf ...
- 亚马逊云服务器VPS Amazon EC2 免费VPS主机配置CentOS及其它内容
Amazon目前提供为期一年的免费VPS服务,可到地址http://aws.amazon.com 进行申请. 现在对账号申请成功后,对VPS主机配置CentOS的过程做个图文介绍 1.创建实例(Ins ...
- apache httpclient cache 实现可缓存的http客户端
这里的cache storage 采用ehcache,而不是默认的内存式的cache storage.采用ehcache可以将内容缓存到磁盘上. maven <dependency> &l ...