Springboot框架整合Spring JDBC操作数据

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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
|
1天前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
9 4
|
3天前
|
监控 Java API
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
15 1
|
16小时前
|
Java Maven 开发工具
IDEA使用Spring Initializr流畅的创建springboot项目
IDEA使用Spring Initializr流畅的创建springboot项目
6 0
|
22小时前
|
NoSQL Java 关系型数据库
非关系型数据库NoSQL数据层解决方案 之 Mongodb 简介 下载安装 springboot整合与读写操作
非关系型数据库NoSQL数据层解决方案 之 Mongodb 简介 下载安装 springboot整合与读写操作
4 0
|
22小时前
|
NoSQL Java 关系型数据库
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
3 0
|
3天前
|
前端开发 JavaScript Java
【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略
【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略
7 0
|
3天前
|
JavaScript Java 数据库连接
【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理
【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理
11 0
|
1月前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
14小时前
|
Java Maven
springboot项目打jar包后,如何部署到服务器
springboot项目打jar包后,如何部署到服务器
7 1