关于数据库,这种情况代码一般怎么组织?
我这个系统里有栏目(Column)和文章(Article)两个类,每个文章都是存在数据库里的一条记录。为了方便,我给Article类写了个getInstance()方法,代码如下:
public static Article getInstance(DBO dbo,int aid) {
Article article = null;
String str = "select * from article where aid=" + aid;
ResultSet rs = dbo.executeQuery(str);
try {
if (rs.next()) {
article = new Article();
article.setId(aid);
article.setTitle(rs.getString("title"));
article.setAuthor(rs.getString("author"));
article.setSource(rs.getString("source"));
article.setColumnName(rs.getString("columnName"));
article.setKeyword(rs.getString("keyword"));
article.setDescription(rs.getString("description"));
article.setContent(rs.getString("content"));
article.setThumb(rs.getString("thumb"));
article.setAttachment(rs.getString("attachment"));
article.setBuildDate(rs.getString("buildDate"));
article.setModifyDate(rs.getString("modifyDate"));
article.setCounter(rs.getInt("counter"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return article;
}
在Column类里有一个方法是获得这个栏目下的所有文章,放在一个Vector里,如下:
public Vector getAllArticles() {
Vector articles = new Vector();
DBO dbo = DBO.getInstance();
Util util = new Util();
String str = "select * from article where columnName='" + util.filt(getName()) + "' order by orderNum desc";
ResultSet rs = dbo.executeQuery(str);
try {
while (rs.next()) {
Article article = Article.getInstance(dbo,rs.getInt(1));
articles.add(article);
}
} catch (Exception e) {
e.printStackTrace();
}
dbo.closeConn();
return articles;
}
后来发现这个getAllArticles方法的效率比较低,原因在于每取一篇文章都要从数据库再查询一次(在Article的getInstance方法里),所以就改成了这样:
public Vector getAllArticles() {
Vector articles = new Vector();
DBO dbo = DBO.getInstance();
Util util = new Util();
String str = "select * from article where columnName='" + util.filt(getName()) + "' order by orderNum desc";
ResultSet rs = dbo.executeQuery(str);
try {
while (rs.next()) {
Article article = new Article();
article.setId(rs.getInt("aid"));
article.setTitle(rs.getString("title"));
article.setAuthor(rs.getString("author"));
article.setSource(rs.getString("source"));
article.setColumnName(rs.getString("columnName"));
article.setKeyword(rs.getString("keyword"));
article.setDescription(rs.getString("description"));
article.setContent(rs.getString("content"));
article.setThumb(rs.getString("thumb"));
article.setAttachment(rs.getString("attachment"));
article.setBuildDate(rs.getString("buildDate"));
article.setModifyDate(rs.getString("modifyDate"));
article.setCounter(rs.getInt("counter"));
articles.add(article);
}
} catch (Exception e) {
e.printStackTrace();
}
dbo.closeConn();
return articles;
}
效率是提高了不少,但代码变长了,而且可以想象以后如果给Article增加个属性什么的,要改的地方就不是Article类一处了。类似这样的问题,有没有好的解决办法呢?
问题点数:100、回复次数:5Top
1 楼bdsc()回复于 2003-09-02 17:07:51 得分 0
我们用一个manager类来专门处理bulk(集合?)操作Top
2 楼leshui(大象无形)(有物混成,先天地生)回复于 2003-09-02 17:16:14 得分 40
把 栏目(Column)和文章(Article)两个类 写到一个类里边不知道怎么样呢???
public class Column {
public class Article {
}
}
效率方面不知道有没有提高
但是修改起来就方便多了Top
3 楼icecloud(冰云)回复于 2003-09-02 22:11:50 得分 40
1 栏目和文章之间采用Composite模式
栏目是Compostie,文章是Leaf
构造Composite的时候通过一个Sql语句,一次添加多条
2 Article对应与数据库的一个表,
该表的字段维护在一个外部文件中或者在类中保存一个Static的数组
数组中保存数据的字段名和类型
添加数据的时候,添加到同样长度的一个数组
采用setValue(String property, String value)的样子即可维持今后的扩展
3 上述方法是一种简单的O/R mapping方法
也可以采用hibernate, jdo, 等任意的一种o/R方法
Top
4 楼bjzhanghao(八进制·WS新手)回复于 2003-09-09 00:27:05 得分 0
to icecloud: 好象只有第2种方案比较可行,但要多出不少代码吧。
有没有效率高而且代码简单的方式呢?Top
5 楼squallzeng(小呆呆)回复于 2003-09-09 09:01:50 得分 20
gzTop



