salesforce中對於數據庫操作和JAVA等語言對於數據庫操作是有一定區別的。salesforce中的數據庫使用的是Force.com 平台的數據庫,數據表一行數據可以理解成一個sObject變量。接下來主要講解一下sObject以及單表的簡單DML操作。
詳細了解sObject以及DML操作請參看官方PDF文檔或查看下方鏈接進行參考:
https://developer.salesforce.com/trailhead/en/module/apex_database
一)sObject
通過上面的描述,可能很多人都會雲里霧里,沒有理解什么是sObject.看一下官方的定義:sObject指的是存儲在Force.com 平台數據庫中的任何的對象。sObject變量代表一行數據並且在Apex中只能使用SOAP API對象名稱中聲明的一行數據。比如在Force.com 數據庫中有Account數據表,表相對應的API 名稱為Account(圖1),則
Account account1 = new Account();//account1則為一個sObject對象。
圖1 圖2
Force.com 平台數據庫操作不像平時大家比較熟知的數據庫,比如Oracle,SqlServer,MySql等。
當在salesforce中新建一個數據表時,操作步驟如下所示:
1.使用賬號登錄自己的salesforce主頁,點擊setup-->點擊左側Build-->點擊Create-->點擊Objects,或者在上方搜索欄直接搜索Objects(圖2);
2.點擊右側主頁面信息的New Custom Object;
3.在Label中輸入要建立的數據庫的名稱,比如創建Student,則在Label中輸入Student,鼠標指向Object Name 則自動填充Student,點擊save按鈕(圖3);
4.創建Student表成功(圖4),其API Name被平台自動設置為Student__c 。
圖3
圖4
現在主要看一下圖4,當Student表創建成功的時候,API Name 賦值為Student__c,這個則為Student表的sObject對象,即Student__c對象為Student表的一行記錄的引用。當我想查詢或者操作Student表數據時,可以通過Student__c對象操作。舉個例子,當Student表中有一個Name字段時,其Name字段的API Name 為Name__c,則:
Student__c student = new Student__c(); student.Name__c = 'zero.zhang'; insert student;
通過上面三行代碼則執行了student表一行數據的插入。相信通過上述例子大家對於sObject有了一個較好的了解。
既然了解了sObject是什么,如何操作,接下來考慮如何創建數據表中的列。創建數據表中的列通過如下步驟:
1)通過點擊圖2中的Objects,找到Label為Student的表,並點擊進入(圖5);
2)拖動到下方Custom Fields & Relationships模塊點擊new(圖6),其中圖6中上面Standard Fields為系統創建的列,詳情參見官方文檔;
3)選擇Data Type,即數據列的類型,這些類型以后會單獨講解,選擇Text類型,然后下一步;
4)Field Label 輸入Name,鼠標移動到Field Name則自動輸入Name,Length設置為50,(圖7)接下來均為默認操作next,直到點擊save按鈕;
5)保存以后可以在Custom Fields & Relationships模塊中看到新建的Name列,其API Name為Name__c(圖8),如果想要建立多個列,請重復操作以上步驟。
圖5
圖6 圖7
圖8
二)SOQL
SOQL全稱為Salesforce Object Query Language.通過SOQL語句可以操作sObject的增刪改查等操作。下面還是以上面Student表進行舉例。
Student表的API Name 為Student__c,所以在apex中,只要對Student__c對象進行相應的DML操作,即為對Student數據表操作。
注:apex代碼通過操作表以及列對應的API Name來對表進行增刪改查操作處理。
/*sObject有常用的兩種初始化方式,第一種為常見的new 第二種為new時將參數作為構造函數內容穿進去,多個參數使用','分隔 */ Student__c student1 = new Student(Name__c='student1'); Student__c student2 = new Student(); student2.Name__c = 'student2'; //增加一條學生記錄--> insert insert student1;//SOQL 增加記錄的簡便寫法,同Database.insert(student1),詳見文檔 insert student2; //修改一條學生記錄--> update student1.Name__c = 'student update'; update student1;//SOQL修改記錄簡便寫法,同Database.update(student1) /*增加或修改一條學生記錄 upsert upsert原理:upsert通過是否存在此ID來判斷此條記錄是否存在, 1.如果不存在此ID則執行insert操作; 2.如果存在並且只存在一個ID,則執行update操作; 3.存在並且存在多個ID,則拋出DMLException */ //當上方執行insert語句時,Id便賦予student1,所以下方代碼執行update操作 student1.Name__c = 'student upsert'; upsert student1;//SOQL簡便寫法,同Database.upsert(student1); //刪除一條學生記錄 delete delete student2;//SOQL簡便寫法,同Database.delete(student2); 注意:進行DML 操作時有可能發生DMLException,所以在進行DML操作時最好進行try,catch處理。 eg: try { insert student1; } catch(DMLException e) { // TODO } finally { // TODO }
查詢語句返回List<sObject>數據,查詢語句也可以進行相應的復雜處理,例如進行where查詢,include,exclude,limit等等操作,此部分內容太多,此篇只講述最基本的查詢操作,以后篇會詳細探討SOQL語句細節以及多表關聯的查詢等操作。
where語句中經常伴隨着參數傳遞,比如查詢學生表中姓名為zhangsan的個數等,如果采用拼串很容易造成錯誤,並且代碼不易閱讀。Apex提供了一種便捷的方式,使用 ':' 符號來聲明查詢語句中使用的變量,類似於Java中的PreparedStatement。
查詢有兩種方式,一種為通過[select ...]方式來進行查詢,此種方式不利於SQL語句的拓展,故不推薦此種方式;
第二種方式為通過構造查詢字符串,通過Database.query(queryString)方法來檢索數據,此種方式靈活性擴展性強,推薦此種方式。
另外注意的是:在Force.com平台數據庫中,查詢不能使用'*'符號代表查詢全部字段,如果查詢全部字段需要全部列出來。
Student表表結構如下圖所示,分為系統自定義的列以及用戶自己聲明的列。
查詢語句例子如下:
//查詢列表 String args1 = '%zhang%'; String args2 = 'zhangsan'; List<Student__c> students = [select Id,Name__c from Student__c where Name__c like :args1 limit 10000];//查詢名稱含zhang的學生列表 /* 上述語句等同與: String query = 'select Id,Name__c from Student__c where Name__c like :args1 limit 10000'; List<Student__c> students = Database.query(query); */ //查詢表數據條數 String countQuery = 'select count(Id) from Student__c where Name__c = :args2 ';//查詢名稱為zhangsan的學生個數 Integer studentsCount = Database.countQuery(countQuery);
注意:salesforce對查詢記錄條數以及DML操作次數均有嚴格的限制:查詢條數一次不能超過50000條,DML操作一次不能超過10000次,如果超過限制則拋異常。如果需要大量的進行DML操作,請使用批處理方式進行數據處理。
本篇所列出的SOQL操作只是冰山一角,SOQL在開發中所占比重很大,所以希望本篇起到拋磚引玉作用,供初學者入門。初學者如果想要深入詳細了解此部分內容請詳細查看官方文檔進行學習sObject以及SOQL相關知識。如果對本篇內容描述有錯誤的地方,請及時指正,歡迎大家共同探討,謝謝。下一篇將會講解多表關聯下的SOQL以及SOQL查詢深入知識。