Springboot框架整合Spring JDBC操作数据

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。

一、jdbc简介

JDBC(Java DataBase Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,

   术语:什么是持久层:在后面的章节我会经常用到持久层这个词,持久层就是指对数据进行持久化操作的代码,比如将数据保存到数据库、文件、磁盘等操作都是持久层操作。所谓持久就是保存起来的意思。对于web应用最常用的持久层框架就是JDBC、Mybatis、JPA。

二、使用jdbc操作数据库的步骤

直接在 Java 程序中使用 JDBC 比较复杂,需要 7 步才能完成数据库的操作:

   加载数据库驱动

   建立数据库连接

   创建数据库操作对象

   定义操作的 SQL 语句

   执行数据库操作

   获取并操作结果集

   关闭对象,回收资源

关键代码如下:

   try {

   

       // 1、加载数据库驱动

       Class.forName(driver);

   

       // 2、获取数据库连接

       conn = DriverManager.getConnection(url, username, password);

   

       // 3、获取数据库操作对象

       stmt = conn.createStatement();

   

       // 4、定义操作的 SQL 语句

       String sql = "select * from user where id = 6";

   

       // 5、执行数据库操作

       rs = stmt.executeQuery(sql);

   

       // 6、获取并操作结果集

       while (rs.next()) {

   

       // 解析结果集

   

       }

   

   } catch (Exception e) {

       // 日志信息

   } finally {

       // 7、关闭资源

   }

   

通过上面的示例可以看出直接使用 JDBC 来操作数据库比较复杂。为此,Spring Boot 针对 JDBC 的使用提供了对应的 Starter 包:spring-boot-starter-jdbc,它其实就是在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 生态中更好的使用 JDBC,下面进行示例演示。

   本教程作为spring boot系列教程,并不能将spring jdbc的方方面面讲到,本文只会去讲最重要的部分,如果想更加深入的学习Spring JDBC。建议参考:Spring JDBC教程

不论是JDBC,还是封装之后的Spring JDBC,直接操作数据库都比较麻烦。如果企业有成熟的ORM知识积累,并且无特殊需求,不建议直接使用JDBC操作数据库。

三、 将Spring JDBC集成到Spring boot项目

   在《3-9 配置文件敏感字段加密》master分支的基础上新建一个分支:jdbc

第一步:引入maven依赖包,包括spring JDBC和MySQL驱动。

   <dependency>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-jdbc</artifactId>

   </dependency>

   <dependency>

       <groupId>mysql</groupId>

       <artifactId>mysql-connector-java</artifactId>

   </dependency>

第二步:修改application.yml,增加数据库连接、用户名、密码相关的配置。driver-class-name请根据自己使用的数据库和数据库版本准确填写。

   spring:

     datasource:

       url: jdbc:mysql://192.168.161.3:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false

       username: test

       password: 4rfv$RFV

       driver-class-name: com.mysql.cj.jdbc.Driver

   mysql-connector-java 5版本及其以下,使用com.mysql.jdbc.Driver

   mysql-connector-java 6版本及其以上,使用com.mysql.cj.jdbc.Driver

四、  spring boot jdbc 基础代码

spring jdbc集成完毕之后,我们来写代码做一个基本的测试。首先我们新建一张测试表article

   CREATE TABLE `article` (

    `id` INT(11) NOT NULL AUTO_INCREMENT,

    `author` VARCHAR(32) NOT NULL,

    `title` VARCHAR(32) NOT NULL,

    `content` VARCHAR(512) NOT NULL,

    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY (`id`)

   )

   COMMENT='文章'

   ENGINE=InnoDB;

DAO层代码:

   jdbcTemplate.update适合于insert 、update和delete操作;

   jdbcTemplate.queryForObject用于查询单条记录返回结果

   jdbcTemplate.query用于查询结果列表

   BeanPropertyRowMapper可以将数据库字段的值向Article对象映射,满足驼峰标识也可以自动映射。如:数据库create_time字段映射到createTime属性。

   @Repository  //持久层依赖注入注解

   public class ArticleJDBCDAO {

   

       @Resource

       private JdbcTemplate jdbcTemplate;

   

       //保存文章

       public void save(Article article) {

           //jdbcTemplate.update适合于insert 、update和delete操作;

           jdbcTemplate.update("INSERT INTO article(author, title,content,create_time) values(?, ?, ?, ?)",

                   article.getAuthor(),

                   article.getTitle(),

                   article.getContent(),

                   article.getCreateTime());

   

       }

   

       //删除文章

       public void deleteById(Long id) {

           //jdbcTemplate.update适合于insert 、update和delete操作;

           jdbcTemplate.update("DELETE FROM article WHERE id = ?",id);

   

       }

   

       //更新文章

       public void updateById(Article article) {

           //jdbcTemplate.update适合于insert 、update和delete操作;

           jdbcTemplate.update("UPDATE article SET author = ?, title = ? ,content = ?,create_time = ? WHERE id = ?",

                   article.getAuthor(),

                   article.getTitle(),

                   article.getContent(),

                   article.getCreateTime(),

                   article.getId());

   

       }

   

       //根据id查找文章

       public Article findById(Long id) {

           //queryForObject用于查询单条记录返回结果

           return (Article) jdbcTemplate.queryForObject("SELECT * FROM article WHERE id=?",

           new Object[]{id},new BeanPropertyRowMapper<>(Article.class));

       }

   

       //查询所有

       public List<Article> findAll(){

           //query用于查询结果列表

           return (List<Article>) jdbcTemplate.query("SELECT * FROM article ",  new BeanPropertyRowMapper<>(Article.class));

       }

   

   

   }

   

service层接口

   public interface ArticleService {

   

        void saveArticle(Article article);

   

        void deleteArticle(Long id);

   

        void updateArticle(Article article);

   

        Article getArticle(Long id);

   

        List<Article> getAll();

   }

service层操作JDBC持久层

   

   @Slf4j

   @Service   //服务层依赖注入注解

   public class ArticlleJDBCService  implements  ArticleService  {

   

       @Resource

       private

       ArticleJDBCDAO articleJDBCDAO;

   

       @Transactional

       public void saveArticle( Article article) {

           articleJDBCDAO.save(article);

           //int a = 2/0;  //人为制造一个异常,用于测试事务

           return article;

       }

   

       public void deleteArticle(Long id){

           articleJDBCDAO.deleteById(id);

       }

   

       public void updateArticle(Article article){

           articleJDBCDAO.updateById(article);

       }

   

       public Article getArticle(Long id){

           return articleJDBCDAO.findById(id);

       }

   

       public List<Article> getAll(){

           return articleJDBCDAO.findAll();

       }

   }

   

最后,在我们之前的章节为大家实现的ArticleController中调用ArticleRestJDBCService 实现方法,进行从Controller 到 Service 到 DAO层的全流程测试。

   重点测试一下事务的回滚,人为制造一个被除数为0的异常。

   在saveArticle方法上使用了@Trasactional注解,该注解基本功能为事务管理,保证saveArticle方法一旦有异常,所有的数据库操作就回滚。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
19天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
9天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 6
|
7天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
7天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
14天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
25 2
|
14天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
8天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
31 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
8天前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
49 1
|
6天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
20 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
下一篇
无影云桌面