文章目录
设计前提:明确用户的需求
一、实现那些功能
1.当前博客列表(摘要)
博客列表展示了很多篇博客,每一篇博客都包含标题、发布时间、作者、摘要,点击标题可以跳转至对应博客正文页。
2.博客正文页
显示博客的详细内容,正文包含标题、发布时间、完整正文(暂不考虑图片)
3.博客编辑页
显示一个编辑框,用户可以编辑内容并提交给服务器,在列表中可以看到该博客。
4.删除博客功能
在博客的详情页加一个删除按钮
5.注册&登录功能
要求:若登陆成功,才能发布博客;
若没有登陆成功,只能看,不能发布。
二、功能的实现
1.数据库实体类设计
首先分析需要建立几张表来存储博客的数据,每张表字段间的关联关系。
注:为了后面此表结构的重复创建,将建表的sql写到一个sql文件中。
表1:表示“博客”Blog
字段:博客编号blogId、标题title、正文content、发布时间postTime、作者编号userId。
表2:表示“用户”user
字段:用户编号userId、用户名username、密码password。
封装数据库:
(1)使用“单例”类封装数据库建立连接过程。
(2)创建实体类,博客(Blog)是一个实体,一个用户(User)是一个实体,确定博客和用户之间的关系(一对多)。
db.sql
`create database if not exists BlogSystem;
use BlogSystem;
drop table if exists blog;
create table blog (
blogId int primary key auto_increment,
title varchar(512),
content text,
userId int,
postTime datetime
);
drop table if exists user;
create table user (
userId int primary key auto_increment,
username varchar(50),
password varchar(50)
);`
Blog表
import java.sql.Date;
import java.sql.Timestamp;
public class Blog {
private int blogId;
private String title;
private String content;
private int userId;
// java.sql.Date 这个类型只能表示日期, 没有时分秒
private Timestamp postTime;
public int getBlogId() {
return blogId;
}
public void setBlogId(int blogId) {
this.blogId = blogId;
}
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 getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public Timestamp getPostTime() {
return postTime;
}
public void setPostTime(Timestamp postTime) {
this.postTime = postTime;
}
@Override
public String toString() {
return "dao.Blog{" +
"blogId=" + blogId +
", title='" + title + '\'' +
", content='" + content + '\'' +
", userId=" + userId +
", postTime=" + postTime +
'}';
}
}
User表
public class User {
private int userId;
private String username;
private String password;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "dao.User{" +
"userId=" + userId +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
(3)针对用户和博客进行具体的增删改查操作。(暂不考虑用户的删除 )
注:查找时,如果查询结果较多,采用limit offset实现分页查询,此项目暂时不考虑。
BlogDao
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BlogDao {
// 往数据库中新增一个 博客
public void insert(Blog blog) {
// 1. 和数据库服务器建立连接.
Connection connection = DBUtil.getConnection();
// 2. 拼装 SQL
String sql = "insert into blog values(null, ?, ?, ?, now())";
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
statement.setString(1, blog.getTitle());
statement.setString(2, blog.getContent());
statement.setInt(3, blog.getUserId());
// 3. 执行 SQL
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 收尾工作.
DBUtil.close(connection, statement, null);
}
}
// 从数据库删除博客
public void delete(int blogId) {
// 1. 和数据库服务器建立连接.
Connection connection = DBUtil.getConnection();
// 2. 拼装 SQL
String sql = "delete from blog where blogId = ?";
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
statement.setInt(1, blogId);
// 3. 执行 SQL
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, null);
}
}
// 从数据库中查找出所有的博客.
// 实现博客列表页的时候, 就需要这个方法.
// 如果博客数目少, 都无所谓. 如果博客数目很多, 应该要支持 "分页查询"
// limit offset
public List<Blog> selectAll() {
List<Blog> blogs = new ArrayList<Blog>();
// 1. 和数据库服务器建立连接.
Connection connection = DBUtil.getConnection();
// 2. 拼装 SQL
String sql = "select * from blog order by blogId desc";
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
statement = connection.prepareStatement(sql);
// 3. 执行 SQL
resultSet = statement.executeQuery();
// 4. 遍历结果集合.
while (resultSet.next()) {
Blog blog = new Blog();
blog.setBlogId(resultSet.getInt("blogId"));
blog.setTitle(resultSet.getString("title"));
String content = resultSet.getString("content");
if (content.length() > 40) {
content = content.substring(0, 40) + "...";
}
blog.setContent(content);
blog.setUserId(resultSet.getInt("userId"));
blog.setPostTime(resultSet.getTimestamp("postTime"));
blogs.add(blog);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, resultSet);
}
return blogs;
}
// 从数据库查询出指定的一篇博客.
// 实现博客详情页的时候, 需要这个方法.
public Blog selectOne(int blogId) {
// 1. 和数据库建立连接.
Connection connection = DBUtil.getConnection();
// 2. 拼装 SQL
String sql = "select * from blog where blogId = ?";
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
statement = connection.prepareStatement(sql);
statement.setInt(1, blogId);
// 3. 执行 SQL
resultSet = statement.executeQuery();
// 4. 遍历结果集. 要么是 0 个记录, 要么只有 1 条记录.
if (resultSet.next()) {
Blog blog = new Blog();
blog.setBlogId(resultSet.getInt("blogId"));
blog.setTitle(resultSet.getString("title"));
blog.setContent(resultSet.getString("content"));
blog.setUserId(resultSet.getInt("userId"));
blog.setPostTime(resultSet.getTimestamp("postTime"));
return blog;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, resultSet);
}
return null;
}
public static void main(String[] args) {
// 通过这里的代码对上面的数据库操作进行验证.
// 1. 验证插入.
// 此处的测试, 只是一个简单的 "冒烟测试"
// Blog blog = new Blog();
// blog.setTitle("滕王阁序");
// blog.setContent("");
// blog.setUserId(3);
// BlogDao blogDao = new BlogDao();
// blogDao.insert(blog);
// 2. 验证查找.
// dao.BlogDao blogDao = new dao.BlogDao();
// List<dao.Blog> blogs = blogDao.selectAll();
// System.out.println(blogs);
// dao.Blog blog = blogDao.selectOne(1);
// System.out.println(blog);
// 3. 验证删除.
// dao.BlogDao blogDao = new dao.BlogDao();
// blogDao.delete(1);
}
}
UserDao
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
// 注册的时候, 需要新增用户到数据库中.
// 期望 username 不能重复. (username 是用于登陆的用户名)
// 注册的时候(insert 之前), 先判定一下该 username 是否已经存在.
// 如果存在, 就直接不执行后续的 insert 操作.
// username 的唯一性不一定非得通过 数据库的约束 来完成.
// 也可以通过用户代码来完成.
public void insert(User user) {
// 1. 和数据库建立连接.</