开发顺序:数据访问层(1.实体类(entity)->2.Dao层的mapper->3.mapper.xml->4.test)->业务层(service)->控制层(controller)
实体类entity:DisscussPost
把表discusspost中的字段进行罗列。
package com.nowcoder.community.entity;
import java.util.Date;
public class DisscussPost {
private int id;
private int userId;
private String title;
private String content;
private int type; // 0:普通 1:置顶
private int status;
private Date createTime;
private int commentCount;
private int score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getCommentCount() {
return commentCount;
}
public void setCommentCount(int commentCount) {
this.commentCount = commentCount;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "DisscussPost{" +
"id=" + id +
", userId=" + userId +
", title='" + title + ''' +
", content='" + content + ''' +
", type=" + type +
", status=" + status +
", createTime=" + createTime +
", commentCount=" + commentCount +
", score=" + score +
'}';
}
}
Dao层写一个mapper接口:DiscussPostMapper
package com.nowcoder.community.dao;
import com.nowcoder.community.entity.DisscussPost;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper // 加上注解才能被容器自动扫描该接口,自动实现和装配
public interface DiscussPostMapper {
/**
* 首页查询功能的两个方法:selectDiscussPosts()、selectDiscussPostRows()
*
* 1.搜索帖子:结果是一个集合,集合里装的是帖子对象。
* 2.userId用于后面个人主页的开发,可以动态输入,传入时可以在个人主页中查看个人帖子,当然默认也可以不传入。SQL语句因此也是动态的
* 3.分页:offset表示每一页起始行的行号,limit表示每一页最多显示的数据。
* @param userId
* @return
*/
List<DisscussPost> selectDiscussPosts(int userId, int offset, int limit);
// @Param注解用于给参数取别名,
// 且这个方法有且只有一个参数,并且在<if>里使用,参数之前必须取别名
int selectDiscussPostRows(@Param("userId") int userId);
}
编写mapper实现方法的语句:discusspost-mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nowcoder.community.dao.DiscussPostMapper">
<sql id="selectFields">
id, user_id, title, content, type, status, create_time, comment_count, score
</sql>
<!-- 获取帖子,状态不为2,类型倒序排,也即精华置顶,创建时间倒序排:也即新创建的帖子置顶 -->
<select id="selectDiscussPosts" resultType="DisscussPost">
select <include refid="selectFields"></include>
from discuss_post
where status != 2
<!-- 使用if标签的test属性对userId进行判断,动态输入sql语句-->
<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进行判断,动态输入sql语句-->
<if test="userId!=0">
and user_id = #{userId}
</if>
</select>
</mapper>
Test
package com.nowcoder.community;
import com.nowcoder.community.dao.DiscussPostMapper;
import com.nowcoder.community.dao.UserMapper;
import com.nowcoder.community.entity.DisscussPost;
import com.nowcoder.community.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class MapperTest {
@Autowired
private DiscussPostMapper discussPostMapper;
@Test
public void testSelectPosts() {
List<DisscussPost> disscussPostList = discussPostMapper.selectDiscussPosts(149, 0, 10);
for(DisscussPost post : disscussPostList) {
System.out.println(post);
}
int rows = discussPostMapper.selectDiscussPostRows(149);
System.out.println(rows);
}
}
service层
类:DiscussPostService
package com.nowcoder.community.service;
import com.nowcoder.community.dao.DiscussPostMapper;
import com.nowcoder.community.entity.DisscussPost;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DiscussPostService {
@Autowired
private DiscussPostMapper discussPostMapper;
public List<DisscussPost> findDiscussPosts(int userId, int offset, int limit) {
return discussPostMapper.selectDiscussPosts(userId, offset, limit);
}
public int findDiscussPostRows(int userId) {
return discussPostMapper.selectDiscussPostRows(userId);
}
}
类:UserService
package com.nowcoder.community.service;
import com.nowcoder.community.dao.UserMapper;
import com.nowcoder.community.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findUserById(int id) {
return userMapper.selectById(id);
}
}
controller层
添加静态资源和首页前端字段
HomeController:
package com.nowcoder.community.controller;
import com.nowcoder.community.entity.DisscussPost;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.DiscussPostService;
import com.nowcoder.community.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class HomeController {
@Autowired
private DiscussPostService discussPostService;
@Autowired
private UserService userService;
@RequestMapping(path = "/index", method = RequestMethod.GET)
public String getIndexPage(Model model) {
List<DisscussPost> list = discussPostService.findDiscussPosts(0, 0, 10);
List<Map<String, Object>> discussPosts = new ArrayList<>();
if (list != null) {
for (DisscussPost post : list) {
Map<String, Object> map = new HashMap<>();
map.put("post", post);
User user = userService.findUserById(post.getUserId());
map.put("user", user);
discussPosts.add(map);
}
}
model.addAttribute("discussPosts", discussPosts);
return "/index";
}
}