Spring之路(21)–SpringMVC+Bootstrap开发博客系统实例(数据库模块实现)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文目录1. 背景2. 导入jar包3. 编写数据库操作组件4. 编写博客数据类5. 编写博客操作服务类6. 总结

1. 背景

上一篇已经实现了整体页面和控制器跳转的部分,本篇来在Spring框架的基础上,集成JDBC实现数据库的相关操作。


注意本篇的JDBC操作是原始封装,并没有使用SpringJDBC相关的技术,关于SpringJDBC会在后续章节具体介绍。


2. 导入jar包

在开始之前,我们需要将JDBC相关的jar包拷贝到lib目录下,此处使用的是mysql-connector-java-5.1.48.jar,下载地址:点此下载


3. 编写数据库操作组件

在传统的开发过程中,我们一般会将JDBC相关的操作封装到一个类中,以便复用相关代码。由于Spring中bean默认的作用域的生存周期是真个容器的存活期间,所以可以将JDBC操作代码封装到一个bean中,这样在web程序运行期间可以直接使用调用该bean对象进行数据库操作。


OK,具体代码如下,请注意注释部分:

package org.maoge.myblog;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component // 注册DbHelper为bean到容器中
public class DbHelper {
  @Value("com.mysql.jdbc.Driver") // 注入driver属性
  private String driver;
  @Value("jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8") // 注入数据库url属性
  private String url;
  @Value("root") // 注入用户名属性
  private String username;
  @Value("XXX") // 注入密码属性
  private String password;
  /**
   * 初始化
   */
  @PostConstruct // 使用该注解,以便在项目启动时执行数据库驱动加载工作
  public void init() {
    try {
      Class.forName(driver);
    } catch (Exception e) {
      // 此处应打印日志
    }
  }
  /**
   * 获取数据库连接
   */
  public Connection getConnection() {
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
      // 此处应打印日志
    }
    return conn;
  }
  /**
   * 关闭数据库连接
   */
  public void closeConnection(Connection conn) {
    if(conn!=null) {
      try {
        conn.close();
      }catch(Exception e) {
        // 此处应打印日志
      }
    }
  }
}

4. 编写博客数据类

我们需要有一个类描述博客信息,并且与数据库中的blog表对应,此处我们定义为BlogDo(DO表示Data Object,数据对象,与数据库表结构一一对应)。

注意该类实际上是一个模型类,不需要注册为bean组件。

代码如下:

package org.maoge.myblog;
/**
 * @theme 数据对象--博客
 * @author maoge
 * @date 2020-01-27
 */
public class BlogDo {
  private Long id;
  private String title;
  private String author;
  private String content;
  // 省略get get
}

5. 编写博客操作服务类

现在已经有对数据库进行操作的组件了,也有博客的模型,现在需要封装一个提供博客相关操作的服务类BlogService,代码如下。


此处需要注意两点:一是通过自动注入dbHelper实现对数据库的操作,二是需要将BlogService也注册为bean便于控制器可以直接调用封装好的服务。

package org.maoge.myblog;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * @theme 服务--博客
 * @author maoge
 * @date 2020-01-27
 */
@Component // 注册为组件,纳入Spring容器管理
public class BlogService {
  @Autowired // 自动注入dbHelper组件
  private DbHelper dbHelper;
  /**
   * 获取博客列表
   */
  public List<BlogDo> getBlogList() {
    List<BlogDo> blogList = new ArrayList<BlogDo>();
    Connection conn = null;
    try {
      conn = dbHelper.getConnection();
      String sql = "select * from blog";
      PreparedStatement stmt = conn.prepareStatement(sql);
      ResultSet rs = stmt.executeQuery();
      while (rs.next()) {
        BlogDo blog = new BlogDo();
        blogList.add(blog);
        blog.setAuthor(rs.getString("author"));
        blog.setContent(rs.getString("content"));
        blog.setId(rs.getLong("id"));
        blog.setTitle(rs.getString("title"));
      }
    } catch (Exception e) {
      // 此处应打印日志
    } finally {
      dbHelper.closeConnection(conn);
    }
    return blogList;
  }
  /**
   * 新增博客
   */
  public int addBlog(BlogDo blog) {
    Connection conn = null;
    try {
      conn = dbHelper.getConnection();
      String sql = "insert into blog(author,content,title)values(?,?,?)";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setString(1, blog.getAuthor());
      stmt.setString(2, blog.getContent());
      stmt.setString(3, blog.getTitle());
      return stmt.executeUpdate();
    } catch (Exception e) {
      // 此处应打印日志
      return 0;
    } finally {
      dbHelper.closeConnection(conn);
    }
  }
  /**
   * 根据博客id更新博客信息
   */
  public int updateBlog(BlogDo blog) {
    Connection conn = null;
    try {
      conn = dbHelper.getConnection();
      String sql = "update blog set author=?,content=?,title=? where id=?";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setString(1, blog.getAuthor());
      stmt.setString(2, blog.getContent());
      stmt.setString(3, blog.getTitle());
      stmt.setLong(4, blog.getId());
      return stmt.executeUpdate();
    } catch (Exception e) {
      // 此处应打印日志
      return 0;
    } finally {
      dbHelper.closeConnection(conn);
    }
  }
  /**
   * 根据博客id删除对应博客
   */
  public int deleteBlog(Long id) {
    Connection conn = null;
    try {
      conn = dbHelper.getConnection();
      String sql = "delete from blog where id=?";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setLong(1, id);
      return stmt.executeUpdate();
    } catch (Exception e) {
      // 此处应打印日志
      return 0;
    } finally {
      dbHelper.closeConnection(conn);
    }
  }
}

OK,这样我们就把对数据库中blog表的操作都封装到BlogService中了,同时我们将BlogService封装为了bean,可以随时从Spring容器中取出使用,供我们调度。


6. 总结

JSP请求–DispatcherServlet分配请求–BlogController接受处理请求–BlogService处理逻辑–DbHelper封装数据库操作–MySQL数据库持久化存储。


中间还有一个BlogDo实际上是对象–表的映射,便于我们在各个组件之间传递数据,实际上是一种命名规范。


最后BlogController、BlogService、DbHelper都是Spring管理的bean,我们把他们交给容器管理,无需关心他们的生命周期操作,而且随时取来即用,非常方便吭。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
19天前
|
Rust 前端开发 关系型数据库
Tauri 开发实践 — Tauri 集成本地数据库
本文介绍了在 Tauri 框架中集成本地数据库的几种方案,包括直接绑定 SQLite、使用第三方数据库库和使用 tauri-plugin-sql-api 插件。最终选择了 tauri-plugin-sql-api,因为它集成简单、支持多种数据库类型,并且与 Tauri 框架深度整合,提升了开发效率和安全性。文章详细介绍了如何安装和使用该插件,以及如何编写核心代码实现数据库操作。
89 2
|
26天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
31 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
3月前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
53 0
|
3月前
|
数据库 Java 数据库连接
玩转Play Framework的秘密武器:Ebean ORM带你解锁高效数据库操作新姿势,让你的代码从此飞起来!
【8月更文挑战第31天】Play Framework 以其简洁的 API 和高效开发体验著称,Ebean ORM 则是其推荐的对象关系映射(ORM)工具之一。Ebean 可将 Java 对象轻松映射到数据库表,简化数据库交互。本文将指导你在 Play Framework 中使用 Ebean ORM 进行数据库操作,涵盖项目创建、依赖引入、数据库配置、模型定义及 CRUD 操作,并通过示例代码展示实现过程。通过这些步骤,你将学会如何利用 Ebean 的丰富功能,如事务管理、查询构建等,提升 Web 应用的数据库交互能力。
46 0
|
6月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
5月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
70 1
|
5月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
5月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
5月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16