JDO学习笔记(一)
查询你的数据
在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 针对数据库中所有特定持久类进行查询