Apex 开发入门指南
Apex 是 Salesforce 平台上的第一款多租户、按需运行的编程语言。本指南全面介绍 Apex 的核心概念:八大语言特征(集成性、易用性、数据聚焦、严谨性、托管性、多租户感知、易于测试、版本化)、变量与表达式、语句与代码块、集合(List/Set/Map)、分支与循环,以及何时使用 Apex、Apex 的执行模型和云端开发的 Governor Limits 限制。
本课程共有 28 个章节
同学们好,欢迎开启Apex开发之旅!今天这节课呢,是咱们整个Apex教程的第一章,算是个入门引子,带大家初识一下这门语言。我会尽量用大白话把重点讲清楚,听起来不费劲。 首先,Apex是什么呢?它是Salesforce平台上独有的一种编程语言。记住几个关键词:第一,它是“多租户”的,也就是说同一个程序要同时服务很多客户,而且大家的数据互不干扰,天然安全;第二,它是“按需”的,代码完全在Salesforce的云端服务器上跑,不需要你自己搭环境。说白了,Apex就是专门为了在Salesforce里搭建业务应用而设计的,所有处理都发生在云端。 接下来,咱们会慢慢展开,看看Apex究竟是一门什么样的语言。它有八个核心设计特征,这些特征是它和Java之类语言不太一样的地方,比如强类型、自动DML操作、内置测试等,后面会细讲。然后呢,我们还得把编程基本功过一遍,像变量、语句、集合(List、Map这些)、分支判断(if-else)、循环(for、while)等等,这些写代码谁都绕不开。 但是光会写还不够,你还要知道什么时候该用Apex。Salesforce里有很多开发工具,比如流程生成器、验证规则,Apex是用来解决那些复杂逻辑的,不能随便滥用。我们会讨论它的适用场景。 再往后,咱们得搞懂Apex到底是怎么运行的。你写出来的代码要经过编译成中间指令,然后在服务器上解释执行,这背后有一整套机制。特别重要的是,在云端编程,你得时刻记着“控制器限制”(也就是大名鼎鼎的Governor Limits)。因为是多租户共享资源,系统会严格限制你一次执行能用多少CPU时间、查多少次数据库,写代码必须精打细算。还有批量处理模式,怎么高效地一次处理很多条记录,这些实战经验都会教给大家。 好了,这就是咱们这一讲的总览。准备好,咱们就开始一步步深入Apex的世界吧!
同学们,欢迎来到Apex的第一课! 今天我们来揭开Apex的神秘面纱。你可以把它想象成Salesforce平台专属的编程语言,专门用来在云端打造强大的业务应用。 首先,我们会走一遍Apex开发的完整生命周期——从写代码、测试,到最终部署到正式环境。跟着我一步步做,你就能创建出自己的第一个Apex类和触发器,亲手把它们送上“生产环境”的舞台。 Apex可不是普通的语言,它是全球第一款多租户、按需运行的编程语言。这意味着什么?就是所有客户共享同一套底层架构,却互不干扰,而且你只要连上网就能随时开发。 它的出现,彻底改变了大家开发现代商业应用的方式。 在接下来的课程里,我们会聊清楚这几个重点: 第一,Apex到底是什么,它跟其他语言有什么不一样; 第二,它的核心概念,让你打下扎实基础; 第三,什么场景下该用Apex,而不是其他工具; 第四,它到底怎么运行的,背后有什么机制; 最后,你如何在云端直接编写和管理代码。 听起来很丰富吧?别担心,我会带你一个一个弄明白。准备好了吗?我们就从Apex的定义开始,轻松上路。
同学们,今天我们来聊聊Apex。你可以把Apex理解成Salesforce平台自己的编程语言,它专门运行在Salesforce的服务器上。 Apex有两个很重要的特点:第一,它是强类型的。意思就是,你写代码时,每个变量的类型必须明确,不能乱来,这样可以帮我们提前发现很多错误。第二,它是面向对象的,支持类和对象这些概念,结构清晰,容易维护。 语法上,Apex长得和Java特别像,写起来又有点像是数据库里的存储过程。所以有Java基础的同学上手会非常快。我们用Apex,就是为了把复杂的业务逻辑,嵌入到系统事件里。比如,用户点了一个按钮、更新了某条记录,或者访问一个Visualforce页面,这些时候都可以自动触发我们写好的Apex代码去执行。 Apex代码的启动方式也很灵活。除了前面说的界面操作,它还可以被Web服务请求触发,也可以写在对象的触发器里,当数据发生变化时自动执行。 另外,虽然Salesforce本身提供了很多点击就能完成的配置,但如果你想从外部的客户端程序,比如你自己写的后台系统,去操作Salesforce里的数据,那就可以用SOAP API来调用Apex代码,实现远程的数据操作。 简单总结一下,Apex就是Salesforce平台的编程利器,让我们可以在服务器端实现各种自动化的、安全的业务逻辑。好了,这节课关于Apex的初步介绍就到这里。
同学们,大家好,今天我们来聊聊 Salesforce 平台里非常重要的一门编程语言——Apex。 你可以把 Apex 想象成 Salesforce 的“大脑指令”,它是一门强类型、面向对象的语言。什么是强类型呢?简单说,就是你在写代码时,每个变量是什么类型必须很明确,这样可以避免很多低级错误。而面向对象,意味着我们可以用类、对象这些概念,让代码结构清晰、容易维护。 如果你以前接触过 Java,会发现 Apex 的语法和它长得很像;同时,它的工作方式又有点像数据库里的存储过程,专门用来处理复杂的数据逻辑。Apex 最厉害的地方,就是能把你的业务规则灵活地植入到系统的各种事件里。比如用户点击一个按钮、修改了一条客户记录,或者打开一个 Visualforce 页面,这些时刻都能触发你写好的 Apex 代码,自动执行背后的业务逻辑。 那这些代码是怎么被启动的呢?通常有两种方式:一种是通过外部的 Web 服务请求调过来,另一种是绑定在 Salesforce 对象上的“触发器”,一旦数据有变动,触发器就会唤醒对应的 Apex 逻辑。而且,Apex 代码并不是跑在你自己的电脑上,而是完全在 Lightning 平台上按需运行,也就是一切都发生在 Salesforce 的云端,这个云端是一个多租户环境,意味着所有客户安全地共享同一套底层设施。 正因为它生在这个平台、长在这个平台,Apex 被精心设计成特别擅长和 Salesforce 数据打交道,无论是查询、修改还是批量处理数据,它都能高效胜任。好了,这节课我们先对 Apex 有一个整体认识,后面我们再慢慢深入它的语法和用法。
好,我们接下来看看Apex这门语言,它之所以在Salesforce平台上这么特别,是因为它身上带着一些非常鲜明的标签,也就是它的语言特性。我们来一个一个了解一下。 第一个是,集成性,。你可以把Apex想象成是Salesforce平台的原住民,它和平台是无缝连接在一起的。你在代码里可以直接使用像客户、联系人、机会这些标准对象,就像用自己定义好的变量一样自然。而且平台上的按钮、触发器、流程都可以轻松调用Apex代码,这种深度绑定是它最大的优势。 第二个特点是,易于使用,。如果你之前接触过Java或者C#,那看到Apex会觉得非常亲切,它的语法结构很类似。而且开发环境全部在云端,Salesforce给你提供了现成的编辑器,上手门槛很低,即使你是一个业务管理员,学习一段时间也能写一些简单的逻辑。 第三个呢,是,以数据为中心,。Apex生来就是为了操作数据的。它有自己的查询语言,叫SOQL,跟SQL很像,专门用来从数据库里捞出你想要的数据。还有DML语句,让你可以直接在代码里创建、修改、删除记录。你写Apex的大部分时间,其实都是在和数据打交道。 接下来第四个特点是,严格性,。Apex是一门强类型的、严谨的语言。它会在编译时就帮你检查出很多错误,而且Salesforce平台有一套非常明确的治理限制,比如你的代码执行不能超过一定的CPU时间,一次最多只能查询多少条记录等等。这听起来像是限制,但实际上是好事,它像交通规则一样,确保平台上跑的所有代码都不会失控。 第五点是,托管性,。这点很省心,你写的Apex代码完全运行在Salesforce的服务器上。你不需要去买服务器、装数据库、配网络,Salesforce会把一切都处理好,你只要专注于业务逻辑就可以了。 第六个是,多租户感知,。这个有点抽象,但理解起来很简单:Salesforce是一个大公寓楼,所有租户,也就是所有的客户,都住在里面。你的代码跑起来的时候,平台会自动把它隔离在你自己的空间里,不会不小心跑进别人家,也不会被别人干扰。而且资源分配也是对每个租户都公平的,这个你完全不用操心,平台底层已经做好了。 第七是,易于测试,。Apex自带了一套非常完整的测试框架。你可以为你的代码写测试类,模拟各种数据和场景。最关键的一点是,如果你想把自己写的代码部署到正式的生产环境,Salesforce强制要求你至少要有75%的代码被测试覆盖到。这个硬性规定逼着我们写出更健壮的代码,虽然写测试有点花时间,但对代码质量来说是个超级保护伞。 最后一个特点是,版本化,。你的Apex代码不是写死在一个一成不变的环境里的。因为Salesforce每年都会发布新版本,带来新功能或改变一些旧行为。但你的代码可以独立设置它跟随哪个API版本运行。也就是说,即使平台升级了,你的老代码还可以按照当年的那个版本来执行,不会突然出问题,这给系统的稳定和兼容性提供了很大的保障。 好,这八个特性:集成性、易用、以数据为中心、严格、托管、多租户、易测试和版本化,基本上就勾勒出了Apex这门语言的样貌。记住这些,你就知道在什么场景下它会是你最好的工具了。
同学们,今天我们来聊聊 Apex 语言的两个核心特点:第一个叫“集成性”,第二个叫“易用性”。这两个特点,也是它为什么特别适合在 Salesforce 平台上写业务逻辑的原因。 好,我们先说“集成性”。 所谓集成,就是 Apex 从诞生之初,就充分考虑到了和 Lightning 平台的各种习惯用法紧密结合。 比如说,咱们操作数据的时候,可以直接写 `insert`、`update`、`delete` 这样的 DML 语句。而且平台还很聪明,内置了 `DmlException` 异常处理,如果你插数据失败了,它会自动把错误信息带出来,你不用自己写一大堆判断。 再有,Apex 里面可以直接写内联的 SOQL 或 SOSL 查询。查完之后,马上就能得到一个 `sObject` 列表,比如查出来的账户、联系人,直接用列表接着处理就行,非常顺手。 还有,做批量操作也很轻松。平台鼓励你一次处理多条记录,循环时脑袋里就想着“一次干一批活”就行了,不用像传统代码那样一条一条慢慢抠。 另外,Apex 还提供了记录锁定语法,防止多人同时更新同一条记录产生冲突,这在多人协作的系统里特别实用。 更厉害的是,你可以把自己写好的 Apex 方法暴露成自定义的公共 API,让外部系统也能调用。 最后,平台还能保护你的代码。如果你不小心想去编辑或者删掉一个被 Apex 代码引用的自定义对象、字段,系统马上会弹出警告甚至阻止,防止你把正在跑的业务逻辑弄坏了。这些全都是 Apex 深度集成带来的便利。 好,再说说“易用性”。 如果你有一点 Java 的基础,那学 Apex 会感觉特别亲切。它的变量声明、表达式、代码块结构、条件判断、循环语法,包括对象和数组的写法,都和 Java 很接近,几乎可以无缝切换。 就算 Apex 要推出一些新特性,开发团队也会特意设计成好读、好懂的语法和语义,让你不用费太大劲就能上手。这样一来,你就能把精力更多地放在业务需求上,高效地利用整个 Lightning 平台。 总之一句话,Apex 既是平台的一部分,又继承了主流语言的优点,学起来轻松,用起来强大。 好,今天关于 Apex 的集成性与易用性,就先讲到这里。
同学们,我们来看这一页,它讲的是Apex这门语言的一个核心特点:,以数据为中心,,以及它的严谨性。 你可以把Apex想象成在Salesforce服务器上执行的一个“数据操作流水线”。它最擅长的事情,就是把多个数据库查询和DML操作——也就是增删改查——串在一起,变成一个完整的工作单元,一次性提交给服务器。这样做效率高、速度快,就像在数据库里写存储过程一样,把一连串操作打包好,交给数据库去执行,减少来回通信的开销。 正因为它专注于数据操作,所以Apex并不会去管界面上怎么渲染、怎么画按钮这类事情。它的任务就是把后台的数据逻辑处理好,界面的展示交给其他层去负责。 另外,Apex非常,严格,,是一种强类型语言。你在代码里写的对象名、字段名,都是直接引用元数据的。如果在编写的时候写错了哪怕一个字段名字,编译阶段它就会立刻报错,不让你运行。这其实是在保护咱们,避免上线后才发现数据出了问题。 它还把所有自定义字段、对象、类,都通过元数据关系绑定在一起。也就是说,只要你的Apex代码还在用某个字段,系统就不允许任何人删除这个字段,确保活代码不会断供。这保证了整个系统的稳定和可靠。 所以简单来说,Apex就像是一位严谨的数据库管家:专注数据、一次打包操作、检查严格、保护依赖,让你放心构建业务逻辑。
同学们,我们来看一下这一页幻灯片,它总结了 Apex 这门语言的几个核心特性。这些特性看起来是技术点,但其实每一项都在保护你写的代码,让你的工作更安心、更省力。 首先,Apex 是完全,托管,的。也就是说,你的代码不用自己去管理内存、不用操心服务器,全部交给 Salesforce 的 Lightning 平台来负责解释和执行。你只要把逻辑写好就行,底层的事情平台都替你包了。 第二个特性是,多租户,。什么意思呢?可以想象成一座公寓楼,里面住了很多家公司,大家共享水电、电梯这些公共资源。Apex 就在这样一个多租户环境里运行,你们的代码跟别人共享底层资源。但 Salesforce 有一个非常严格的“管家”——运行时引擎,它会死死盯住每一段代码,防止某个程序失控或者写出死循环,把整个大楼的资源都占光。一旦你的代码超过了规定的资源上限,它会立刻叫停,并抛出一条特别清晰的错误消息,告诉你哪里超限了,比如查询记录太多、CPU 时间太长等等。所以你不用担心一个误操作影响到其他租户。 接下来,Apex 还,易于测试,。平台内置了单元测试支持,你写完业务逻辑,可以很方便地写测试类去验证。运行测试以后,你不仅能看到测试通不通过,还能看到代码覆盖率——它清清楚楚地告诉你哪些代码被执行到了、哪些没被覆盖。最厉害的是,每次 Salesforce 平台升级之前,都会自动运行所有的 Apex 测试,确保你的自定义代码不会因为升级而出错。这样你就不用天天提心吊胆,怕系统更新把你的逻辑搞坏。 最后一点,Apex 是,版本化,的。你可以针对特定的 API 版本来保存代码。比如说,你写代码时基于 57.0 版本的 API,以后平台更新了,你的代码行为依然会保持在 57.0 版本的行为,不会跟着自动变。这就给你的应用增加了稳定性,让你可以慢慢规划升级,而不会被突然的变化打个措手不及。 你看,托管的、多租户、防失控、易测试、还能锁定版本,这五点让 Apex 写起来既强大又安全。记住这些特性,以后你在写代码的过程中,会越来越多地体会到它们的好处。
好,各位同学,我们接下来聊聊Apex这门语言的核心概念。你如果学过其他编程语言,比如Java、C#,那看到Apex代码的时候,会觉得很亲切,很多地方都很像。但Apex也有它自己的一些设定,我们一点点来说。 首先,咱们说说版本设置。Apex在Salesforce平台上是一直在进化的,为了让你的代码能用到最新的功能,同时又不影响旧的逻辑,你可以通过API版本来指定你的代码遵循哪一套行为。简单理解,就是你写的每一个类、每一个触发器,都会绑定一个API版本号。这个版本号决定了你可以用哪些新特性,也决定了某些内置行为。比如说,更高的版本可能改了某个方法的返回值。所以养成好习惯,在类定义前面用@isTest或者类本身可以指定版本,但一般我们通过Salesforce的配置或者元数据来设置。你心里有个概念就行,版本不同,代码的表现可能会变。 接下来是命名规则。和很多语言一样,Apex是区分大小写的。类名、变量名、方法名,你可以用字母、数字和下划线,但数字不能放开头。另外,不能用Apex的保留字,比如if、else、for这些。通常我们遵循驼峰命名法,类名首字母大写,变量和方法名首字母小写。比如AccountTriggerHandler,或者updateAccountBalance。这样别人一看就懂。 然后是变量和表达式。变量就是用来存数据的容器。Apex是强类型语言,你声明变量的时候必须给它一个数据类型,比如Integer、String、Boolean、Date,或者SObject(就是Salesforce的记录对象)。表达式呢,就是把变量、常量、运算符组合在一起,计算出一个结果。比如:Integer total = 100 + 50 * 2; 和数学差不多。字符串连接用加号,比如String greeting = ‘Hello, ’ + name;。逻辑表达式就是返回true或false的那种,用来做判断。 接着我们讲陈述,或者叫语句。Apex里的语句就是以分号结束的一行代码。可以是赋值语句、方法调用、声明语句等等。你必须用分号,不然编译不过。写代码就像写一句话,必须有句号。 再来看集合。我们经常需要处理一组数据,而不是一个。Apex提供了三种集合类型:List、Set、Map。List是有序的、可以重复的列表,就像购物清单,你可以按顺序取,也可以通过下标。Set是无序的、不可重复的集合,主要用于去重或者快速判断某个值是否存在。Map是键值对,每个键对应一个值,通过键能快速找到值,就像字典用单词查释义。集合是处理数据的利器,特别是和SOQL查询结果打交道的时候。 然后是分支。程序不能总是直线执行,需要做判断。这就要用到if-else和switch语句。if(条件) { … } else { … },你肯定见过。switch是多重选择,当一个变量等于好几个可能的固定值时,用switch比一堆if更清晰。比如根据订单状态执行不同操作,就可以用switch。 最后是循环。重复干一件事,Apex里有好几种循环写法:while、do-while、for循环。for循环最常见,你可以用传统的三段式:for(Integer i=0; i<list.size(); i++),也可以直接用迭代的for-in循环:for(Account acc : accountList)。另外,Apex还支持SOQL for循环,也就是直接遍历查询结果,这样能有效处理大量记录,避免堆限制。 好啦,这些就是Apex最基本的核心概念。记住,编程就是在一定的规则下,用变量存数据,用表达式做计算,用集合管理数据,用条件和循环控制流程。你把这些学会了,再看Apex代码,心里就踏实多了。下一节,我们深入探讨变量和数据类型。
同学们,今天我们聊一个在Salesforce开发中非常实用的小设置——,Apex类和触发器的API版本,。 你在Salesforce的界面上写Apex代码时,不管是类还是触发器,都可以为它指定一个Salesforce API版本。这个版本号不仅仅决定了它背后调用SOAP API时用的是哪个版本,同时也规定了这段Apex代码本身是按照哪个版本的语法和特性来运行的。简单说,它就像一个时间戳,告诉系统:“请用那个时候的规则来理解我的代码。” 这个版本并不是写死了就不能改的。你保存之后,如果发现需要升级或者降级,随时可以回到设置里手动调整。不过要记住一点:,在一个Salesforce环境中,每个类或触发器的名字必须是唯一的,。你不能说“我存一个版本1的‘MyClass’,再存一个版本2的‘MyClass’”,系统会报错,因为名字重复了。同一个名字只能有一个版本存在,你改版本设置,其实就是把现有这个文件指向了另一个API版本。 这个机制还有一个很实用的场景,就是当你安装了AppExchange上的,托管包,时。这些包里也可能包含Apex类或触发器,并且会带着它们自己的版本设置。你可以在你本地的类或触发器里,通过版本设置把它明确关联到托管包的某个特定版本。这样一来,就算那个托管包后来发布了更新的版本并被你安装到环境中,你的代码依然会坚持使用你指定的那个老版本,不会被动升级。除非你主动去手动更新这个版本设置,它才会换到新版本。 所以,总结一下就是:利用版本设置,我们可以锁定代码的行为,保持兼容性,同时也给了我们灵活手动调整的空间。在开发中,这是一个保护代码稳定性的好工具。 好了,关于Apex版本设置就讲这么多。有什么问题,随时问我。
好,同学们,我们来看一下命名规则这一块。在Apex里,给变量、方法或者类起名字的时候,千万不能用系统保留的关键字。 哪些是保留关键字呢?其实就是Apex语言本身或者整个Lightning平台里已经占用的单词。比如你写个变量叫“List”,或者叫“Test”,甚至用“Account”来命名,这都不行。因为这些词要么是类型名称,要么是标准对象,系统会把你写的代码当成别的意思,直接报错。 如果你想查完整的列表,可以去Apex参考文档里找,那里有所有保留字的记录。总之,记住一个原则——避开那些平台已经有的名字。 另外,大家平时写代码一定要养成好的命名习惯,名字起得清晰易懂,别人一看就知道是干什么的。这样你的代码不光自己能维护,团队合作也会更高效。好了,这部分很简单,就是千万别用保留字,然后命名要规范。咱们接着看下一页。
好,今天我们来讲讲Apex编程语言的一个基础概念——数据类型。你可能会问,为什么一开始就要讲这个呢?因为Apex是一种强类型语言。所谓强类型,听起来有点专业,其实意思很简单:你在代码里第一次用到一个变量的时候,必须明确告诉系统,这个变量是什么类型。比如,它是个数字,还是个文字,还是个日期,你都要说清楚。 那Apex里面有哪些数据类型呢?可以分为两大类。一类是基本类型,就像我们日常用到的整数、小数,或者一个对错值——布尔类型,还有日期啊,这些常见的。另一类是更高级的类型,比如列表,就是把多个数据放在一起;还有地图,就像字典,可以快速查找;再比如对象和sObjects,sObjects其实就是Salesforce里用来表示数据记录的特殊类型,比如一个客户、一个商机,都是一个sObject。 在写代码的时候,你声明一个变量,要同时给出它的名字和数据类型。比如你可以这样说:“整数 我的数字”,当然,是用英文关键字。你可以在声明的时候顺便给它一个初始值,比如“整数 我的数字 = 10”;也可以先声明,后面再给它赋值。 最后,有一点非常关键,也是新手最容易忘记的——Apex里每条语句结束时,必须加上一个分号。这可不是可选的,是必须的。如果你忘了分号,系统就会报错。所以,咱们写代码的时候,要养成每句话都加个分号的习惯。 好,关于强类型和变量声明,我们就先聊到这儿。下一节我们会进一步看看各种数据类型怎么用。
同学,咱们今天聊一个在写Apex代码时特别容易踩坑的概念——方法参数的传递方式。你想想,你写一个方法,传进去一个变量,在方法里一顿操作,出来后这个变量到底变了没?答案分两种情况。 第一种,如果你传的是基础类型,比如整数、字符串、布尔值,这些是,值传递,。什么意思呢?就好像你把这个变量的数值复印了一张纸,塞给方法。方法在里面把这张纸上的数字改成别的,跟你手里的原件没关系。方法一结束,那张复印件就消失了,你原来变量的值纹丝不动。所以,在方法里怎么折腾,外边都看不见。 第二种,如果你传的是对象类型,尤其咱们最常用的sObject,像Account、Contact这些,那就不一样了。它们走的是,引用传递,。但注意,不是把原对象整个复制一遍,而是把遥控器给了你。你在方法里拿着这个遥控器,不能把它变成另一个遥控器——也就是你不能让这个方法里的参数名指向另一个全新的对象,那个指向是定死的。但是,你能用遥控器去改电视的频道、音量!也就是说,你可以改变这个对象的字段值,比如改改Name、Phone这些,方法结束出来后,外边的那个对象字段真的变了。 因为这变化会影响到外部对象的状态,所以写触发器、写服务类的时候,心里得有这根弦,该不该改,什么时候改,一定要想清楚。好,这块先讲到这里,咱们休息一下,有问题随时提。
同学们,今天我们来讲Apex中最基础但也最重要的概念——,语句,。你可以把语句理解成计算机执行某个动作的一条指令,就像你告诉程序要做什么的完整句子。 在Apex里,每一条语句都像写英文句子一样,结尾必须有个标点符号,也就是分号`;`。忘记加分号可是最常见的语法错误哦。 Apex支持多种类型的语句,包括: - ,赋值语句,:把一个值存到变量里,比如 `name = '张三';` - ,条件语句,:就是 if-else 这类,根据条件决定执行哪段代码。 - ,循环语句,:do-while、while 和 for,让一段代码重复执行。 - ,锁定语句,:用来在查询时锁定记录,防止别人同时修改,比如 `FOR UPDATE`。 - ,事务控制语句,:用来管理数据库提交与回滚,保证数据一致性。 - ,方法调用语句,:调用一个写好的方法,比如 `System.debug('hello');` - ,异常处理语句,:比如 try-catch,优雅地处理错误。 另外,还有一个很重要的概念叫,块,。块就是用一对花括号 `{}` 把多条语句包起来,形成一个小组。只要程序允许你放一条语句的地方,你都可以放一个块,把多条语句当成一条来用。比如在 if 后面,你想执行好几步操作时,就可以用块包起来。 好,这次我们先记住:语句就是动作指令,以分号结束;类型很多;大括号里的多行语句合在一起叫做块。后面我们会逐一详细展开,慢慢你就会很熟练了。
好,同学们,我们来看一下这块儿的内容,它虽然很短,但写代码的时候其实经常会碰到。 Apex 里有个小便利:如果你的 if 或者 else 后面只跟了一条语句,那对花括号是可以省略的。比如你写 `if (true) System.debug(1); else System.debug(2);` 这样是完全可以的,编译器不会报错。 但是,一旦你的块里面要写不止一条语句,就必须得老老实实把花括号加上。不然 Apex 就不知道哪些语句属于这个 if,哪些不属于。 那老师给你的建议是什么呢?即使只有一条语句,最好也统一加上花括号。为什么呢?因为以后你维护代码,很可能需要在里面再加一行逻辑,如果当初没写花括号,到时候很容易忘记补上,一运行就出 bug。而且保持一致的缩进和格式,会让你的代码读起来清清爽爽,别人看得明白,你自己过两个月再回来看,也不会一头雾水。 好,这一小点就讲到这里,大家在自己写代码的时候可以留意一下。
同学们,我们来看今天这一页的内容——列表,在Apex里用得非常多。你可以把列表想象成一个有序的购物车,你往里面放的东西可以是整数、字符串,甚至你自己定义的对象,而且放进去的顺序很重要。如果你需要记住哪个东西先放进来,哪个后放进来,或者想根据顺序来做循环处理,那用列表就对了。 另外,列表里允许有重复的元素,就像你可以往购物车里放两个一模一样的苹果一样。要记住,列表中的第一个元素可不是索引1,而是索引0,这点跟很多编程语言一样。 那怎么创建一个列表呢?在Apex里,我们必须用`new`关键字,然后写`List`,紧接着是尖括号`<>`,里面写上你要存放的元素类型。比如你想装一堆整数,就写成`List<Integer>`;装字符串就写`List<String>`。因为Apex是强类型语言,我们必须在声明的时候就明确告诉它:这个列表只能装这一种类型的东西,不能混着放。比如我写`List<String> names = new List<String>();`就表示我创建了一个只能装字符串的空列表。 这样解释,大家能感受到列表的用途和创建方式了吗?试着在脑子里想一个场景,比如你想保存一组客户的名字,这些名字的顺序不能乱,而且有可能有同名的人,那用列表就恰到好处。好,我们接着看下一个概念。
大家好,今天我们来看Apex中的两种重要的集合类型:Set 和 Map。 先说 Set,你可以把它想象成一个不重复、也不排序的“口袋”,里面装的每一个元素都是唯一的。比如你可以往里面放字符串、日期,甚至可以放sObject这种复杂类型。创建的时候很简单,用 Set 关键字,后面跟一对尖括号,括号里写上你要存的数据类型就行了。 接下来是 Map,它更像一本字典,是一个“键-值”对的集合。键可以是任何原始类型,比如字符串、数字,而值就可以丰富多彩了,可以是基本类型,也可以是对象,甚至是另一个集合。需要根据某个钥匙快速找到对应的东西时,Map 就特别管用。要记住的是,Map 里的值可以有重复,但每个键必须是唯一的,不能重复。创建 Map 的时候,我们用 Map 关键字,后面尖括号里用逗号分隔,写清楚键和值的类型。 好,这就是 Set 和 Map 的基本概念。很简单,对不对?
好,同学们,今天我们来聊聊Apex里最基础但也最重要的一个概念——if语句。你可以把它想象成一个岔路口,程序走到这里,需要根据条件来决定往哪条路走。 if语句的基本写法很简单,就是“if”这个关键字,后面跟一对小括号,里面放你的条件。条件的结果要么是真,要么是假,没有模糊地带。然后是一对大括号,里面写当条件为真时要执行的代码。比如你判断一个学生的分数是否及格,可以这样写: ``` if (score >= 60) { System.debug('恭喜,及格了!'); } ``` 如果分数大于等于60,就会输出那句恭喜。那如果没及格呢?程序直接跳过大括号,什么也不做。但很多时候,我们想给两种情况不同的处理,这时就可以加一个else分支。else紧跟在if代码块后面,不需要再写条件,它是当if条件为假时自动执行的。像这样: ``` if (score >= 60) { System.debug('及格了!'); } else { System.debug('需要补考哦。'); } ``` 这样不管分数多少,总会有一条消息输出。 现实中的业务逻辑往往更复杂,可能有多个条件需要判断。比如分数分等级:90以上优秀,80以上良好,60以上及格,60以下不及格。这时候我们可以用else if把多个if-else串起来。它会从上到下依次检查每个条件,一旦遇到一个为真的,就执行对应的代码块,然后跳过整个结构。注意顺序很重要,因为它是按顺序检查的。示例: ``` if (score >= 90) { System.debug('优秀'); } else if (score >= 80) { System.debug('良好'); } else if (score >= 60) { System.debug('及格'); } else { System.debug('不及格'); } ``` 你看,else if后面也是跟条件,最后可以用一个else兜底处理所有剩下情况。 另外,if语句还可以相互嵌套,就是在一个if或else的代码块里再写一个完整的if语句。比如判断学生是不是会员,如果是会员再看积分够不够折扣。这让我们能实现更精细的逻辑。但要小心别嵌套太深,不然代码会变得很难读。 总结一下,if语句就是让程序根据真假做决策。记住三要素:if开条件,else if链条件,else兜底。它们是控制程序流程的基石,几乎每个Apex类都会用到。大家可以在练习中多试试,用起来很直观。有什么问题随时提出来。
好,同学们。我们前面聊了if语句,它可以根据条件选择性地执行一段代码。但很多时候,我们想让程序重复去做一件事,直到某个条件不再满足,这个就是咱们今天要说的循环。 在Apex里,循环就是不断地执行相同的代码块,只是每次可能处理不同的数据,或者计数器在变化。Apex给我们提供了好几种循环结构,来应对不同的场景。 咱们先从最简单的do-while循环说起。它的特点呢,是“先做了再说”。循环体会无条件地先执行一次,然后才去检查条件。如果条件还是true,那就再执行一遍,重复这个过程,直到条件变成false。所以这种循环至少会执行一次。比如你让用户至少输入一次密码,输错了才让他重新输入,就可以用这个思路。 然后是while循环。跟do-while相反,它是“先检查,再执行”。一开始就判断条件,条件为真,才会进入循环体;要是条件一开始就是假的,那循环体一次都不会执行。像那种“只要余额大于0就继续购物”的场景,用while就很合适。 接着就是功能更强大的for循环了。在Apex里,for循环有两种主要的写法,能给我们更精细的控制。 第一种,是传统的for循环,需要你在括号里定义三个部分:一个初始化变量,一个退出条件,还有一个每次循环结束后的操作。比如for(Integer i = 0; i < 10; i++),这就是典型的从0数到9,循环10次。你可以灵活地改变计数器,跳着走,甚至倒着走,控制力非常强。 第二种呢,是Apex特有而且非常推荐的一种for循环,专门用来遍历集合或者SOQL查询结果的,叫作for-each循环。语法很简洁,for(数据类型 变量名 : 列表或者查询结果)。比如你从数据库查出一批客户,想挨个更新他们的信用等级,就可以写成 for(Account acc : [SELECT Id, Name FROM Account]){...}。这样系统会一次取出查询结果里的每一行记录,依次放进acc变量里让你处理。 这里有个特别重要的点:当你在for循环的括号里直接放SOQL查询时,Apex会聪明地利用内部的高效批量机制,一次取200条记录,在后台悄悄帮你循环,这样能避免达到堆大小的限制。但要注意,如果循环里又包含了别的SOQL查询,那就可能会出事,因为循环次数不定,很容易碰到调控器限制。如果预先用列表把查询结果装起来,再用for-each遍历列表,执行次数就是明确的,但也需要留意列表本身的容量。所以两种方式要根据场景选用。 好了,总结一下。do-while循环保证至少执行一次,while循环可能一次都不执行,传统的for循环给了你精细的控制,而集合或查询的for-each循环让处理大量数据变得特别简洁。把这些结构用熟了,你就能根据不同的业务逻辑,写出高效又清晰的Apex代码。
我们来聊聊——什么时候该用Apex。 你可能已经发现了,Salesforce本身有很多现成的功能,点点鼠标就能搭出应用,不需要写代码。但是,当你的业务流程变得特别复杂,标准功能搞不定的时候,就需要上“高级工具”了。 这时候,Apex就派上用场了。它是Salesforce的编程语言,可以让你实现非常灵活的自定义逻辑,比如处理复杂的数据计算、调用外部系统、做复杂的校验等等。 当然,光有后端逻辑还不够,用户界面也很重要。这时候,我们还会用到Lightning组件,来打造用户看到和操作的前端界面。这两样结合起来,你就能做出功能很强、体验又好的定制化应用了。 简单说就是:标准配置不够用,业务又复杂,那就该考虑用Apex加上Lightning组件来搞定。
同学们,我们这节课来看看,到底什么时候需要用Apex来写代码。幻灯片上给大家列出了这么几种典型场景,我来一个一个讲清楚。 首先,当你想创建Web服务的时候。比如,你希望外部的系统能调用Salesforce里的某些功能,就要用Apex去写一个对外暴露的接口,让别的应用可以安全地访问我们的数据。同样的道理,如果你想处理接收进来的邮件,自动把邮件内容转成案例或者任务,那就需要创建邮件服务,这也要靠Apex来实现。 第二类情况是,当你要对多个对象做复杂的验证。系统自带的验证规则只能针对一个对象上的字段,但如果你的业务规则涉及到好几个相关的对象,比如订单、订单行项目和库存,就必须用Apex写触发器来做跨对象的检验。 第三个,Flow Builder虽然很强大,但它也不是万能的。如果碰到特别复杂的业务流程,比如多层循环、复杂的计算或者需要用一些高级的算法,Flow做不了,那就得用Apex来定制开发。 还有,如果你的逻辑必须在一个事务里完整地执行。比如说,一次保存记录的动作,要同时更新好几张关联表,要求要么全成功,要么全回滚,这时你就需要写Apex来实现这种事务级别的自定义逻辑,而不仅仅是针对某一条记录。 最后一个,也是特别常用的,就是你想把一段自定义逻辑绑定到某个操作上,比如保存记录的时候触发。无论这个保存是用户从界面上点按钮,还是从Visualforce页面提交,又或者是通过API调用的,你都希望这段逻辑能自动执行。这就是典型的Apex触发器场景。 所以简单来说,当你发现标准配置、流程生成器解决不了,或者需要跨对象、跨事务、需要对外开放服务的时候,就轮到我们的Apex上场了。是不是一下子就清晰了?
我们来看看这一页的内容:开发 Lightning 组件。它其实讲的是,如果你想自定义 Salesforce 的 Lightning 界面,或者想给Salesforce 移动应用加点自己的功能,甚至可以完全自己开发一个独立的应用程序,你都可以用 Lightning 组件来实现。 从2019年春季开始,准确说是 API 版本 45.0 之后,你可以用两种方式来构建这些组件:一种是 Lightning Web Components,简称 LWC,另一种是更早的 Aura Components。 重点来了,现在更推荐使用 Lightning Web Components,也就是 LWC。为什么呢?因为它实际上是基于标准的 HTML 和现代 JavaScript 打造的自定义 HTML 元素。换句话说,它遵循的是 W3C 的 Web 标准,你写代码的时候用的就是原生 JavaScript 的语法,不需要学一套封闭的新东西。这样既好上手,性能也更好。所以我们现在的建议是,新建用户界面的话,优先选择 LWC。 总结一下:想自定义界面,就用组件;现在最好用 Lightning Web Components,因为它贴近标准 Web 技术,更现代、更高效。
同学们,我们来看这一页的内容,它讲的是Visualforce,还有SOAP API什么时候用。 首先,Visualforce是什么呢?它是一种基于标签的标记语言,听起来可能有点专业,但其实你可以把它理解成很像HTML,就是用一些尖括号的标签来定义页面。不过它的能力可比普通网页强多了,专门用来构建Salesforce上的自定义界面。 用Visualforce,你可以做出很多很酷的东西。比如向导,就是那种一步一步带你填完复杂表单的流程;或者多步骤的流程操作,每一步完成后才跳到下一步。你还能完全自己控制流程逻辑——什么时候该显示什么,什么时候该跳到另一个页面,都可以自己写规则。甚至可以定义导航模式,就是说页面之间怎么来回跳转,以及根据数据的不同展示不同的内容,这样就能做到非常个性化的用户体验。 但是,并不是所有加功能的时候都要用Visualforce。Salesforce开发工具包里还有别的东西,比如标准SOAP API。这个SOAP API是一种基于Web服务标准的调用方式,你可以通过它从外部系统,或者在Apex代码里,去操作Salesforce的数据。 那么什么时候该用SOAP API呢?假如你正在做一个复合应用程序——就是把很多功能拼在一起的应用——你要添加的那个功能,它一次只处理一种类型的记录,比如仅仅是对一个客户信息进行简单的查询或更新,而且你也不需要那种复杂的事务控制。事务控制指的是什么?就是那种“设一个保存点,万一中途出错了,可以把所有改动都回滚到之前的状态”的操作。如果你不需要这些,那就可以放心地用标准的SOAP API来搞定,既简单又直接。 所以关键点是,Visualforce和SOAP API在Salesforce的生态里各有各的一席之地。Visualforce擅长做界面,做复杂的交互流程;SOAP API则更专注于轻量级的数据操作和集成。选哪个,就看你的需求是什么了。 这样讲清楚了吗?其实记住这个原则就好:做花哨的界面和流程用Visualforce,做简单的单条数据处理又没有回滚需求时,就拿起SOAP API这个工具。
好,咱们来看看Apex到底是怎么工作的。你可以把它想象成一个完全生活在云端的东西。Apex代码从编写到执行,整个过程都不需要离开Lightning平台。 开发人员首先在平台上把代码写好,然后保存。这代码就存储在Salesforce的服务器上了。接下来,当最终用户,比如一个销售人员,在界面上点击一个按钮,或者保存一条记录的时候,这些操作就会触发我们写好的Apex代码。平台接收到这个触发信号,就会自动编译并运行那段代码,然后把结果返回给用户。 所以,你不需要自己管理服务器,不需要操心代码编译的细节,Salesforce会把所有事情都处理好。Apex完全就是在Lightning平台上按需编译、存储和运行的。这就是它最核心的工作方式。
同学们,我们来看一下,当你在Salesforce里写好一段Apex代码,点击保存的那一刻,背后到底发生了什么。 首先,平台的应用服务器不会直接存你的源代码,它会先把这段代码编译成一套抽象指令集。你可以理解成,把人类读的Apex代码,翻译成一种Apex运行时解释器能轻松看懂、执行起来更快的“内部语言”。然后,这套编译好的指令,就当作元数据,跟所有的配置信息一起被安全地保存起来。 好,现在代码已经存好了。等到有用户触发这段代码,比如点击了一个按钮,或者打开了一个Visualforce页面,平台应用服务器就会马上从元数据里找到之前存好的、已经编译过的指令,把它取出来。接下来,这些指令会被送进Apex的运行时解释器,跑一遍,最后生成结果返回给用户。 最关键的是,最终用户在这整个过程中,完全感受不到任何额外的等待时间。对他们来说,执行这段自己写的Apex,就跟系统自带的按钮、链接响应速度一模一样,没有任何差别。原因就在于代码是提前编译好的,不用每次执行时再去现编译。 所以总结一下,Apex是编译后存储,执行时直接解释已编译的指令,对最终用户完全透明,性能体验和平台标准功能完全一致。这就是Apex代码从保存到执行的整个过程,很简单也很高效。
同学们,咱们现在来聊聊在云里写代码这件事儿。在Salesforce平台上,我们用的编程语言叫Apex。跟传统语言不一样,Apex代码是保存在云端,并且运行在一个多租户平台上的。多租户你可以简单理解成,很多公司共用同一套系统,但彼此的数据又是安全隔开的。 那Apex到底是干嘛的呢?它是专门为这个平台的数据访问和数据操作来设计的。换句话说,你用它可以直接在Salesforce里查数据、改数据、删数据,非常方便。而且更重要的是,Apex能让你给系统事件加上自定义的业务逻辑。比如,一条客户记录被创建时,自动发邮件通知销售;或者每当合同状态改变,就更新相关的统计字段。这就在很大程度上,把各种业务流程自动化了。 不过有一点一定要记住,Apex不是一种通用编程语言。它不像Java、Python那样什么都能写,不能拿去做网站、写手机App什么的。它就是专门强化Salesforce平台本身能力的工具,只在平台内部发挥作用。好,关于在云中开发代码,我们就先聊到这儿。
同学们,我们这节课来聊一聊Apex的一些能力边界。你可能刚接触Apex的时候会觉得,它是一门编程语言,是不是什么都能干呢?其实不是的。Salesforce对Apex有一系列很重要的限制,这些限制恰恰体现了它作为云端多租户平台上业务逻辑语言的设计哲学。 首先,Apex不能用来在用户界面上随意渲染元素。如果你想让页面上多出一个按钮、一块文字或者一个图表,Apex是做不了的。它唯一能推送到界面上的,是错误消息。就是当你的代码发现问题时,可以给用户显示一条提示,仅此而已。真正的界面构建,你要去用Visualforce、Lightning组件或者屏幕流这些工具。 其次,Apex不能修改或者覆盖Salesforce的标准功能。比如系统自带的保存按钮,它的核心行为你是无法用Apex直接改掉的。但是,你可以用Apex来阻止某个操作发生,比如在记录保存前检查条件并抛出错误,不让它保存;或者你也可以在标准功能的前后插入额外的逻辑,比如保存成功后发邮件、更新相关记录。也就是说,你只能做“附加动作”,不能去改写系统原本的底层机制。 再者,Apex不能创建临时文件。你没办法在Apex里操作服务器的文件系统,生成一个文件存到临时目录再去处理。如果你想生成文件,比如PDF或CSV,你需要用专门的工具,比如通过Visualforce渲染成PDF,或者把数据拼接好后以附件、文档的形式存到Salesforce里。 最后,Apex不能产生线程。在传统的编程里,我们可能会开多个线程同时处理任务,但Apex不允许这样做。所有的执行都是同步的、单线程的。如果需要异步处理,你可以使用Apex中的异步特性,比如未来的方法、队列、批处理,但这些本质上仍然是Salesforce平台管理下的异步执行,并不是你创建的操作系统线程。 那为什么会有这些限制呢?这就得说到Salesforce的架构了。它是一个多租户的云平台,成千上万的客户共享相同的底层资源。如果任由每个Apex代码自由操作界面、修改核心功能、读写文件系统或者随意开启线程,很容易影响整个平台的稳定、安全和性能。所以Apex被定位成一门专注于业务逻辑的语言:它只负责数据查询、计算、流程控制,把界面、文件、并发这些复杂的任务交给平台的其他部分。这样大家写出的代码更安全可控,平台也能为所有租户提供一致、稳定的服务。 理解这些边界很重要,它能帮你避开很多设计上的误区,让你更顺畅地在Salesforce平台上写出高效、合规的代码。好,这节课就到这里,下节课我们继续深入。
今天我们来聊聊Apex代码运行的“生态环境”。想象一下,Salesforce的Lightning平台就像一个大公寓,所有租户(也就是各种组织)共享同一套水电煤气。为了保证每家每户都能正常使用,物业(平台)必须对每个人的用量设个上限。在Apex里,这个上限就是我们常说的“调控器限制”。 简单来说,你写的每段Apex代码,在执行时能调用的资源都是有限的,比如能查询数据库多少次、能处理多少条记录。如果不加控制,某段代码霸占了所有资源,其他组织就得干瞪眼。 特别注意一个基本规则:一次Apex请求处理的数据,不会是单条记录,而是1到5万条记录的一个集合。哪怕你现在只想改一条,系统也可能“塞”给你一堆。所以,写代码时千万别假设“我每次只对付一条”,必须养成批量处理的思维。 如果你不这么设计,轻轻松松就会撞到调控器的墙。比如在一个1000条记录的循环里反复查数据库,很快就会被系统叫停。这种错误不仅影响当前操作,还会拖慢整个平台。 所以,今天的核心就是:时刻记住平台是共享的,资源有限,数据批量来,代码必须“批量处理友好”。接下来我们会详细拆解如何做到。