不知道大家有没有遇到类似于微博这种需要实现评论和回复的项目,如图:
那么在面对这种需求的时候,先想想数据库该如何设计。针对这个模块,涉及到的对象有:用户、动态、评论和回复,由于用户表只需要在这里绑定一个主键ID作为外键,就暂时先不考虑用户表的设计。接下来就对动态、评论和回复来分别设计数据表
动态表:动态ID、用户ID、动态内容、动态图片、发布时间
评论表:评论ID、用户ID、动态ID、评论内容、评论时间
回复表:回复ID、用户ID、动态ID、评论ID、回复内容、回复时间
发现问题没有?评论表和回复表的字段几乎是一样的。我们可以这样理解:【评论是对动态进行评论,而回复是对评论进行评论】
,说白了就是,回复也是评论,那么为什么还要单独建一张回复表呢?那么我们来优化一下
动态表:动态ID、用户ID、动态内容、动态图片、发布时间
评论表:评论ID、用户ID、动态ID、评论内容、评论时间、评论ID2
这个评论ID2
是什么情况?其实是这样的,评论ID2
存放的数据也是评论ID
,它指明了当前这条数据是针对哪条评论进行评论的
。好像还是有点绕,咱们来画个图捋一捋。
这样子看上去也许更容易理解一点……
接下来正式开始建表
其他表就不多说了,把这几个基本的表建好之后,手动加几条数据,然后拉到项目中去,那么问题又来了,数据该怎么查?有同学肯定想到了,那不是有个动态ID吗?我们可以根据动态ID,将该动态下的所有评论都查出来。既然想到了,我们就来试试。
public List<Comment> findCommentList(int trendsid) {
// TODO Auto-generated method stub
List<Comment> list = null;
try {
String sql = "select comment.*,user.username from comment inner join user on comment.userid=user.userid"
+" where trendsid = ? order by commentdate desc";//查询的SQL语句,通过时间进行排序
con=DbUtil.getConnection();
ps=con.prepareStatement(sql);
ps.setInt(1, trendsid);
rs=ps.executeQuery();
list=JdbcHelper.getResult(rs, Comment.class);//jdbcHelper封装的工具类,通过反射获取返回结果集
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DbUtil.close(con, ps, rs);//关闭连接
}
return list;//返回结果列表
}
在Dao中写好查询方法,获取到数据库返回的结果集,接下来就是返回给servlet和jsp。servlet也就那样,就不截出来了,下面是jsp的代码
function findComment(){
$.ajaxSettings.async=false