APEX 教程:Apex 编程课程和编码示例
Salesforce 中的 Apex 是什么?
顶点 是 Salesforce 开发的一种面向对象、强类型的编程语言,用于构建软件即服务 (SaaS) 和客户关系管理 (CRM)。Apex 通过提供后端数据库支持和客户端-服务器接口,帮助开发人员创建第三方 SaaS 应用程序并将业务逻辑添加到系统事件中。
Apex 帮助开发人员向系统事件(如按钮点击、相关记录更新和 Visualforce 页面)添加业务逻辑。Apex 的语法类似于 Java. 注册 Salesforce 了解 CRM 的工作原理
Apex编程语言的特点
以下是 Salesforce Apex 的重要功能:
- Apex 是一种不区分大小写的语言。
- 您可以使用 apex 对 sObject 记录执行 DML 操作,例如 INSERT、UPDATE、UPSERT、DELETE。
- 您可以在 apex 中使用 SOQL(salesforce 对象查询语言)和 SOSL(salesforce 对象搜索语言)查询 sObject 记录。
- 允许您创建一个 单元测试 并执行它们来验证 代码覆盖率 以及 Apex 中代码的效率。
- Apex 在多租户环境中执行,并且 Salesforce 已定义一些管理器限制,阻止用户控制共享资源。任何超出 salesforce 管理器限制的代码都会失败,并显示错误。
- Salesforce 对象可用作 Apex 中的数据类型。例如 –
Account acc = new Account();
,这里的帐户是一个标准的销售人员对象。
- Apex 会随着 Salesforce 的每次发布而自动升级。
开发人员何时应选择 Apex
仅当业务场景过于复杂且无法使用 Salesforce 提供的预构建功能实现时,才应编写 Apex 代码。
以下是我们需要编写 Apex 代码的几个场景:
- 创建将 Salesforce 与其他应用程序集成的 Web 服务。
- 对 sobjects 实现自定义验证。
- 当执行 DML 操作时执行自定义 apex 逻辑。
- 实现使用现有工作流和流程构建器功能无法实现的功能。
- 建立 电邮服务,您需要使用 Apex 代码处理电子邮件的内容、标题和附件。
Apex 的工作结构
现在,在本 Apex 教程中,我们将了解 Apex 的工作结构:
以下是 Apex 代码的操作流程:
- 开发人员操作:开发人员编写的所有 Apex 代码都会被编译成一组指令,当开发人员将代码保存到平台时,Apex 运行时解释器可以理解这些指令,然后这些指令作为元数据保存到平台。
- 最终用户操作:当用户事件执行 Apex 代码时,平台服务器从元数据中获取编译后的指令,并通过 Apex 解释器运行它们,然后返回结果。
Apex 语法
变量声明
由于 apex 是强类型语言,因此必须在 apex 中声明具有数据类型的变量。
例如:
contact con = new contact();
这里变量 con 被声明为具有 contact 的数据类型。
SOQL 查询
SOQL 代表 salesforce 对象查询语言。SOQL 用于从 Salesforce 数据库获取 sObject 记录。例如:
Account acc = [select id, name from Account Limit 1];
上述查询从 salesforce 数据库获取帐户记录。
循环语句
循环语句用于迭代列表中的记录。迭代次数等于列表中的记录数。例如:
list<Account>listOfAccounts = [select id, name from account limit 100]; // iteration over the list of accounts for(Account acc : listOfAccounts){ //your logic }
在上面的代码片段中,listOfAccounts 是列表数据类型的变量。
流程控制语句
当您想根据某些条件执行某些代码行时,流控制语句很有用。
例如:
list<Account>listOfAccounts = [select id, name from account limit 100]; // execute the logic if the size of the account list is greater than zero if(listOfAccounts.size() >0){ //your logic }
上面的代码片段是从数据库查询帐户记录并检查列表大小。
DML 语句
DML 代表数据操作语言。DML 语句用于操作 Salesforce 数据库中的数据。例如 -
Account acc = new Account(Name = ‘ Test Account’); Insert acc; //DML statement to create account record.
Apex 开发环境
现在,在本 Apex 编程教程中,我们将了解 Apex 开发环境:
Apex 代码可以在 Salesforce 的沙盒和开发者版本中开发。
在沙盒环境中开发代码然后将其部署到生产环境是一种最佳实践。
Apex 代码开发工具:以下是在 Salesforce 所有版本中可用于开发 Apex 代码的三种工具。
- Force.com 开发者控制台
- Force.com IDE
- Salesforce 用户界面中的代码编辑器
Apex 中的数据类型
以下是 apex 支持的数据类型:
原始
整数, Double、Long、Date、Date Time、String、ID 和 Boolean 被视为原始数据类型。所有原始数据类型都通过值传递,而不是通过引用传递。
系列
Apex 中有三种类型的收集
- 列表:它是基于索引的原始数据、sObject、集合或Apex对象的有序集合。
- 集合:唯一原始元素的无序集合。
- 映射:它是唯一的、原始键的集合,这些键映射到可以是原始值、sObjects、集合或 Apex 对象的单个值。
对象
这是 Salesforce 中一种特殊的数据类型。它类似于 SQL 并包含与 SQL 中的列类似的字段。
枚举
枚举是一种抽象数据类型,用于存储一组有限的指定标识符中的一个值
精品团课
对象
它指的是 Apex 支持的任何数据类型。
接口
Apex 访问说明符
以下是 apex 支持的访问说明符:
公共
此访问说明符允许访问命名空间内的 apex 使用的类、方法和变量。
私做
此访问说明符允许访问本地或定义代码段内的类、方法、变量。所有未定义任何访问说明符的技术、变量都具有默认访问说明符 private。
保护
此访问说明符允许访问定义 Apex 类中的任何内部类所使用的方法和变量。
全球
此访问说明符允许 apex 在命名空间内以及命名空间外访问类、方法、变量。最佳做法是,除非必要,否则不要使用全局关键字。
Apex 中的关键字
通过分享
如果使用此关键字定义一个类,则强制执行适用于当前用户的所有共享规则,如果不存在此关键字,则代码在系统上下文中执行。
对于实施例:
public with sharing class MyApexClass{ // sharing rules enforced when code in this class execute }
无需共享
如果使用此关键字定义一个类,则不会强制执行适用于当前用户的所有共享规则。
对于实施例:
public without sharing class MyApexClass{ // sharing rules is not enforced when code in this class execute }
静止
用 static 关键字定义的变量和方法只需初始化一次即可与类关联。静态变量和方法可以直接通过类名调用,而无需创建类的实例。
最终的
常量、用 final 关键字定义的方法是不能被覆盖的。例如:
public class myCls { static final Integer INT_CONST = 10; }
如果您尝试覆盖此 INT_CONST 变量的值,那么您将收到一个异常 - System.FinalException:Final 变量已被初始化。
回程
此关键字从方法返回一个值。例如:
public String getName() { return 'Test' ; }
空
它定义了一个空常量,可以赋值给一个变量。例如
Boolean b = null;
虚拟
如果使用 virtual 关键字定义类,则可以扩展和覆盖该类。
抽象
如果一个类用abstract关键字定义,它必须至少包含一个带有关键字abstract的方法,并且该方法应该只有一个签名。
举个例子
public abstract class MyAbstrtactClass { abstract Integer myAbstractMethod1(); }
Apex 字符串
字符串是一组没有字符限制的字符。例如:
String name = 'Test';
salesforce 中的 String 类提供了几种内置方法。以下是一些最常用和最常用的函数:
缩写(最大宽度)
如果给定字符串的长度大于指定长度,则此方法将字符串截断为指定长度并返回;否则,返回原始字符串。如果 maxWidth 变量的值小于 4,则此方法返回运行时异常 – System.StringException:最小缩写宽度为 4
例如:
String s = 'Hello World'; String s2 = s.abbreviate(8); System.debug('s2'+s2); //Hello...
大写()
此方法将字符串的首字母转换为标题大小写并返回。
例如:
String s = 'hello; String s2 = s.capitalize(); System.assertEquals('Hello', s2);
包含(子字符串)
如果调用该方法的字符串包含指定的子字符串,则此方法返回 true。
String name1 = 'test1'; String name2 = 'test2'; Boolean flag = name.contains(name2); System.debug('flag::',+flag); //true
等于(stringOrId)
如果传递的参数不为空并且指示与调用该方法的字符串相同的二进制字符序列,则此方法返回 true。
比较 Id 值时,ID 的长度可能不相等。例如:如果将表示 15 个字符 ID 的字符串与表示 18 个字符 ID 的对象进行比较,则此方法返回 true。例如:
Id idValue15 = '001D000000Ju1zH'; Id idValue18 = '001D000000Ju1zHIAR'; Boolean result4 = stringValue15.equals(IdValue18); System.debug('result4', +result4); //true
在上面的例子中,equals 方法将 15 个字符的对象 Id 与 18 个字符的对象 Id 进行比较,如果这两个 id 代表相同的二进制序列,它将返回 true。
使用此方法进行区分大小写的比较。
escapeSingleQuotes(stringToEscape)
此方法在字符串中的任何单引号前添加转义符 (\) 并返回它。此方法可在创建动态 SOQL 查询时防止 SOQL 注入。此方法可确保所有单引号都被视为封闭字符串,而不是数据库命令。
例如:
String s = 'Hello Tom'; system.debug(s); // Outputs 'Hello Tom' String escapedStr = String.escapeSingleQuotes(s); // Outputs \'Hello Tom\'
删除(子字符串)
此方法从调用该方法的字符串中删除所有出现的提到的子字符串并返回结果字符串。
举个例子
String s1 = 'Salesforce and force.com'; String s2 = s1.remove('force'); System.debug( 's2'+ s2);// 'Sales and .com'
子字符串(起始索引)
该方法返回从 startIndex 处的字符开始延伸到字符串最后一个的子字符串。
对于实施例:
String s1 = 'hamburger'; String s2 = s1.substring(3); System.debug('s2'+s2); //burger
撤销()
此方法反转字符串的所有字符并返回。例如:
String s = 'Hello'; String s2 = s.reverse(); System.debug('s2::::'+s2);// olleH // Hello
trim():此方法从字符串中删除所有前导空格并返回它。
值(要转换)
此方法返回传入对象的字符串表示形式。
Apex 调控器限制
Apex 调控器限制是 Apex 运行时引擎强制执行的限制,以确保任何运行 Apex 代码和流程不会控制共享资源,也不会违反多租户环境中其他用户的处理。这些限制针对每个 Apex 事务进行验证。以下是 salesforce 在每个 Apex 事务上定义的调控器限制:
描述 | 限制 |
---|---|
可以在同步事务中完成的 SOQL 查询 | 100 |
可以在异步事务中完成的 SOQL 查询 | 200 |
可以通过 SOQL 查询检索的记录 | 50000 |
可以通过 Database.getQueryLocator 检索的记录 | 10000 |
可以在顶级事务中完成的 SOSL 查询 | 20 |
可以通过 SOSL 查询检索的记录 | 2000 |
可以在 apex 事务中执行的 DML 语句 | 150 |
可以通过 DML 语句、Approval.process 或 database.emptyRecycleBin 处理的记录 | 10000 |
可以在顶点事务中完成的标注。 | 100 |
在顶点事务中执行的所有调用的累计超时限制 | 120秒 |
使用 System.enqueueJob 可以添加到队列的 Apex 作业的限制 | 50 |
每笔 Apex 交易的执行时间限制 | 10分钟 |
可在 Apex 类和触发器中使用的字符限制 | 1千万 |
同步事务的 CPU 时间限制 | 10,000毫秒 |
异步事务的CPU时间限制 | 60,000毫秒 |
Apex Getter 和 Setter
Apex 属性与 apex 变量类似。对于 apex 属性,getter 和 setter 必不可少。getter 和 setter 可用于在访问或更改属性值之前执行代码。get 访问器中的代码在读取属性值时执行。set 访问器中的代码在更改属性值时运行。任何具有 get 访问器的属性都被视为只读,任何具有 set 访问器的属性都被视为只写,任何同时具有 get 和 set 访问器的属性都被视为可读写。apex 属性的语法:
public class myApexClass { // Property declaration access_modifierreturn_typeproperty_name { get { //code } set{ //code } }
这里,access_modifier 是属性的访问修饰符。return_type 是属性的数据类型。property_name 是属性的名称。
下面是具有 get 和 set 访问器的 apex 属性的示例。
public class myApex{ public String name{ get{ return name;} set{ name = 'Test';} } }
这里,属性名称是name,它是公共属性,它返回一个字符串数据类型。
在 get 和 set 块中不一定要包含一些代码。这些块可以留空以定义自动属性。例如:
public double MyReadWriteProp{ get; set; }
Get 和 set 访问器也可以用其访问修饰符来定义。如果访问器用修饰符定义,则它将覆盖属性的访问修饰符。例如:
public String name{private get; set;}// name is private for read and public to write.
巅峰级
顶点类是创建对象的蓝图或模板。对象是类的实例。
在 Salesforce 中创建 Apex 类有三种方法:
开发者控制台
Force.com IDE
Apex 课程详细信息页面。
在 apex 中,你可以定义一个外部类(也称为顶级类),也可以在外部类中定义类(称为内部类)。
在外部类的声明中必须使用访问修饰符,如 global 或 public。
在内部类的声明中不需要使用访问修饰符。
使用 class 关键字后跟类名来定义 apex 类。
Extends 关键字用于通过 apex 类扩展现有类,implements 关键字用于通过 apex 类实现接口。
Salesforce Apex 不支持多重继承,一个 apex 类只能扩展一个现有的 apex 类,但可以实现多个接口。
顶点类可以包含用户定义的构造函数,如果没有用户定义的构造函数,则使用默认构造函数。构造函数中的代码在创建类的实例时执行。
Apex 类示例的语法:
public class myApexClass{ // variable declaration //constructor public myApexClass{ } //methods declaration }
new 关键字用于创建 apex 类的实例。以下是创建 apex 类实例的语法。
myApexClass obj = new myApexClass();
顶点触发器
Apex 触发器使您能够在执行 DML 操作之前和之后执行自定义 apex。
Apex 支持以下两种类型的触发器:
触发器之前:这些触发器用于在记录保存到数据库之前验证和更新字段的值。
后触发器:这些触发器用于访问系统在将记录提交到数据库后设置的字段(记录 ID、LastModifiedDate 字段)。这些字段值可用于修改其他记录。触发器后触发的记录是只读的。
编写大型触发器是一种最佳实践。大型触发器可以一次处理单个记录,也可以同时处理多个记录。
顶点触发器的语法:
trigger TriggerName on ObjectName (trigger_events) { //Code_block }
这里,TriggerName 是触发器的名称,ObjectName 是要写入触发器的对象的名称,trigger_events 是用逗号分隔的事件列表。
以下是 apex 触发器支持的事件:插入前、更新前、删除前、插入后、更新后、删除后、取消删除后。
静态关键字不能在 Apex 触发器中使用。所有适用于内部类的关键字都可以在 Apex 触发器中使用。
每个返回运行时上下文的触发器都定义了隐式变量。这些变量在系统中定义。触发器类。这些变量称为上下文变量。下面的屏幕截图显示了 apex 触发器支持的上下文变量。
以下是对 apex 触发器中的上下文变量的考虑:
- 不要在DML操作中使用trigger.new和trigger.old。
- Trigger.new 无法被删除。
- Trigger.new 是只读的。
- Trigger.new 仅可用于在触发器之前更改同一对象上字段的值。
下面的截图列出了不同触发事件中具体操作的注意事项。
Apex 中的批次类
salesforce 中的批处理类用于处理大量记录,如果正常处理,这些记录将超出 Apex 管理器限制。批处理类异步执行代码。
以下是批次类的优点:
- 批处理类以块的形式处理数据,如果某个块未能成功处理,则所有成功处理的块都不会回滚。
- 批处理类中的每个数据块都使用一组新的调节器限制进行处理,以确保代码在调节器执行限制内执行。
- 数据库。要用作批处理类,必须由 Apex 类实现 Batchable 接口。它提供了批处理类必须实现的三种方法。
以下是Database.Batchable接口提供的三种方法:
1.开始()
此方法生成接口方法 execute 所要处理的记录或对象的范围。在批处理执行期间,它仅被调用一次。此方法要么返回 Database.QueryLocator 对象,要么返回 Iterable。使用 Database.QueryLocator 对象通过 SQL 查询检索的记录数为 50 万条记录,但使用 iterable,SQL 查询可以检索的记录总数仅为 50000 条。Iterable 用于为批处理类生成复杂范围。
start方法的语法:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {}
2.执行()
此方法用于处理每个数据块。对于每个记录块,都会调用 execute 方法。执行的默认批处理大小为 200 条记录。Execute 方法有两个参数:
对 Database.BatchableContext 对象的引用,
sObject 列表,例如 List或参数化类型的列表。execute 方法的语法:
global void execute(Database.BatchableContext BC, list<P>){}
3.完成()
在批处理类执行期间,finish 方法被调用一次。可以在 finish 方法中执行后处理操作。例如:发送确认电子邮件。当所有批处理都处理完毕时,将调用此方法。Finish 方法的语法:
global void finish(Database.BatchableContext BC){}
Database.BatchableContext 对象
Database.Batchable 接口的每个方法都引用 Database.BatchableContext 对象。
该对象用于跟踪批处理作业的进度。
以下是 BatchableContext 提供的实例方法:
- getChildJobId():此方法返回当前正在处理的批处理作业的ID。
- getJobId():此方法返回批处理作业的ID。
以下是批次类的语法:
global class MyBatchClass implements Database.Batchable<sObject> { global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) { // collect the batches of records or objects to be passed to execute } global void execute(Database.BatchableContextbc, List<P> records){ // process each batch of records } global void finish(Database.BatchableContextbc){ // execute any post-processing operations } }
Database.executeBatch 方法
Database.executeBatch 方法用于执行批处理类。
此方法采用两个参数:要处理的批次类的实例,Options 参数用于指定批次大小(如果未指定,则采用默认大小 200)。
Database.executeBatch 的语法:
Database.executeBatch(myBatchObject,scope)
执行批次类名 MyBatchClass :
MyBatchClassmyBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject,100);
数据库.stateful
Batch 类默认是无状态的。每次调用 execute 方法时都会收到一个对象的新副本,并初始化该类的所有变量。
Database.stateful 的实现是为了使批次类具有状态。
如果您的批次类实现了 数据库 ,有状态接口的所有实例变量都保留其值,但静态变量在事务之间被重置。
总结
- Apex 是一种强类型、面向对象的 编程语言 在 force.com 平台上编译并运行
- Apex 编程语言是一种不区分大小写的语言
- Apex 中的两种操作流程是 1) 开发人员操作 2) 最终用户操作
- Apex 帮助您创建将 Salesforce 与其他应用程序集成的 Web 服务。
- apex 支持的数据类型有:1)原始 2)集合 3)sObject、枚举、4)类、5)对象和接口
- Apex 指定支持 Public、Private、Protected 和 Global
- Apex 中使用的关键字有:1) 共享,2) 不共享,3) 静态,4) Final,5) 返回,6) 空,7) 虚拟,8) 抽象
- 字符串是一组没有字符限制的字符
- Apex 调控器限制是 Apex 运行时引擎强制执行的限制,以确保任何 Runway Apex 代码和流程
- Getter 和 setter 可用于在访问或更改属性值之前执行代码
- 在 Salesforce 中创建 Apex 类有三种方法:1) 开发人员控制台 2) Force.com IDE 和 3) Apex 类详细信息页面。
- Apex 触发器使您能够在执行 DML 操作之前和之后执行自定义 apex。
- salesforce 中的批次类用于处理大量记录,如果正常处理,这些记录将超出顶点管理器限制。