在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方法简单描述的更多相关文章

  1. 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  2. salesforce 零基础学习(二十二)Test简单使用

    本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...

  3. salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  4. salesforce 零基础学习(四十)Custom Settings简单使用

    有时候,项目中我们需要设置类似白名单的功能,即某些用户或者某种Profile的用户不走一些校验或者走一些校验,这时,使用Custom Settings功能可以很好的解决这一需求. Custom Set ...

  5. salesforce 零基础学习(六十一)apex:component简单使用以及图片轮转播放的实现

    有的时候,我们项目有可能有类似需求:做一个简单的图像轮转播放功能,不同的VF页面调用可以显示不同的图片以及不同的图片描述.这种情况,如果在每个页面单独处理相关的图像轮转播放则显得代码特别冗余,此种情况 ...

  6. salesforce 零基础学习(二十五)PickList简单联动操作

    有的时候,项目需要一些联动的操作,比如省和市之间的联动,不同的省应该显示不同的城市. 操作步骤如下: 1.新建provice字段,并且初始化相关的值 2.新建city字段,并且初始化相关的值 3.在P ...

  7. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  8. salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.234.0.apexref.meta/apexref/apex_methods_syst ...

  9. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

随机推荐

  1. java的三元运算符

    1.三元运算符语法:判断表达式?表达式1:表达式2: (1)三元运算符适合于判断2个值到底使用哪一个! public static void mian(String[] args){ int sex= ...

  2. [转载]Firebird与MySQL:一个使用者的体会

    老板要我开发一个LINUX平台上的数据库项目,要求一定要用开源免费数据库.我知道这个数据库必须能够上网操作,同时作为公司的核心骨干数据库,除了必须是稳定的存储数据库外还必须有很强的数据和数据库控管功能 ...

  3. STM32正交编码器驱动电机

    1.编码器原理        什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向. 这里使用了TI12模式,例如当T1上升 ...

  4. C# 实现 任意多边形切割折线算法

    1.    内容简介 本文旨在解决任意多边形切割折线,获取切割之后的折线集合. 本文实现的算法内容包括:判断两条线段是否相交,如若相交,获取交点集合.对线上的点集,按斜率方向排序.判断点是否在多边形内 ...

  5. AKI

    KDIGO 2012定义:尿量<0.5ml/kg/h 6h+:scr上升50%+ 7d-:scr上升26.5 2d- 但面对录入窗口,又想不出说什么了,继续看aki?刚才想的是什么呢?入冬,好像 ...

  6. POJ 2352 Stars(树状数组)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30496   Accepted: 13316 Descripti ...

  7. Inno Setup 如何读写文件

    软件安装的实质就是拷贝,对于简单的打包当然不需要考虑修改某(配置)文件.通过inno修改文件的目的在于把安装时相关信息写入文件中,提供其它应用的读取,而这些信息也只能在安装时才能确定,比如安装用户选择 ...

  8. ASP.NET 4.5.256 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.5.256 in order for your site to run correctly

    Microsoft .NET Framework 4.6安装后,用户可能会在使用Microsoft Visual Studio 创建(或打开现有项目时)网站.或Windows Azure项目时遇到下面 ...

  9. linux awk 一看就懂

    awk是什么 awk是linux环境下的一个命令行工具,但是由于awk强大的能力,我们可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,我们可以称其为Awk语言,而awk工具本身则 ...

  10. HTTP基本认证

    众所周知,Web使人们可以很方便的访问分布在世界各个角落里信息.但是仅仅是方便还是不够的,并不是所有的信息都适合在互联网上公开访问,我们需要保证只有特定的人才能看到我们的敏感信息并且执行特定的操作. ...