在一个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中,这些文件之间一对多的关联是:
在一的一方建立一个多一方的列表
在多的一方建立一个一一方的对象