??xml version="1.0" encoding="utf-8" standalone="yes"?>日本视频精品一区,国产专区一区,在线亚洲观看http://www.aygfsteel.com/stevech/category/6704.html襉K町学士关于Java的随便一说而已…?/description>zh-cnThu, 08 Mar 2007 02:41:02 GMTThu, 08 Mar 2007 02:41:02 GMT60对象数据库(ODBMSQ?db4o试用QJava versionQ?/title><link>http://www.aygfsteel.com/stevech/articles/26610.html</link><dc:creator>襉K町学?/dc:creator><author>襉K町学?/author><pubDate>Wed, 04 Jan 2006 14:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevech/articles/26610.html</guid><wfw:comment>http://www.aygfsteel.com/stevech/comments/26610.html</wfw:comment><comments>http://www.aygfsteel.com/stevech/articles/26610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevech/comments/commentRss/26610.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevech/services/trackbacks/26610.html</trackback:ping><description><![CDATA[<span id="BlogViewId">我觉得我现在中了两种毒:Java和SQL。西谚有云:When you have a hammer, everything looks like a nail。只要动手写E序Q头脑中不自觉地public class...其实很多时候一两行短的scripts可以了Q即使像在Windows上,我们也可以写jscript、wsh脚本。而在资料储存 上,关系数据库更是不二法宝。拿C个项目,我马上就要将它分解成各个TableQ我觉得SQL是如此强大和灉|Q以至于一见到O/R映射p得厌Ӟ? 到现在我也没有碰qHibernate?br>呵呵Q抱怨了半天Q与其在O/R映射中苦苦挣扎,不如跛_来看看其它的风景Q比如:ODBMSQ对象数据库Q。学士刚下蝲了db4oq个所谓对象数据库Q试着玩了一下,虽尚不知味之甘苦Q勉得以一Hv斑?br>db4o 目前是Version 5.0Q仅需要一个jar文gQ我用的支持JDK5的那个:db4o-5.0-java5.jar; 你如果用的其它版本的JDKQ有相对应的jar文g。这个jar文g是数据库,可不要想象成JDBC Driver之类的东东,JDBC Driver是RDBMSQ关pL据库Q才需要的东东Q呵c?br>好了Q闲话不_我们现在试试q个ODBMS。首先,Z个你惌保存的对象,我写了一个非常简单的Student.javaQ?br><br>public class Student {<br>    private String name;<br>    private int points;<br>    <br>    <br>    /** Creates a new instance of Student */<br>    public Student(String name, int points) {<br>        this.name = name;<br>        this.points = points;<br>    }<br>    <br>    public String getName() {<br>        return name;<br>    }<br>    <br>    public int getPoints() {<br>        return points;<br>    }<br>    <br>    public void addPoints(int points) {<br>        this.points += points;<br>    }<br>    <br>    public String toString() {<br>        return name + "/" + points;<br>    }<br>}<br><br>q个c非常简单,只有两个instance fieldsQ学生姓名和分数Q以及一些简单的methodsQ完全没有用M跟db4o相关的代码。然后我们就可以Student的实例放入数据库操作了:InsertObj2Db4o.javaQ?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> *<br> * @author Stevech<br> */<br>public class InsertObj2Db4o {<br>    <br>    /** Creates a new instance of InsertObj2Db4o */<br>    public InsertObj2Db4o() {<br>    }<br>    <br>    public static void main(String[] args) {<br>        ObjectContainer db = Db4o.openFile("student.yap");<br>        try {<br>            storeStudents(db);<br>            retrieveAllStudents(db);<br>            retrieveStudentByName(db);<br>            retrieveStudentByPoints(db);<br>            updateStudent(db);<br>            deleteStudent(db);<br>            descendStudents(db);<br>            retrievePartStudents(db);<br>        } finally {<br>            db.close();<br>        }<br>    }<br>    <br>    public static void storeStudents(ObjectContainer db) {<br>        Student bg = new Student("Bill Gates", 119);<br>        Student sm = new Student("Scott McNealy", 102);<br>        Student sj = new Student("Steve Jobs", 150);<br>        Student rs = new Student("Richard Stallman", 500);<br>        Student le = new Student("Larry Elison", 105);<br>        Student sc = new Student("Steve Cheng", 95);<br>        <br>        db.set(bg);<br>        db.set(sm);<br>        db.set(sj);<br>        db.set(rs);<br>        db.set(le);<br>        db.set(sc);<br>        <br>        System.out.println("Added " + bg + ", " + sm + ", " + sj);<br>        System.out.println("Added " + rs + ", " + le + ", " + sc);<br>    }<br>    <br>    public static void retrieveAllStudents(ObjectContainer db) {<br>        ObjectSet<Student> result = db.get(Student.class);<br>        listResult(result);<br>    }<br>    <br>    public static void retrieveStudentByName(ObjectContainer db) {<br>        Student proto = new Student("Bill Gates", 0); // Note: 0 is  default value for int<br>        ObjectSet<Student> result = db.get(proto);<br>        listResult(result);<br>    }<br>    <br>    public static void retrieveStudentByPoints(ObjectContainer db) {<br>        Student proto = new Student(null, 500);<br>        ObjectSet<Student> result = db.get(proto);<br>        listResult(result);<br>    }<br>    <br>    public static void updateStudent(ObjectContainer db) {<br>        ObjectSet<Student> result = db.get(new Student("Steve Cheng", 95));<br>        Student found = result.next();<br>        found.addPoints(10);<br>        db.set(found);<br>        retrieveAllStudents(db);<br>        System.out.println("Added 10 points for " + found);<br>    }<br>    <br>    public static void deleteStudent(ObjectContainer db) {<br>        ObjectSet<Student> result = db.get(new Student("Steve Cheng", 0));<br>        Student found = result.next();<br>        db.delete(found);<br>        retrieveAllStudents(db);<br>        System.out.println("Deleted " + found);<br>    }<br>    <br>    public static void descendStudents(ObjectContainer db) {<br>        Query query = db.query();<br>        query.constrain(Student.class);<br>        Query descendQuery = query.descend("points").orderDescending();<br>        ObjectSet<Student> result = query.execute();<br>        listResult(result);<br>    }<br>    <br>    public static void retrievePartStudents(ObjectContainer db) {<br>        List<Student> result = db.query(new Predicate<Student>() {<br>            public boolean match(Student s) {<br>                return s.getPoints() > 120 && s.getPoints() < 500 || s.getName().equals("Bill Gates");<br>            }<br>        });<br>        listResult(result);<br>    }<br>    <br>    public static void listResult(ObjectSet result) {<br>        //System.out.println(result.size());<br>        System.out.println("************************************");<br>        while(result.hasNext()) {<br>            System.out.println(result.next());<br>        }<br>    }<br>    <br>    public static void listResult(java.util.List result){<br>        //System.out.println(result.size());<br>        System.out.println("************************************");<br>        for(int x = 0; x < result.size(); x++)<br>            System.out.println(result.get(x));<br>    }    <br>}<br><br>我们一点一点地看:<br>? 先,与RDBMS一P我们需要连接到数据库。db4o可以q行为C/S模式Q或者叫Remote模式Q就像Oracle, PostgreSQL, MSSQLSERVER, etcQ,也可以是local模式Q或者叫embed模式Q。Borland的JDataStore也与此相|不同的是JDataStore? RDBMS。我们这里用local模式Q?br><br>        ObjectContainer db = Db4o.openFile("student.yap");<br><br>它打开当前目录下的student.yap文gQ也x据库文gQ,如果没有Q就自动新徏一个。然后,p往里面L据了Q?storeStudents method)<br><br>        Student bg = new Student("Bill Gates", 119);<br>    ...<br>        db.set(bg);<br><br>非常地简单?br>同样Q取出数据也是一样地单:(retrieveAllStudents method)<br><br>        ObjectSet<Student> result = db.get(Student.class);<br><br>先告诉dbQ一个ObjectContainer实例Q我们要取出数据的类型是StudentQ然后所有的Studentcd的数据就存在ObjectSet中了?br>现实中,l大多数时候我们只寚w些满特定条件的数据感兴,比如_我们对Bill Gates同学有极大的兴趣Q?retrieveStudentByName method)<br><br>        Student proto = new Student("Bill Gates", 0); // Note: 0 is  default value for int<br>        ObjectSet<Student> result = db.get(proto);<br><br>? 们先建立一个Student的模板,name为Bill GatesQ而pointsZQ意倹{然后将q个模板递给db卛_。值得注意的是q里pointsgؓ0Q这q不是我们希望Bill Gates同学的分Cؓ鸭蛋Q而仅仅因?是int的默认|如果q个参数是ObjectcdQ我们这里就会赋予它默认值nullQ参? retrieveStudentByPoints methodQ当指定的参Cؓ默认值时Q意味着我们不对它进行Q何限制。这l做模板的方法在db4o中称作QBE (Query by Example)Q由于显而易见的~点Q实际上往往我们使用的是另一U称作Native Queries的方法来选取数据Q见后面retrievePartStudents methodQ?br>现在Q我们觉得Steve Cheng同学太可怜了Q因为只有他的分数在100以下Q因此我们决定给他加?0分(上帝保佑你碰到这L教师Q:(updateStudent method)<br><br>        ObjectSet<Student> result = db.get(new Student("Steve Cheng", 95));<br>        Student found = result.next();<br>        found.addPoints(10);<br>        db.set(found);<br><br>? 们先Steve Cheng从数据库中取出来攑֜一个名为found的Student对象中,然后调用Student的instance method: addPoints(int points)来给found加上10分。然后,found重新攑օdb中。这完成了更新操作?br>? 们再来看看这个班U里的学生。“Oh, my God!?有h合不上嘴了,“这个班里全是大腕儿U的人物QBut wait, q个叫Steve Cheng的是什么东西啊Q竟然跟Bill Gates (RMSQ如果说话的人是GNU fellow的话)列在一赗强烈要求废了他Q!”顾客就是上帝,我们只得对不起Steve Cheng了,他从数据库中删除:(deleteStudent method)<br><br>        ObjectSet<Student> result = db.get(new Student("Steve Cheng", 0));<br>        Student found = result.next();<br>        db.delete(found);<br><br>与更新类|我们先得选出Steve Cheng攑ֈfound对象中,然后Qdb.delete(found)QSteve Cheng׃q个子虚乌有的班U中消失了?br>好了Q剩下的都是英雄好汉Q我们按他们各自的分数来l他们排座次Q这臛_比梁山好汉搞天降蝌蚪文排座次公^Q:(descendStudents method)<br><br>        Query query = db.query();<br>        query.constrain(Student.class);<br>        Query descendQuery = query.descend("points").orderDescending();<br>        ObjectSet<Student> result = query.execute();<br><br>q里的做法不同于QBE或是Native QueriyQ叫做SODA QueryQ是属于比较底层的方法,但还是很Ҏ看明白的。虽然没有Native Queriy那么易于使用Q但功能却是很强大的。因此在实际中一些地方还是需要用到SODA Query的?br>? 了ơ,我们要从_英之中选幸q儿d加由HAL公司赞助的夏令营zd了,只有那些成W介于120?00之间的才能获得这个天上掉的馅儉KQ(< 500Q这不是明显排斥RMS嘛)Q不q只要你是Bill Gates则不你成W如何你都能捡q个馅儿饼吃Q?Q)Q?retrievePartStudents method)<br><br>        List<Student> result = db.query(new Predicate<Student>() {<br>            public boolean match(Student s) {<br>                return s.getPoints() > 120 && s.getPoints() < 500 || s.getName().equals("Bill Gates");<br>            }<br>        });<br><br>q是一个典型的Native QueryQ这可是db4o大书特书引以为傲的东东)QPredicate是定义在import com.db4o.query.*里的一个抽象类Q?br>        public abstract class Predicate<ExtentType>extends java.lang.Objectimplements java.io.Serializable<br>? 义了public abstract boolean match(ExtentType candidate)Ҏ。如果这个方法返回trueQ则candidate被放入result中。而条件语句也是标准的Java语句Q如果?Net 则是标准?Net语句Q(而不是像RDBMS的SQLQ,q也是db4o自豪的地斏V?br>更多有关db4o的消息,误?a >http://www.db4o.com</a></span><img src ="http://www.aygfsteel.com/stevech/aggbug/26610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevech/" target="_blank">襉K町学?/a> 2006-01-04 22:10 <a href="http://www.aygfsteel.com/stevech/articles/26610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">⳵</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ĺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">üɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">»</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɫ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ɳƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>