对于这个问题已经有一些解决方案,例如Hibernate和Java Data Objects,他们为开发者提供了透明的持久性——应用程序只需使用面向对象的API处理持久性的对象,而不需要在Java代码中嵌入SQL语句。对于EJB的容器来说,容器治理的持久性(CMP)做了类似的工作,但是对Java平台来说这不是一个一般的持久性工具。在任何这些解决方案中,对象通过底层框架被映射关系数据库中的表,这些底层的框架生成SQL所需要存取的对象的属性。也就是说,对象模型越复杂,这种映射就越困难。我们所用的描述符,通常使用xml文件,来定义这种映射关系。继续和多对多的关系,尤其是一些关系模型无法直接表示的关系增加了映射复杂度。继续的结构可以有不同的方式被映射到一组表中,选择何种方式就需要在储存的效率和查询的复杂度上权衡,就如一个单独的表要实现一个多对多的关系一样。
Db4o已经被一些嵌入式系统的应用程序所选用,这些程序特点都是要求零治理、高可靠性和低功耗的。例如,在德国,BMW Car IT在汽车嵌入式系统电子原型中使用了它。同样是德国的Die Mobilanten,他们在中型公共事业的PDA解决方案中使用了db4o。在美国,Massie Systems为婴儿眼睛诊断的视网膜图像处理系统依靠db4o加强其客户交流图像数据库。
Player class public class Player { protected String name; protected int squadNumber; protected float battingAverage; protected Team team; public Player(String name, int squadNumber, float battingAverage){ this.name = name; this.squadNumber = squadNumber;
this.battingAverage = battingAverage; } public void setName(String n){this.name = n;} public String getName(){return this.name;} public void setSquadNumber(int s){this.squadNumber = s;} public int getSquadNumber(){return this.squadNumber;} public void setBattingAverage(final float b) { this.battingAverage = b; } public float getBattingAverage(){ return this.battingAverage;} public void setTeam(Team t) {this.team = t;} public Team getTeam() {return this.team;} public String toString() { return name + ":" + battingAverage; } }
Pitcher class public class Pitcher extends Player{
private int wins;
public Pitcher(String name, int squadNumber, float battingAverage, int wins) { super(name,squadNumber,battingAverage); this.wins = wins; } public void setWins(final int w){this.wins = w;} public int getWins() {return this.wins;} public String toString() { return name + ":" + battingAverage + ", " + wins; } }
Team class import java.util.List; import java.util.ArrayList; public class Team { private String name; private String city;
private int won;
private int lost; private List players; public Team(String name, String city, int won, int lost){ this.name = name; this.city = city; this.won = won; this.lost = lost; this.players = new ArrayList(); } public void addPlayer(Player p) { players.add(p); } public void setName(String n){this.name = n;} public String getName(){return this.name;}
public void setStadium(String c){this.city = c;} public String getCity(){return this.city;} public void setPlayers(List p){players = p;} public List getPlayers(){return players;} public void setWon(int w) {this.won = w;} public int getWon(){return this.won;} public void setLost(int l) {this.lost = l;} public int getLost() {return this.lost;} public String toString() { return name; } }
首先,我们来建立一些测试数据。
// Create Players Player p1 = new Player("Barry Bonds", 25, 0.362f); Player p2 = new Player("Marquis Grissom", 9, 0.279f); Player p3 = new Player("Ray Durham", 5, 0.282f); Player p4 = new Player("Adrian Beltre", 29, 0.334f); Player p5 = new Player("Cesar Izturis", 3, 0.288f); Player p6 = new Player("Shawn Green", 15, 0.266f); // Create Pitchers Player p7 = new Pitcher("Kirk Rueter",46, 0.131f, 9); Player p8 = new Pitcher("Kazuhisa Ishii",17, 0.127f, 13); // Create Teams Team t1 = new Team("Giants", "San Francisco", 91, 71); Team t2 = new Team("Dodgers", "Los Angeles", 93, 69); // Add Players to Teams t1.addPlayer(p1); p1.setTeam(t1); t1.addPlayer(p2); p2.setTeam(t1); t1.addPlayer(p3); p3.setTeam(t1); t2.addPlayer(p4); p4.setTeam(t2); t2.addPlayer(p5); p5.setTeam(t2); t2.addPlayer(p6); p6.setTeam(t2); // Add Pitchers to Teams t1.addPlayer(p7); p7.setTeam(t1); t2.addPlayer(p8); p8.setTeam(t2);
Player examplePlayer = new Player(null,0,0f); ObjectSet result=db.get(examplePlayer); System.out.println(result.size()); while(result.hasNext()) { System.out.println(result.next()); }
结果如下:
8 Kazuhisa Ishii:0.127, 13 Shawn Green:0.266 Cesar Izturis:0.288 Adrian Beltre:0.334 Kirk Rueter:0.131, 9 Ray Durham:0.282 Marquis Grissom:0.279 Barry Bonds:0.362
Player examplePlayer = new Player("Shawn Green",0,0f); ObjectSet result = db.get(examplePlayer); Player p = (Player) result.next(); p.setBattingAverage(0.299f); db.set(p);
数据库的对象也可以以同样的方式被删除。
Player examplePlayer = new Player("Ray Durham",0,0f); ObjectSet result = db.get(examplePlayer); Player p = (Player) result.next(); db.delete(p);
System.out.println(result.size()); while(result.hasNext()) { // Print Player Player p = (Player) result.next(); System.out.println(p); // Getting Player also gets Team - print Team Team t = p.getTeam(); System.out.println(t); }
输出:
2 Adrian Beltre:0.334 Dodgers Barry Bonds:0.362 Giants
现在的查询十分类似SQL语言查询,如下:
SELECT teams.name, players.name, players.battingAverage FROM teams, players WHERE teams.teamID = players.playerID AND battingAverage > 0.3