Springboot框架整合Spring JDBC操作数据

简介: 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://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL Java 关系型数据库
深入浅出 Spring Boot - 数据访问之JDBC
深入浅出 Spring Boot - 数据访问之JDBC
603 0
深入浅出 Spring Boot - 数据访问之JDBC
|
Java 关系型数据库 数据库连接
SpringBoot(八)之JdbcTemplate
在 application.properties 或 application.yml 文件中配置数据库连接信息。
1217 0
|
SQL Java 关系型数据库
SpringBoot从入门到精通(三十)如何使用JdbcTemplate操作数据库?
前面介绍了Mybatis数据持久化框架,Mybatis虽然功能强大,但是,使用起来还是比较复杂的。所以接下来介绍一个简单的数据持久化框架——JdbcTemplate。
10666 2
SpringBoot从入门到精通(三十)如何使用JdbcTemplate操作数据库?
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
1652 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
druid Oracle 架构师
SpringBoot从小白到精通(十四)使用JdbcTemplate操作数据库,配置多数据源!
Spring Boot 除了Mybatis数据库框架,还有JdbcTemplate等数据库操作框架,同样也比较简单实用,如果是一般简单的项目,用JdbcTemplate完全可以实现相关的数据库操作。它虽然没有MyBatis功能强大,但使用比较简单,JdbcTemplate应该算是最简单的数据持久化方案,所以下面就来给大家介绍Spring Boot 使用JdbcTemplate操作数据库,配置多数据源!
SpringBoot从小白到精通(十四)使用JdbcTemplate操作数据库,配置多数据源!
|
Java 关系型数据库 MySQL
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
865 0
|
SQL 存储 安全
使用 SpringBoot 访问 MySQL 数据库
创建一个 MySQL 数据库,构建一个 Spring 应用程序,并将其连接到新创建的数据库。
815 0
|
Web App开发 Java Apache
SpringBoot 项目 @EnableWebMvc 注解应用总结
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80249894 SpringBoot 项目中不管是在哪个类上使用 @EnableWebMvc 注解,都将导致所有URL访问时返回 404 错误; 看到一篇文章:“Spring4 @EnableWebMvc 纯注解启动”,但还没有在 Spring MVC 项目上尝试过。
2935 0
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
2509 1

热门文章

最新文章