apex 特点
1. 编译在服务器端
2. 面向对象
3.强类型
4. 多租户意识,密切避免超limit
5. 与数据课密切集成,直接操作数据。
6. Data focused 提供数据库操作transaction允许rollback
7.易用
8.易测试
9. 版本 code可以保存为某个指定版本。
与其他语言不同的是,apex还提供:
1.云开发
2. Trigger
3. 直接查询 和直接保存
4. transaction 和roll back
5. global关键字允许跨命名空间/app的访问
6. 代码版本
大小写不敏感。
数据类型概览
基本类型
sObject
集合类型
Enum
自定义class
系统提供的class
array 和list在apex中是一回事
Api name与label可以不一致。
API name 以__c / __r结尾, 不能包含空格
当不知道具体类型的时候,可以用sObject。
可以用括号+类型做强制类型转换。转成具体类型后就可以使用点号来获取字段值了。
泛类型的sObject不能用new 来新建实例,只能用newSobject来创建实例。
DML 语句
insert之类的,特别是还有merge
merge可以merge最多3个同类型record, 保留一个删掉其他, 如果有关联record会做re-parenting.
在insert的时候,会生成Id,并更新到 record变量上。
建议批量DML 以避免超过limit.
upsert时可指定用哪个字段作为键值,默认用Id 。注意:如果是custom object这里只能用一个external Id类型的字段, 如果是standard object, 则可以使用任意“idLookup=true”的字段。
例如: upsert sObjectList Account.Fields.MyExternalId; 如果外键在系统中不唯一,会报错并且不会保存。
delete操作: 不会立即删除,而是放在recycle bin里面。
如果DML失败,会抛DMLException类型的异常。
Database的方法, 与insert之类不同的是,它们还支持allOrNone参数, 而且会有返回的result.
当allOrNone = false的时候,支持部分成功保存,此时不抛异常。
当allOrNone = true的时候,如果有部分出错,会抛异常。
当需要立即报错抛异常的时候,应该用DML statement
当需要允许部分保存,应该用database的方法。
关于更新related records:
Contact ctc = [Select Id, Account.Name From Contact Where .... ]
ctc.Phone = 'xxxxx';
update ctc;
update ctc.Account;
如上例,必须分两次DML分别更新record以及它的related record.
Delete支持级联删除。
Transaction
所有的DML在同一个transaction里运行。在运行后提交数据库。如果有错误发生,整个transaction会回滚。
查询:
不支持*号通配查询。如果某个字段没查询,在访问这个字段值时会报错。
Id 不用加在查询字段中。
默认排序是ASC
排序字段不能是rich text / multi picklist
查询语句中用:来绑定变量。
可以子查询。
for (variable : [soql_query]) { code_block }
for (variable_list : [soql_query]) { code_block }
这两种都可以,最好是用第二种。
SOSL 是用来跨object/field查询text的。
List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)];
1.可跨object
2. 用text 匹配而不是精确匹配
SOQL用于查询单个object
SOSL 用于查询多个object。 可查询同一obj的多个text字段。
语句最好在developer console中测试运行之后再添加到apex中。
在deveoloper console中, 搜索值用花括号的形式
FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)
但是在apex中,用单引号形式
* 匹配0个或多个字符
?匹配单个字符
查询是大小写不敏感的 case-insensitive。
Search group的可选值是:
- ALL FIELDS
- NAME FIELDS
- EMAIL FIELDS
- PHONE FIELDS
- SIDEBAR FIELDS
查询目标有两种
single word, 数据中的字段值里面的空格或标点作为word的分界来匹配目标word. 比如Find 'abc' 则 account name中的'my abc'会被匹配到
phrase 用引号包括起来的字符,里面可能包含了空格。
FIND 'The Query' 则数据字段值需同时包含"The"和"Query"
FIND 'Wingo OR Man' 则数据字段值只需包含"The"和"Query"的任意一个
FIND 'wing*' 则数据字段值需以"wing"开头
过滤条件,在WHERE中定义 例如 RETURNING Account(Name, Industry WHERE Industry='Apparel')
排序 例如 RETURNING Account(Name, Industry ORDER BY Name)
LIMIT 例如 RETURNING Account(Name, Industry LIMIT 10)