JDO學習筆記(一)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
查詢你的數據
在JDO API中和查詢相關密切的有兩個接口(它們的具體實現由JDO產品來完成):
java.jdo.Query
========================
該接口的實例是由另一個接口PersistenceManager來創建的,在JDO中PersistenceManager是一個比較重要的接口,我們所有的事務處理都是通過該接口來定義的。
PersistenceManager接口有一組newQuery方法來產生Query的實例:
public Query newQuery()
public Query newQuery(java.lang.Class cls
)
public Query newQuery(java.lang.Class cls, java.util.Collection cln
)
public Query newQuery(java.lang.Class cls,
java.util.Collection cln,
java.lang.String filter
)
public Query newQuery(java.lang.Class cls, java.lang.String filter
)
public Query newQuery(Extent cln
)
public Query newQuery(Extent cln, java.lang.String filter
)
public Query newQuery(java.lang.Object compiled
)
public Query newQuery(java.lang.String language, java.lang.Object query
)
有查詢就要有返回結果,Query接口裏一組execute方法來返回查詢的結果:
public Object execute()
public Object execute(java.lang.Object p1
)
public Object execute(java.lang.Object p1, java.lang.Object p2
)
public Object execute(java.lang.Object p1,
java.lang.Object p2,
java.lang.Object p3
)
通常我不用上邊的方法,特別是在綜合查詢的時候,我比較喜歡下面兩個方法來返回查詢結果:
public Object
excuteWithArray(java.lang.Object[] parameters)
public Object excuteWithMap(java.util.Map parameters)
當然如果是非常簡單條件的查詢,上邊四種方法可以搞定就不要用後兩種方法,後兩種方法要自己構造數組或者集合。
個人認爲上述執行查詢方式跟java.sql.
PreparedStatement差不多都是要爲指定的“參數”賦值;如p1,p2,p3,array啦,map啦其中存放的都是前面需要指定的參數的值,跟PreparedStatement它們的順序要和定義參數的順序一樣。
要注意的是
l Array參數集合中數組的順序很定義參數的順序要一致。
l Map參數集合中的key爲參數的名稱,value爲參數的值
上邊已經開始提及帶參數的查詢了,是的,Query接口中定義了引入參數的方法:
public void declareParameters(java.lang.String parameters)
如果事多了參數的情況要用逗號隔開。
JDO的查詢方式不光可以引入參數,同時可以引入變量以及其他的類,下面分別是引入變量和引入類的方法,其語法和一般JAVA語法沒什麼差別:
引入變量,當引入多個變量的時候中間用分號隔開
public void declareVariables(java.lang.String
variables)
例子:public void declareVariables(“Student students;Teacher teacher1”);
引入類,當引入多個類的時候,跟字符串的連接方式差不多,不好說明,看例子吧:
public void declareImports(java.lang.String
imports)
例子:public void declareImports(“import java.util.Date;”+”import com.yourname.Student”);
既然查詢就要存在查詢條件,Query接口定義了過濾條件的方法:serFilter()
public void setFilter(java.lang.String filter)
filter的寫法跟sql中where語句中的條件寫法思想應該一樣的,如查詢條件爲:找出學生中姓李的,那麼寫法如下:
query.setFilter(“name.startsWith(startname)”);
並同時找出性別等於女的,寫法改爲:
query.setFilter(“name.startsWith(startname) && sex==it_sex”);
JDO中關於字符串的操作函數,我怎麼只見startsWith和endsWith啊,這樣的話如何對字符串進行更模糊的查詢啊?望指教?
JDO查詢中同樣也提供了排序方法,setOrdering 如下:
Public void setOrdering(java.lang.String ordering)
如按照學生的年齡排序:
query.setOrdering(“age ascending”); 升序
query.setOrdering(“age descending”);降序
如果多個排序條件,如按年齡的大小,身高的高低:
query.setOrdering(“age ascending,”+” stature descending”);
java.jdo.Extend
========================
該接口的實例代表當前數據庫中存在的所有的類對象。它也是由接口PersistenceManager來創建的,如下:
public Extent getExtent(Class persistenceCapableClass, boolean subclasses)
參數subclass的真假表示含有第一個參數類的子類:真,表示包括子類;假,不包括子類。
可能有兩個地方要用到Extend實例
l 得到特定持久類的一個集合。
l 針對數據庫中所有特定持久類進行查詢