在一個Web項目中,只要是存在數據庫就一定會有JavaBean文件。
一個JavaBean文件會對應一張數據庫中的表,供dao中的代碼來調用用來存取數據。
我們都知道,在數據庫設計的時候,如果A、B兩張表存在一對多的關係,一定會將一那方的主鍵設置爲多一方的外鍵來建立關聯關係
比如說在一個博客中,用戶(user)和文章(article)就存在這一對多的關係(一個用戶可以發表多篇文章)
在CDM概念數據模型設計的時候:
將兩個實體體現出一對多的關係。
當轉換爲PDM邏輯數據模型的時候:
在這裏就出現了外鍵的關聯關係
那麼在Web項目中的JavaBean文件應該如何建立它們之間的關聯關係呢?
一般來講我們通常會這樣做:
//User表對應的JavaBean文件
public class User {
private int userId;
private String username;
private . . . . . .;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
. . .
}
//Article表對應的JavaBean文件
public class Article {
private int articleId;
private String articlename;
private int userId;
private . . . . . .;
public int getArticleId() {
return articleId;
}
public void setArticleId(int articleId) {
this.articleId = articleId;
}
public String getArticlename() {
return articlename;
}
public void setArticlename(String articlename) {
this.articlename = articlename;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId =userId;
}
}
但是如果我們有一種需求:需要在一個用登錄之後將這個用戶發表過的文章都顯示出來並需要顯示出來作者的姓名。
可能有的人會想到,這很簡單啊:
先將登錄的用戶信息都存入session中,然後先根據session中userId將文章都查出來,由於查的是當前登錄人的文章,直接把session中的username顯示到作者姓名的位置就ok了。
這樣做當然可以滿足這個需求。但是變換一下。同樣的,現在需要顯示所有用戶發表的文章(類似博文推薦或者最近更新),也需要顯示出作者的姓名,我們該怎麼辦呢?總不能查出一篇文章,然後再根據相應的userId去上User表中查出該用戶的username吧。這樣不僅效率不高,而且也很不合理。
並且,有很重要的一點:
在基礎的Web項目中,基本的文件規劃應該是:
各個部分功能大致是這樣的:
bean包中爲JavaBean文件,用於對數據的存取操作
dao中定義一系列業務邏輯操作需要的數據庫增刪改查操作需要的接口
dao.impl中爲dao的實現類
service中爲一些業務邏輯實現方法
servlet中爲一些Servlet文件,用來接收jsp中傳遞過來的參數值,然後調用service中的方法進行業務處理,最後進行頁面跳轉
.jsp文件只負責顯示
現在看來,如果繼續原來在JavaBean中也用userId的方式關聯各個JavaBean文件的方式就不可行了。
因爲 .jsp 文件只是用來負責查詢結果的,如果是這樣,我們又該如何將username也隨着article列表傳送過來呢?
也許,又有人會想到: 我們可以在Article表中增加一個字段writerName來存儲作者姓名的啊。這樣當然是可以的。
不過,我們現在的需求是需要得到username,我們加一個writerName字段來接收,那如果我們哪天又多了個需求,需要再得到User中的其它字段該怎麼辦呢?
到現在,我們還忘記一件事情:
在Java中有一個很重要的概念、也是一個很不好理解透徹的概念:面向對象的思想
之前的方法無法將面向對象的思想體現出來,那我們現在就換一個方法:
剛纔我們考慮到,用增加字段來解決問題。
同樣的,如果我們將User中的所有屬性都添加到的Article中,我們爲何不在Article中建立一個User類型的對象來存儲這些信息呢!
所以,我們可以將Article改善成:
public class Article {
private int articleId;
private String articlename;
private User writer;
private . . . . . .;
public int getArticleId() {
return articleId;
}
public void setArticleId(int articleId) {
this.articleId = articleId;
}
public String getArticlename() {
return articlename;
}
public void setArticlename(String articlename) {
this.articlename= title;
}
public User getWriter() {
return writer;
}
public void setWriter(User writer) {
this.writer = writer;
}
. . .
}
這樣我們將一個User對象存入到Article中,我們就可以利用User中的任意屬性了。
那User中是否需要改善呢?
那當然需要了。
就像我們第一個需求一樣,當一個用戶登錄的時候,將其所有發表過的文章都顯示出來。
如果也考慮到面向對象的思想,我們應該進行這樣的改善:
public class User {
private int userId;
private String username;
private ArrayList<Article> articles = new ArrayList<Article>();
private . . . . . . ;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public ArrayList<Article> getArticles() {
return articles;
}
public void setArticles(ArrayList<Article> articles) {
this.articles = articles;
}
}
將該用戶發表的文章,以一個列表的方式存放在User中,這樣就可以很方便的將所需信息取出來了。
綜上所述:
在數據庫表中一對多的關聯是利用外鍵的方式
而在JavaBean中,這些文件之間一對多的關聯是:
在一的一方建立一個多一方的列表
在多的一方建立一個一一方的對象