您的位置:首页 > 其它

salesforce.com Apex语言介绍(二)

2010-07-28 11:29 447 查看
数据库一体化(Database Integration)
ApexForce.com的持续层(persistence layer)有很强的关系,这节中我们介绍一下Apex是怎么样创建数据库,维护,以及更新数据库对象,他被称作sObject,以及查询数据库和显示返回的结果。它同样可以用来写数据库触发器。如果你想综合了解数据库,那么请看文章salesforce.com 数据库介绍 --An Introduction to the Force.com Database》。
1.操纵数据库(Manipulating sObjects)
sObjects是一些可以被存储在Force.com平台的数据库中的对象。这些对象不是Apex类的实例化这样意义上的对象。他们代表了被持久化或者将被持久化的数据。
这些持久化的数据对象可以被Apex语言像处理类一样处理,这就使得数据库的操纵更加直观并且易于使用。
sObject是持久化对象(persisted object)的抽象基类(generic abstract type)名称。
假设数据库有Account这个sObject,它包含字段 name,billingcity,那么下边的代码将会创建一个sObject
------------------------------------------------------------
sObject s = new Account();
Account a = new Account( name = 'Jibb',billingCity ='Yantai');
------------------------------------------------------------
主要代码下边对字段的初始化是可选的。
Apex提供了一种方便的圆点符号(.)用来访问对象的字段。下边的代码将会返回一个ID和一个字符串。
------------------------------------------------------------
ID id = a.ID;
String x = a.name;
------------------------------------------------------------
动态Apex允许采用一个松散的输入语法。例如例子中的下边一句可以写成这样:
------------------------------------------------------------
String X = a.get('name');
------------------------------------------------------------
2.查询和嵌入查询(Queries and Embedded Queries)
Force.com 平台支持两种查询语言:
>Salesforce Object Query Language(SOQL). 它只能用来查询。在某些方面类似SQL,它是一种对象查询语言,使用关系(relationships)而不使用连接(joins)来提供更为直观的数据表达。下面你会看到一个例子。
>Salesforce Object Search Language(SOSL).它是一个简单的对所有持久性对象进行查询的语言。
这些查询语言可以嵌入到您的Apex代码中,使查询数据更加的容易。下面的例子查询一个sObject(数据库记录)name 字段指定为'Acme'
------------------------------------------------------------
sObject s = [select id,name from account where name = 'Acme'];
------------------------------------------------------------
下面的例子检索所有符合的accounts,结果赋给一个list对象。结果可能为0条。
------------------------------------------------------------
String myName = 'Acme'.
Account[] accts = [select id,name from account where name= :myName];
------------------------------------------------------------
下面的例子中,查询符合记录的accout,并且把第一个记录中的annualRevenue字段的值赋值给一个变量。
------------------------------------------------------------
Double rev = [select annualRevenue from account where name='Acme'][0].annualRevenue;
------------------------------------------------------------
如果你AccoutContact对象存在关系,你可以在查询中使用圆点符合使用这个关系。这段代码通过Contact对象查询相关联的Account对象的name
------------------------------------------------------------
String myName = [select Account.name from Contact where id= :id];
------------------------------------------------------------

SOSL的语句可以看作一个sObject组成的列表,每个列表包含了一个特定sObject类型的查询结果。
------------------------------------------------------------
List<List<sObject>> searchlist= [FIND 'map*' IN NAME FIELDS RETURNING Account(id,name),Contact];
Account[] accounts = ((List<Account>)searchlist[0]);
Contact[] contacts = ((List<Contact>)searchlist[1]);
------------------------------------------------------------
查询语句同样可以嵌入到for语句中。可以使用循环读取返回的记录。
------------------------------------------------------------
For(Account[] tmp: [select id from Account where name = 'yyy']){
j = tmp.size();
//perform some actions on the accounts
}
------------------------------------------------------------
3.触发器(Triggers)
使用Apex来写触发器,并且当sObject发生insert,update,delete或者undelete事件之前或之后触发器被调用。触发器的定义看起来稍微熟悉,使用关键字trigger开始:
------------------------------------------------------------
trigger myAccountTrigger on Account(before insert,before update) {
if(Trigger.isInsert) {
//do
}
if(Trigger.isUpdate) {
for(Account a: Trigger.new)
{
if(a.name == 'bad')
a.name.addError('Bad name');
}
}
}
------------------------------------------------------------
这个例子在任何Account这个sObjectInsert或者被Update的时候被触发。Tirgger.new包含被插入或者删除的Account列表。被更新前或者被删除前的数据可以使用Trigger.old读取。
Apex充分利用触发器,并且你可以使用熟悉的语言进行数据操作。这里有一些限制-不允许在触发器中调用外部的Web服务,因为这样会导致事务过分被延长。
4.数据操纵语言(Data Manipulation Language)
Apex代码同样包含数据操纵语言(DML)去查询,插入,删除,以及更新数据库中的数据。你也可以创建和操作事务。这里有一些例子:
------------------------------------------------------------
Account[] accounts = new account[]{new Account(name='foo'),new Account(name='bar')};
Insert accounts;
Savepoint sp=Database.setSavepoint();
delete accounts;
Database.rollback(sp);
------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: