JavaEE-博客系统1(数据库和后端的交互)

本部分内容包括网站设计总述,数据库和后端的交互;
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述


数据库操作代码如下:

-- 编写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;

    //提供一个方法获取datasource
    private 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,则释放锁往下或者为null
                    dataSource=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;
    }

    @Override
    public 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;
    }

    @Override
    public 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);
            //执行sql
            resultSet=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;
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/109895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode免密码认证ssh连接virtual box虚拟机

文章目录 安装软件virtual box配置vscode配置创建并传递密钥连接虚拟机最后 安装软件 安装vscode和virtual box&#xff0c;直接官网下载对应软件包&#xff0c;下载之后&#xff0c;点击执行&#xff0c;最后傻瓜式下一步安装即可 virtual box配置 创建一个仅主机网络的网卡 …

零基础Linux_24(多线程)线程同步+条件变量+生产者消费模型_阻塞队列版

目录 1. 线程同步和生产者消费者模型 1.1 生产者消费者模型的概念 1.2 线程同步的概念 1.3 生产者消费者模型的优点 2. 线程同步的应用 2.1 条件变量的概念 2.2 条件变量操作接口 3. 生产者消费者模型_阻塞队列 3.1 前期代码&#xff08;轮廓&#xff09; 3.2 中期代…

Go学习第十五章——Gin参数绑定bind与验证器

Go web框架——Gin&#xff08;参数绑定bind与验证器&#xff09; 1 bind参数绑定1.1 JSON参数1.2 Query参数1.3 Uri绑定动态参数1.4 ShouldBind自动绑定 2 验证器2.1 常用验证器2.2 gin内置验证器2.3 自定义验证的错误信息2.4 自定义验证器 1 bind参数绑定 在Gin框架中&#…

数据结构Demo——简单计算器

简单计算器 一、项目介绍二、技术使用三、具体代码实现1.前端部分2.后端部分 一、项目介绍 本项目实现了一个通过网页访问的简单计算器&#xff0c;它可以对带括号的加减乘除表达式进行计算并将计算结果返回给用户&#xff0c;并且可以对用户输入的表达式进行合法性判断&#…

Maven第二章:Maven基本概念与生命周期

Maven第二章&#xff1a;Maven基本概念与生命周期 前言 本章主要内容&#xff0c;介绍Maven基本概念&#xff0c;包括maven坐标含义&#xff0c;命名规则&#xff0c;继承与聚合、了解与理解生命周期&#xff0c;如何通过Maven进行依赖和版本管理。 什么是Maven的坐标&#xf…

【第25例】IPD体系进阶:需求分析团队RAT

目录 简介 RAT CSDN学院相关内容推荐 作者简介 简介 RAT是英文Requirement Analysis Team英文首字母的简称,也即需求分析团队,每个产品线都需要设定对应的一个RAT的组织。 RAT主要负责产品领域内需求的分析活动,是RMT的支撑团队: 这个时候可以将RAT细化为PL-RAT团队,…

Ansible的安装和部署

目录 1.Ansible的安装 2.构建Ansible清单 直接书写受管主机名或ip 设定受管主机的组[组名称] 主机规格的范围化操作 指定其他清单文件 ansible命令指定清单的正则表达式 3.Ansible配置文件参数详解 配置文件的分类与优先级 常用配置参数 4.构建用户级Ansible操作环…

Mysql数据库 4.SQL语言 DQL数据查询语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法&#xff1a;select 列名&#xff08;字段名&#xff09;/某几列/全部列 from 表名 [具体条件]&#xff1b; select colnumName…

linux进程概念

文章目录 1、冯诺依曼体系结构2、操作系统(Operator System)2.1、概念2.2、设计OS的目的2.3、定位2.4、如何理解 "管理"2.5、总结 3、系统调用和库函数概念4、进程4.1、基本概念4.2、描述进程-PCB4.2.1、task_struct-PCB的一种4.2.2、task_ struct内容分类 4.3、组织…

【Linux】第六站:Centos系统如何安装软件?

文章目录 1.Linux安装软件的方式2.Linux的软件生态3. yum4. rzsz软件的安装与卸载5.yum如何知道去哪里下载软件&#xff1f; 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式 源代码安装&#xff08;我们还需要进行编译运行后才可以&#xff0c;很麻烦&#xff09; …

H5游戏源码分享-跳得更高

H5游戏源码分享-跳得更高 控制跳动踩到云朵上 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta http-equiv"Content-Type" content"text/html;"&g…

基于SSM的养老院管理系统

基于SSM的养老院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 养老院管理系统是一个基于SSM&#xff08;Spring、Spring MVC、MyBatis&…

[量化投资-学习笔记002]Python+TDengine从零开始搭建量化分析平台-MA均线的多种实现方式

MA 均线时最基本的技术指标&#xff0c;也是最简单&#xff0c;最不常用的&#xff08;通常使用EMA、SMA&#xff09;。 以下用两种不同的计算方法和两种不同的画图方法进行展示和说明。 MA 均线指标公式 MA (N)(C1 C2 C3 …C N )/N目录 方式一1.SQL 直接查询均值2.使用 pyp…

java八股文(基础篇)

面向过程和面向对象的区别 面向过程&#xff1a;在解决问题时&#xff0c;特别自定义函数编写一步一步的步骤解决问题。 面向对象&#xff1a;其特点就是 继承&#xff0c;多态&#xff0c;继承&#xff0c;在解决问题时&#xff0c;不再注重函数的编写&#xff0c;而在于注重…

这么理解矩阵乘法,让你吊打面试官

大家好啊&#xff0c;我是董董灿。 很多与深度学习算法相关的面试&#xff0c;面试官可能都会问一个问题&#xff0c;那就是你是如何理解矩阵乘算法的。 更有甚者&#xff0c;会让你当场手写矩阵乘算法&#xff0c;然后问细节&#xff0c;问如何优化&#xff0c;面试现场&…

治疗红斑性肢痛症的【Chromocell】申请870万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的生物制药公司Chromocell Therapeutics Corporation&#xff08;简称&#xff1a;Chromocell&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#x…

VM搭建虚拟机2(自定义安装)

文章目录 自定义安装选择你的centos下载目录设置用户名密码自定义安装目录注意&#xff0c;尽量别再同一位置安装虚拟机设置处理器数量内存根据所需配置&#xff08;默认1G&#xff09;NAT按需设置磁盘大小点击完成即可等待安装即可 VMware、centos、典型安装 自定义安装 选择你…

【机器学习(二) 线性代数基础I(Linear Algebra Foundations)】

机器学习&#xff08;二&#xff09; 线性代数基础I&#xff08;Linear Algebra Foundations) 这一节主要介绍一些线性代数的基础。 目录 机器学习&#xff08;二&#xff09; 线性代数基础I&#xff08;Linear Algebra Foundations)1. 向量 Vectors2. 复杂度 Complexity3.线…

【Linux】第七站:vim的使用以及配置

文章目录 一、vim1.vim的介绍2.vim基本使用3.vim的命令模式常用命令4.底行模式 二、vim的配置 一、vim 1.vim的介绍 vim编辑器&#xff0c;用来文本编写&#xff0c;可以写代码 它是一个多模式的编辑器 它有很多的模&#xff0c;不过我们暂时先只考虑这三种模式 命令模式插入模…

2023年阿里云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;阿里云也正式开启了双11大促&#xff0c;推出了“金秋云创季”活动&#xff0c;那么&#xff0c;2023年阿里云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、阿里云双11活动时间 1、2023年10月27日-2023年10月31日&#xff…