﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Just Java IT-文章分类-Java</title><link>http://www.blogjava.net/stevech/category/6704.html</link><description>西门町学士关于Java的随便一说而已……</description><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 02:41:02 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 02:41:02 GMT</pubDate><ttl>60</ttl><item><title>对象数据库（ODBMS） db4o试用（Java version）</title><link>http://www.blogjava.net/stevech/articles/26610.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Wed, 04 Jan 2006 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/articles/26610.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/26610.html</wfw:comment><comments>http://www.blogjava.net/stevech/articles/26610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/26610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/26610.html</trackback:ping><description><![CDATA[<span id="BlogViewId">我觉得我现在中了两种毒：Java和SQL。西谚有云：When you have a hammer,
everything looks like a nail。只要动手写程序，头脑中不自觉地就public
class...其实很多时候一两行简短的scripts就可以了，即使像在Windows上，我们也可以写jscript、wsh脚本。而在资料储存
上，关系数据库更是不二法宝。拿到一个项目，我马上就要将它分解成各个Table，我觉得SQL是如此强大和灵活，以至于一见到O/R映射就觉得厌恶，直
到现在我也没有碰过Hibernate。<br>呵呵，抱怨了半天，与其在O/R映射中苦苦挣扎，不如跳出来看看其它的风景，比如：ODBMS（对象数据库）。学士刚下载了db4o这个所谓对象数据库，试着玩了一下，虽尚不知味之甘苦，勉得以一窥豹斑。<br>db4o
目前是Version 5.0，仅需要一个jar文件，我用的支持JDK5的那个：db4o-5.0-java5.jar;
你如果用的其它版本的JDK，有相对应的jar文件。这个jar文件就是数据库，可不要想象成JDBC Driver之类的东东，JDBC
Driver是RDBMS（关系数据库）才需要的东东，呵呵。<br>好了，闲话不说，我们现在试试这个ODBMS。首先，建一个你想要保存的对象，我写了一个非常简单的Student.java：<br><br>public class Student {<br>&nbsp;&nbsp;&nbsp; private String name;<br>&nbsp;&nbsp;&nbsp; private int points;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** Creates a new instance of Student */<br>&nbsp;&nbsp;&nbsp; public Student(String name, int points) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.points = points;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public String getName() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public int getPoints() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return points;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void addPoints(int points) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.points += points;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public String toString() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name + "/" + points;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>这个类非常简单，只有两个instance fields，学生姓名和分数，以及一些简单的methods，完全没有用任何跟db4o相关的代码。然后我们就可以将Student的实例放入数据库操作了：InsertObj2Db4o.java：<br><br>import java.io.File;<br>import java.util.List;<br><br>import com.db4o.Db4o;<br>import com.db4o.ObjectContainer;<br>import com.db4o.ObjectSet;<br>import com.db4o.query.*;<br><br>/**<br>&nbsp;*<br>&nbsp;* @author Stevech<br>&nbsp;*/<br>public class InsertObj2Db4o {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** Creates a new instance of InsertObj2Db4o */<br>&nbsp;&nbsp;&nbsp; public InsertObj2Db4o() {<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectContainer db = Db4o.openFile("student.yap");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; storeStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrieveAllStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrieveStudentByName(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrieveStudentByPoints(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updateStudent(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteStudent(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; descendStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrievePartStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void storeStudents(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student bg = new Student("Bill Gates", 119);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student sm = new Student("Scott McNealy", 102);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student sj = new Student("Steve Jobs", 150);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student rs = new Student("Richard Stallman", 500);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student le = new Student("Larry Elison", 105);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student sc = new Student("Steve Cheng", 95);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(bg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(sm);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(sj);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(rs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(le);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(sc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Added " + bg + ", " + sm + ", " + sj);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Added " + rs + ", " + le + ", " + sc);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void retrieveAllStudents(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(Student.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listResult(result);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void retrieveStudentByName(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student proto = new Student("Bill Gates", 0); // Note: 0 is&nbsp; default value for int<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(proto);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listResult(result);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void retrieveStudentByPoints(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student proto = new Student(null, 500);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(proto);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listResult(result);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void updateStudent(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(new Student("Steve Cheng", 95));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student found = result.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found.addPoints(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(found);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrieveAllStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Added 10 points for " + found);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void deleteStudent(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(new Student("Steve Cheng", 0));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student found = result.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.delete(found);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrieveAllStudents(db);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Deleted " + found);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void descendStudents(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = db.query();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.constrain(Student.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query descendQuery = query.descend("points").orderDescending();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = query.execute();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listResult(result);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void retrievePartStudents(ObjectContainer db) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Student&gt; result = db.query(new Predicate&lt;Student&gt;() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean match(Student s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.getPoints() &gt; 120 &amp;&amp; s.getPoints() &lt; 500 || s.getName().equals("Bill Gates");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listResult(result);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void listResult(ObjectSet result) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(result.size());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("************************************");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(result.hasNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result.next());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void listResult(java.util.List result){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println(result.size());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("************************************");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int x = 0; x &lt; result.size(); x++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(result.get(x));<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>}<br><br>我们一点一点地看：<br>首
先，与RDBMS一样，我们需要连接到数据库。db4o可以运行为C/S模式（或者叫Remote模式，就像Oracle, PostgreSQL,
MSSQLSERVER,
etc），也可以是local模式（或者叫embed模式）。Borland的JDataStore也与此相似，不同的是JDataStore是
RDBMS。我们这里用local模式：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectContainer db = Db4o.openFile("student.yap");<br><br>它打开当前目录下的student.yap文件（也即数据库文件），如果没有，就自动新建一个。然后，就该往里面添数据了：(storeStudents method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student bg = new Student("Bill Gates", 119);<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(bg);<br><br>非常地简单。<br>同样，取出数据也是一样地简单：(retrieveAllStudents method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(Student.class);<br><br>先告诉db（一个ObjectContainer实例）我们要取出数据的类型是Student，然后所有的Student类型的数据就存在ObjectSet中了。<br>现实中，绝大多数时候我们只对那些满足特定条件的数据感兴趣，比如说，我们对Bill Gates同学有极大的兴趣：(retrieveStudentByName method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student proto = new Student("Bill Gates", 0); // Note: 0 is&nbsp; default value for int<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(proto);<br><br>我
们先建立一个Student的模板，name为Bill
Gates，而points为任意值。然后将这个模板递给db即可。值得注意的是这里points值为0，这并不是我们希望Bill
Gates同学的分数为鸭蛋，而仅仅因为0是int的默认值，如果这个参数是Object类型，我们这里就会赋予它默认值null（参见
retrieveStudentByPoints
method）当指定的参数为默认值时，意味着我们不对它进行任何限制。这给做模板的方法在db4o中称作QBE (Query by
Example)，由于显而易见的缺点，实际上往往我们使用的是另一种称作Native
Queries的方法来选取数据（见后面retrievePartStudents method）<br>现在，我们觉得Steve Cheng同学太可怜了，因为只有他的分数在100以下，因此我们决定给他加上10分（上帝保佑你碰到这样的教师）：(updateStudent method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(new Student("Steve Cheng", 95));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student found = result.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found.addPoints(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.set(found);<br><br>我
们先将Steve Cheng从数据库中取出来放在一个名为found的Student对象中，然后调用Student的instance
method: addPoints(int points)来给found加上10分。然后，将found重新放入db中。这就完成了更新操作。<br>我
们再来看看这个班级里的学生。“Oh, my God!” 有人合不上嘴了，“这个班里全是大腕儿级的人物！But wait, 这个叫Steve
Cheng的是什么东西啊？竟然跟Bill Gates (RMS，如果说话的人是GNU
fellow的话)列在一起。强烈要求废了他！！”顾客就是上帝，我们只得对不起Steve
Cheng了，将他从数据库中删除：(deleteStudent method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = db.get(new Student("Steve Cheng", 0));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student found = result.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.delete(found);<br><br>与更新类似，我们先得选出Steve Cheng放到found对象中，然后，db.delete(found)，Steve Cheng就从这个子虚乌有的班级中消失了。<br>好了，剩下的都是英雄好汉，我们按他们各自的分数来给他们排座次（这至少比梁山好汉搞天降蝌蚪文排座次公平）：(descendStudents method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = db.query();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.constrain(Student.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query descendQuery = query.descend("points").orderDescending();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectSet&lt;Student&gt; result = query.execute();<br><br>这里的做法不同于QBE或是Native Queriy，叫做SODA Query，是属于比较底层的方法，但还是很容易看明白的。虽然没有Native Queriy那么易于使用，但功能却是很强大的。因此在实际中一些地方还是需要用到SODA Query的。<br>排
了座次，我们要从精英之中选幸运儿去参加由HAL公司赞助的夏令营活动了，只有那些成绩介于120到500之间的才能获得这个天上掉的馅儿饼，（&lt;
500，这不是明显排斥RMS嘛），不过只要你是Bill
Gates则不管你成绩如何你都能捡这个馅儿饼吃（？？）：(retrievePartStudents method)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Student&gt; result = db.query(new Predicate&lt;Student&gt;() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean match(Student s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.getPoints() &gt; 120 &amp;&amp; s.getPoints() &lt; 500 || s.getName().equals("Bill Gates");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br><br>这是一个典型的Native Query（这可是db4o大书特书引以为傲的东东），Predicate是定义在import com.db4o.query.*里的一个抽象类：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract class Predicate&lt;ExtentType&gt;extends java.lang.Objectimplements java.io.Serializable<br>定
义了public abstract boolean match(ExtentType
candidate)方法。如果这个方法返回true，则candidate被放入result中。而条件语句也是标准的Java语句（如果使用.Net
则是标准的.Net语句）（而不是像RDBMS的SQL），这也是db4o自豪的地方。<br>更多有关db4o的消息，请访问<a href="http://www.db4o.com/">http://www.db4o.com</a></span><img src ="http://www.blogjava.net/stevech/aggbug/26610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2006-01-04 22:10 <a href="http://www.blogjava.net/stevech/articles/26610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>