本部分内容包括网站设计总述,数据库和后端的交互;
数据库操作代码如下:
-- 编写SQL完成建库建表操作
create database if not exists java_blog_system charset utf8;
use java_blog_system;
-- 建立两张表,一个存储博客信息,一个存储用户信息
drop table if exists user;
drop table if exists blog;create table blog(
-- 主键必须包含唯一的值 主键列不能包含null值 设置主键进行自增长,默认从1开始,每次+1
blogId int primary key auto_increment,
title varchar(256),
content varchar(4096),
userId int,
postTime datetime
);create table user(
userId int primary key auto_increment,
username varchar(64) unique,
password varchar(64)
);-- 构造一些初始数据,方便后续的测试
insert into user values(1,'zhansan','123'),(2,'lisi','123');insert into blog values(1,'这是第一篇','这里是内容',1,'2023-06-07 18:00:00');
insert into blog values(2,'这是第一篇','这里是内容',1,'2023-06-07 18:00:00');
insert into blog values(3,'这是第一篇','这里是内容',1,'2023-06-07 18:00:00');
DBUtil.java
package Dao;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-10-28* Time: 11:07*/
//通过这个类将数据库建立连接和断开连接的逻辑进行封装
public class DBUtil {//进行连接前的准备工作,初始化数据库地址,用户名,密码//单例模式 只需要一个实例//volatile 禁止指令重排序private static volatile DataSource dataSource=null;//提供一个方法获取datasourceprivate static DataSource getDataSource(){if(dataSource==null){//此处if的作用在于避免频繁加锁;如果dataSource已经有值,再进行加锁,他会很快的解锁,但是这会导致频繁枷锁,因此一旦发现ataSource已经有值,就直接返回该值synchronized (DBUtil.class){//为了保证线程安全(多线程问题),加锁if(dataSource==null){//第二个if判断是否为空,当a线程优先获得锁,执行到此处,b线程没竞争到锁会被阻塞在外面,a线程判断实例是否为空,为空则new实例,a线程释放锁之后,b线程拿到锁进来后先判断instance是否为null,此时可能因上一个线程导致此处不为null,则释放锁往下或者为nulldataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_blog_system?useSSL=false&characterEncoding=utf8");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("1111");}}}return dataSource;}//提供一个方法和数据库建立连接public static Connection getConnection(){try {return getDataSource().getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}//提供一个方法和数据库断开连接 PreparedStatement statement用来执行SQL语句 ResultSet resultSet接收执行SQL语句后返回的结果public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){//将3个close放置到3个try中,即使前面的close出现问题,也不会影响后续close的执行if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
blog.java
package Dao;import java.sql.Timestamp;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-10-28* Time: 12:13*/
//这个类中的属性要和数据库中blog表中的属性相对应
//通过这个类的对象能够表示出一条blog表中的记录
public class Blog {private int blogId;private String title;private String content;private int UserId;// SQL 里有 timestamp 类型, 还有 datetime 类型.// 使用 SQL 时, 推荐使用 datetime, 因为 timestamp 只有 4 字节, 2038 年就不够用了.// 但是 Java 代码中的 Timestamp 是可以使用的.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;}@Overridepublic String toString() {return "Blog{" +"blogId=" + blogId +", title='" + title + '\'' +", content='" + content + '\'' +", userId=" + UserId +", postTime=" + postTime +'}';}
}
user.java
package Dao;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-10-28* Time: 13:32*/
//这个类的属性要和user表里的一致//通过这个类的对象表示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;}@Overridepublic String toString() {return "User{" +"userId=" + userId +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
blogDao.java
package Dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-10-28* Time: 13:36*/
//通过这个类封装对blog表的增删改查
public class BlogDao {//1.新增一个博客,构造一个insert方法public void insert(Blog blog){Connection connection=null;PreparedStatement statement=null;try {//和数据库建立连接connection =DBUtil.getConnection();//构造SQL语句String sql="insert into blog values(null,?,?,?,now())";//准备好sql语句statement=connection.prepareStatement(sql);statement.setString(1, blog.getTitle());statement.setString(2, blog.getContent());statement.setInt(3,blog.getUserId());//执行SQL语句statement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}finally {//关闭连接,释放资源DBUtil.close(connection,statement,null);}}//2.查询blog表中的所有博客public List<Blog> getblogs(){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;List<Blog> blogs=new ArrayList<>();//此时list为空try {//和数据库建立连接connection=DBUtil.getConnection();//构造sql语句String sql="select * from blog order by postTime desc";//按时间顺序降序排序//准备语句statement=connection.prepareStatement(sql);//执行sqlresultSet=statement.executeQuery();//遍历结果集合while(resultSet.next()){Blog blog=new Blog();//前面是java类中的属性,后面则是从数据库的表中对应属性的值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"));blogs.add(blog);}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(connection,statement,resultSet);}return blogs;}//指定ID,查询某一个博客public Blog getblog(int blogId){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select * from blog where blogId=?";statement.setInt(1,blogId);resultSet=statement.executeQuery();// 由于此处是按照 blogId 来查询, blogId 又是主键.// 查询到的结果要么是 1 条记录, 要么是 0 条记录. 不会有别的情况.// 因此这里就没必要循环了, 直接条件判定即可.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 void delete(int blogId){Connection connection=null;PreparedStatement statement=null;try {connection=DBUtil.getConnection();String sql="delete from blog where blogId=?";statement=connection.prepareStatement(sql);statement.setInt(1,blogId);statement.executeQuery();} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(connection, statement,null );}}}
userDao.java
package Dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-10-28* Time: 14:50*/
//使用这个类封装对user表的增删改查
public class UserDao {//根据userId查询用户信息public User getUserById(int userId){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select * from user where userId = ?";statement=connection.prepareStatement(sql);statement.setInt(1,userId);resultSet=statement.executeQuery();if(resultSet.next()){User user=new User();user.setUserId(resultSet.getInt("userId"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;}} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(connection,statement,resultSet);}return null;}//根据username来查询用户信息public User getUserByName(String username){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {connection=DBUtil.getConnection();String sql="select * from user where username = ?";statement=connection.prepareStatement(sql);statement.setString(1,username);resultSet=statement.executeQuery();if(resultSet.next()){User user=new User();user.setUserId(resultSet.getInt("userId"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;}} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(connection,statement,resultSet);}return null;}
}