分两步:
- 开发首页,显示前十帖子;
- 开发分页,分页显示所有。
开发首页
开发顺序:DAO -> Service -> Controller
DAO(建表、实体类、Mapper 接口、Mapper 映射文件)
-
建表:讨论贴
content:帖子内容,不知道最大长度,故用 text 类型。
char:长度固定,适用身份证、手机号码等定长属性;
varchar:可变长度,可设置最大长度,适用长度可变的属性;
text:不设置长度,适用不知道属性最大长度时;
查询速度:char > varchar > text。
comment_count:指评论数量,做冗余存储,以减少对评论表频繁的查询,提高效率。
score :帖子分数,用来给帖子进行热度排名。
Q:user_id 为 varchar,对应实体属性 userId 为 int,user 表 id 为 int
-
建实体类
public class DiscussPost { // 表中用text类型 private String content; // 其他属性,get、set,toString }
-
建 Mapper 接口
@Mapper @Repository public interface DiscussPostMapper { // “首页讨论贴”和“我的帖子”共同该方法,对应的 sql 是动态的: // 当 userId 为 0 时,不拼入 sql 中,查询的是“首页讨论贴”;否则拼入,查询“我的帖子”。 // offset、limit:用于分页,offset:每页起始行行号,limit:每页最多显示多少数据。 List<DiscussPost> selectDiscussPosts(int userId, int offset, int limit); // 查询帖子总数,用于后续计算分页数(总贴数/每页数),对应的 sql 也是动态的; // 当 userId 为 0 时,不拼入 sql 中,查询首页总贴数;否则拼入,查询用户帖子总数。 // @Param():给参数取别名, // 如果方法只有一个参数,且对应 sql 是动态的,后续参数要在 <if> 内使用,就必须加别名; int selectDiscussPostRows(@Param("userId") int userId); }
-
建 Mapper 映射文件:discusspost-mapper.xml
<!-- resultType 返回 List,声明元素类型即可 --> <select id="selectDiscussPosts" resultType="DiscussPost"> # 不查询拉黑贴,userId 不为 0 拼入来查询“我的帖子” # 先按类型降序(1置顶、0普通),同类型再按创建时间降序(新到旧) # limit x,y:从 x+1 开始检索 y 行,x 可不写默认为 0 select <include refid="selectFields"/> from discuss_post where status != 2 <if test="userId != 0"> and user_id = #{userId} </if> order by type desc, create_time desc limit #{offset}, #{limit} </select> <select id="selectDiscussPostRows" resultType="int"> select count(id) from discuss_post where status != 2 <if test="userId != 0"> and user_id = #{userId}