DB4O?
新出的OODBMS~取谐音DB for O 。一个优秀的OODBMS解决方案,它出现的定位就是为了开发嵌入式和小型应用,同HSQLDB的定位相仿。不过DB4O的的优点则是,本身是OODBMS,那么对它的操作自然就是基于OO的,同Hiberante一样,但是Hiberante是ORM解决方案,而DB4O则是原生OODBMS方案。看看下面的例子
一个同Hibernate相同的POJO,没有任何方法,也没有跟DB4O有任何耦合。
在看,DB4O的解决方案:
对于不需要使用大型DB,但又需要存储数据的时候不需要再用hibernate+hsqldb了,只需要使用DB4O,就全带了,又有简单的数据库操作,又有数据的存储,还有数据完整性的保证,简单方便,何乐不为呢?RCP开源项目著名的RSSOWL在2.0中也已经把原有的hiberante+hsqldb替换为DB4O的解决方案了。
虽然OODBMS的路还有很长,而且就现在看,和RDBMS还有很长的距离,但是从DB4O上,我们还是看到了希望。在DB4O的眼中Hibernate,jdo等等都是暂时的解决方案,对于OODBMS来说ORM本来就是不存在的东西,ORM仅仅是为了解决RDBMS到OO的映射,而OODBMS本来就是原生的,免去了中间层,免去了烦恼。
下载 db4o:这是一种用于 Java 的开源对象数据库。
新出的OODBMS~取谐音DB for O 。一个优秀的OODBMS解决方案,它出现的定位就是为了开发嵌入式和小型应用,同HSQLDB的定位相仿。不过DB4O的的优点则是,本身是OODBMS,那么对它的操作自然就是基于OO的,同Hiberante一样,但是Hiberante是ORM解决方案,而DB4O则是原生OODBMS方案。看看下面的例子
一个同Hibernate相同的POJO,没有任何方法,也没有跟DB4O有任何耦合。
1
package
name.lgn.db4o.test.model;
2![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3![ExpandedBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
class
Person
{
4![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
5
private String firstName;
6![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
7
private String lastName;
8![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
9
private int age;
10![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
11![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public Person(String firstName, String lastName, int age)
{
12
this.firstName = firstName;
13
this.lastName = lastName;
14
this.age = age;
15
}
16![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
17![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getFirstName()
{
18
return firstName;
19
}
20![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
21![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setFirstName(String value)
{
22
firstName = value;
23
}
24![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
25![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getLastName()
{
26
return lastName;
27
}
28![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
29![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setLastName(String value)
{
30
lastName = value;
31
}
32![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
33![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public int getAge()
{
34
return age;
35
}
36![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
37![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setAge(int value)
{
38
age = value;
39
}
40![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
41
}
42
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
2
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
![ExpandedBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
4
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
5
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
6
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
7
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
8
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
9
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
10
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
11
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
12
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
13
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
14
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
15
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
17
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
18
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
19
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
21
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
22
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
23
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
25
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
26
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
27
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
29
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
30
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
31
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
32
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
33
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
34
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
35
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
37
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
38
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
39
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
41
![ExpandedBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
42
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
在看,DB4O的解决方案:
1
package
name.lgn.db4o.test;
2![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
import
name.lgn.db4o.test.model.Person;
4![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
5
import
org.junit.Test;
6![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
7
import
com.db4o.Db4o;
8
import
com.db4o.ObjectContainer;
9
import
com.db4o.ObjectSet;
10![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
11![ExpandedBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
class
TestDB4O
{
12![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
13
@Test
14![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void testDB()
{
15
ObjectContainer db = null;
16![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
17
db = Db4o.openFile("persons.data");
18![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
19
Person brian = new Person("Brian", "Goetz", 39);
20
Person jason = new Person("Jason", "Hunter", 35);
21
Person clinton = new Person("Brian", "Sletten", 38);
22
Person david = new Person("David", "Geary", 55);
23
Person glenn = new Person("Glenn", "Vanderberg", 40);
24
Person neal = new Person("Neal", "Ford", 39);
25![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
26
db.set(brian);
27
db.set(jason);
28
db.set(clinton);
29
db.set(david);
30
db.set(glenn);
31
db.set(neal);
32![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
33
db.commit();
34![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
35
// Find all the Brians
36
ObjectSet brians = db.get(new Person("Brian", null, 0));
37
while (brians.hasNext())
38
System.out.println(brians.next());
39![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
40![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception e)
{
41
e.printStackTrace();
42![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} finally
{
43
if (db != null)
44
db.close();
45
}
46![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
47
}
48
}
49
存入数据用db.set(...);取出数据用db.get(...),是不是非常亲切和简单?
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
2
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
4
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
5
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
6
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
7
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
8
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
9
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
10
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
11
![ExpandedBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
12
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
13
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
14
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
15
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
16
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
17
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
18
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
19
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
20
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
21
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
22
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
23
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
24
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
25
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
27
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
28
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
29
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
30
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
31
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
32
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
33
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
34
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
35
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
36
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
37
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
38
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
39
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
40
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
41
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
42
![ExpandedSubBlockStart.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.blogjava.net/Images/dot.gif)
43
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
44
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
45
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
46
![InBlock.gif](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
47
![ExpandedSubBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![ExpandedBlockEnd.gif](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
49
![None.gif](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
对于不需要使用大型DB,但又需要存储数据的时候不需要再用hibernate+hsqldb了,只需要使用DB4O,就全带了,又有简单的数据库操作,又有数据的存储,还有数据完整性的保证,简单方便,何乐不为呢?RCP开源项目著名的RSSOWL在2.0中也已经把原有的hiberante+hsqldb替换为DB4O的解决方案了。
虽然OODBMS的路还有很长,而且就现在看,和RDBMS还有很长的距离,但是从DB4O上,我们还是看到了希望。在DB4O的眼中Hibernate,jdo等等都是暂时的解决方案,对于OODBMS来说ORM本来就是不存在的东西,ORM仅仅是为了解决RDBMS到OO的映射,而OODBMS本来就是原生的,免去了中间层,免去了烦恼。
下载 db4o:这是一种用于 Java 的开源对象数据库。