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描述相同,这里不做解释。

批处理篇

批处理可以查看此博客:https://cloud.tencent.com/developer/article/1014023

事务篇

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

thymeleaf中th:attr用法以及相关的thymeleaf基本表达式

${}变量表达式:用于访问容器上下文环境中的变量; *{}选择表达式:选择表达式与变量表达式有一个重要的区别:选择表达式显示的是选定的对象。选择的对象是一个:t...

631
来自专栏博客园

MSIL学习------从HelloWorld开始

  前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作...

943
来自专栏白驹过隙

Redis - list类型操作

34012
来自专栏web前端教室

[先行者周日课程-0305] web前端组件 之 拖动窗口

学习笔记如下: 今天的内容,是拖动窗口。 js的引用数据类型,基本数据类型。 js它有5种基本数据类型: undefined , null, Boolean,...

1858
来自专栏狮乐园

高级 Angular 组件模式 (4)

命名冲突不仅存在于指令的选择器之间,同时也会存在于指令的Inputs和Outputs属性,当这些属性名一样时,Angular并不会进行提示,它会按原本的逻辑正常...

921
来自专栏BinarySec

ISCC中pwn200 shell无法启动原因详解

0x00 背景 一朋友问到在pwn中,gdb调试看到了systemm("/bin/sh")了,但是shell确无法启动。于是我详细看了一下这个题目,发现自己的e...

4205
来自专栏青玉伏案

ReactiveSwift源码解析(一) Event与Observer代码实现

ReactiveCocoa这个框架是做什么用的本篇博客就不做过多赘述了,什么是“响应式编程”也不多聊了,自行Google吧。本篇博客的主题是解析Reactive...

20510
来自专栏我是攻城师

Apache Pig和Solr问题笔记(一)

3386
来自专栏Golang语言社区

Golang语言--【社区推荐阅读】 fmt用法

fmt 包中的函数和方法 // format.go -------------------------------------------------- /...

34011
来自专栏web前端教室

大白话-prototype属性

今天来聊聊javascript的prototype, ==========先说结论========= --它是什么呢? 它是一个属性。 --谁的属性? 函数的...

1889

扫码关注云+社区