Apex基本知识
认识Lightig平台API
Lighting App Builder和Process Builder这些工具需要与Salesforce底层的工具进行的交互非常少
组织中每个对象都有一个API的名称。让你可以访问该对象的数据
通过HeroKu释放应用程序的巨大压力
虽然API既可以在Salesforce中使用,也可以在外部系统进行使用,但HeroKu的主要作用就是与外界进行交互。HeroKu是一个web开发平台。可以让你快速构建、部署和扩展web应用程序
HeroKu的一大特点是可以让你在编写应用程序的过程具有更大的灵活性
HeroKu建立在AWS之上。HeroKu Connect 可以将Salesforce数据与postGres进行统一。这样无需对跨平台移动进行管理
Apex入门教程
Apex是什么
Apex是一种编程语言,它具有类似于java的语法。其用法与数据库存储过程类型。Apex允许开发人员将业务逻辑添加到系统事件中。例如按钮的点击相关记录更新以及Visualforce页面等
Apex语言的特点
作为一种编程语言Apex具有以下特点:
- 可托管----Apex在Lighting平台服务器上保存、编译和执行
- 面向对象----Apex支持类、接口和继承
- 强类型----Apex会在编译过程中验证对对象的引用
- 多租户防范----由于Apex在多租户平台上运行。因此实施限制来严密防范代码失控。防止代码独占共享资源
- 与数据库集成----直接访问并操作记录,Apex可以直接访问记录及其字段,并提供操作这些记录的语句和查询语句
- 数据集中----Apex支持数据的事务性访问,允许回滚操作
- 使用简单----Apex基于熟悉的java习惯用语
- 测试方便----Apexa为单元测试的创建、执行和代码覆盖提供内置支持Salesforce确保所有自定义Apex代码在任何平台升级之前通过所有执行单元测试按照预期来运行
- 版本控制----针对不同版本的API保存自定义Apex代码
Apex语言的亮点
与其他编程语言一样Apex支持以下语言结构:
- 类、接口、属性和集合
- 对象和数组符号
- 表达式、变量和常量
- 条件语句、控制语句
不同于其他面向对象编程语言。Apex还支持以下特性
- 云开发,即Apex在云上存储、编译和执行
- 触发器,类似于数据库系统中的触发器
- 数据库语句,允许直接调用数据库和查询语言以便查询和搜索数据
- 事务和回滚
- Global访问修饰符,比public访问修饰符更宽松,允许在命名空间和应用程序之间访问
- 注意: Apex语言不区分大小写
开发工具
您可以使用 Salesforce Extensions for Visual Studio Code 在您的客户端电脑上编写和调试 Apex。请参见 Salesforce Visual Studio Code Extensions(Salesforce Visual Studio 代码扩展)。
您还可以直接在浏览器中使用 Salesforce 的用户界面编写 Apex 并访问调试信息。在您的名字或快速访问菜单 (设置齿轮图标) 下打开 Developer Console。
数据类型概览
Apex支持多种数据类型,包括Salesforce独有的数据类型。sObject
Apex支持以下数据类型:
-
基元,例如:Integer、Double、Long、Date、DateTime、String、ID、Boolean等
-
sObject,包含泛型sObject和特定sObject。例如客户、联系人等
-
集合,包括:
基元、sObject、用户自定义对象、从Apex类创建的对象或集合的列表 一组基元 从基元到基元,sObject到集合的映射
-
类型化的值列表。也称为枚举
-
用户自定义的Apex类
-
系统提供的Apex类
Apex集合:List
List保存的是有序的对象集合,Apex中的List和数组是同义的。两者可以交换使用
以下两个声明是等效的
List<String> colors = new List<String>();
String[] colors = new List<String>();
为List类型添加元素
//创建时添加元素
List<String> colors = new List<String>{'red','blue','green'};
//创建后添加元素
List<String> colors = new List<String>();
colors.add('red');
colors.add('blue');
List中的元素可以在一对方括号中指定索引来读取,就像数组元素一样。同样也可以通过get方法来获取list元素
String color1 = colors[0];
String color2 = colors.get(0);
Apex类
Apex类的优点之一是代码的复用性。类中的方法能被触发器或其他类调用
保存Apex类
在组织中保存 EmailManager类
- 在设置下 打开Developer Console
- 在Developer Console中,单击File(文件) ->new ->Apex Class.输入EmailManager类。单击确定
- 用EmailManager类示例替换类正文
EmailManager类有一个公共方法SendMail用于发送电子邮件并使用Apex类库的内置消息传递方法。这个类还有一种私有辅助方法inspectResult由于私有的性质,仅允许在类中使用,不支持外部调用。此辅助方法用于检查电子邮件发送调用的结果,并通过SendMail发起调用
public class EmailManager {
// Public method
public void sendMail(String address, String subject, String body) {
// Create an email message object
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {address};
mail.setToAddresses(roAddresses);
mail.setSubject(subject);
mail.setPlainTextBody(body);
// Pass this email message to the built-in sendEmail method
// of the Messaging class
Messaging.SendEmailResult[] results = Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
inspectResults(results);
// Call a helper method to inspect the returned results
}
// Helper method
private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
Boolean sendResult = true;
// sendEmail returns an array of result objects.
// Iterate through the list to inspect results.
// In this class, the methods send only one email,
// so we should have only one result.
for (Messaging.SendEmailResult res : results) {
if (res.isSuccess()) {
System.debug('Email sent successfully');
}
else {
sendResult = false;
System.debug('The following errors occurred: ' + res.getErrors());
}
}
return sendResult;
}
}
- 单击File ->Save保存类
调用方法发送电子邮件
将使用匿名Apex来执行此操作。匿名Apex允许你动态运行代码。是调用Apex一种简单的方法。尤其适用于功能测试。也会生成调试日志结果
- 在Developer Console 中单击Debug -> Open Execute Anonymous Window(打开执行匿名窗口)
- 在打开的窗口中输入以下内容,将your email address替换为自己的电子邮件
EmailManager em = new EmailManager();
em.sendMail('your email address','Trailhead Tutorial','123Body');
- 点击execute.该方法执行,你将能收到一封电子邮件
调用静态方法
由于类中的sendMail方法没有访问类中的成员变量,因此不需要使用实例方法。现在我们将这个方法改为静态方法。即在方法声明中添加static关键字。静态方法的调用比实例方法更简单。它不需要在类的实例上调用,而是直接通过类名调用
- 在 Developer Console 中,找到 EmailManager 类的打开选项卡,将 sendMail() 方法定义的第一行修改为以下内容(唯一的变化是添加了 static 关键字。
public static void sendMail(String address, String subject, String body) {
- 单击 File(文件)| Save(保存)保存您的类。
- 修改 Execute Anonymous(执行匿名) 窗口中的语句以调用类名上的静态方法
EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
使用sObject
Apex与数据库紧密集成。可以直接从Apex访问Salesforce记录及其字段。Salesforce每条记录在Apex中代表一个原生sObject
每条Salesforce记录在插入Salesforce之前,都表示为一个sObject。同样,当从Salesforce检索持久化记录时,这些记录将存储在sObject变量中。
如果你在组织中添加了自定义对象。请使用Apex中自定义对象的API名称,例如,名为 Merchandise 的自定义对象对应于 Apex 中的 Merchandise__c sObject。
创建sObject变量
要创建sObject变量。需要声明一个变量并为其分配一个sObject实例,变量的数据类型是sObject类型
以下示例创建了类型为 Account、名称为 Acme 的 sObject 并将其分配给了 acct 变量。
Account acct = new Account(Name='Acme');
sObject字段和名称
Apex引用标准或自定义sObject,字段用他们的唯一API名称
对象和字段的API名称可以不同于其标签名称。例如:员工字段的标签名称为Employees,在客户记录页面上显示为Employees。但其API名称为numberOfEmployees。要在Apex中访问该字段。需要使用该字段的API名称
以下是自定义对象和自定义字段的API名称使用规则重点:
对于自定义对象和自定义字段,API名称始终以 __c后缀结尾,对于自定义关系字段,API后缀以__r后缀结尾。此外。标签中的空格替换为名称中的下划线。例如,自定义字段名称 Employee Seniority 的 API 名称为 Employee_Seniority__c。
创建sObject并添加字段
在插入Salesforce之前必须先创建一个sObject,与其他对象一样sObject也是通过new 运算符创建的
Account acct = new Account();
API对象名称成为Apex中sObject变量的数据类型,该实例中,客户是acct变量的数据类型
acct变量引用的客户为空,因为还没有为其填充任何字段。添加字段的方式有两种方法,通过构造方法和使用点记法
添加字段的快捷方法是在构造器中将他们指定为名称-值对。例如此语句创建了一个新客户sObject,并使用字符串值填充名字字段
Account acct = new Account(Name = 'Acme');
名字字段是客户唯一必填字段,因此必须先填充该字段,然后才能插入新纪录。也可以为新纪录填充其他字段
Account acct = new Account(Name = 'Acme', Phone = '(415)555-1212', NumberOfEmployees = 100);
也可以使用点记法为客户添加字段
Account acct = new Account();
acct.Name = 'Acme';
acct.Phone = '(415)555-1212';
acct.NumberOfEmployees = 100;
处理泛型sObject数据类型
通常在处理sObject数据类型时,你使用的是指定的sObject数据类型,例如客户用于标准对象或Book__c用于书本的自定义对象。然而当你不知道正在处理的sObject变量类型时。可以使用泛型sObject数据类型
使用泛型sObject数据类型声明的变量可以引用任意Salesforce记录。无论是标准对象记录还是自定义对象记录
以下代码显示如何将任意Salesforce对象分配给泛型sObject变量
sObject object1 = new Account(Name = 'ABC');
sObject object2 = new Book__c(Name = 'book 1');
相反,使用特定sObject数据类型声明的变量只能引用相同类型的Salesforce记录
将泛型sObject类型转换为特定的sObject类型
在处理泛型sObject数据类型时,有时需要将sObject变量转换为特定的sObject类型。由于sObject是所有特定sObject的父类型。因此可以将泛型sObject转换为特定的sObject
此例展示了如何将泛型转为特定的sObject
Account acct = (Account)myGenericSObject;
String name = acct.Name;
String phone = acct.Phone;
只能通过put()和get()方法访问泛型sObject字段