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

简介: 本文目录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,我们把他们交给容器管理,无需关心他们的生命周期操作,而且随时取来即用,非常方便吭。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
11月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
546 0
|
12月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
511 1
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
3046 57
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!
2227 2
|
消息中间件 存储 Java
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
本文详细介绍了如何使用Spring Boot 3结合RabbitMQ构建高效可靠的聊天消息存储系统。通过引入消息队列,实现了聊天功能与消息存储的解耦,解决了高并发场景下直接写入数据库带来的性能瓶颈问题。文章首先分析了不同MQ产品的特点及适用场景,最终选择RabbitMQ作为解决方案,因其成熟稳定、灵活路由和易于集成等优势。接着,通过Docker快速部署RabbitMQ,并完成Spring Boot项目的配置与代码实现,包括生产者发送消息、消费者接收并处理消息等功能。最后,通过异步存储机制,既保证了消息的即时性,又实现了可靠持久化。
1046 0
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
632 0
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
10271 7
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
1603 0
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1460 0

热门文章

最新文章