当前位置:   article > 正文

Springboot框架整合Spring JDBC操作数据_spring-boot-starter-jdbc

spring-boot-starter-jdbc

一、jdbc简介

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

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

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

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

  1. 加载数据库驱动
  2. 建立数据库连接
  3. 创建数据库操作对象
  4. 定义操作的 SQL 语句
  5. 执行数据库操作
  6. 获取并操作结果集
  7. 关闭对象,回收资源

关键代码如下:

  1. try {
  2. // 1、加载数据库驱动
  3. Class.forName(driver);
  4. // 2、获取数据库连接
  5. conn = DriverManager.getConnection(url, username, password);
  6. // 3、获取数据库操作对象
  7. stmt = conn.createStatement();
  8. // 4、定义操作的 SQL 语句
  9. String sql = "select * from user where id = 6";
  10. // 5、执行数据库操作
  11. rs = stmt.executeQuery(sql);
  12. // 6、获取并操作结果集
  13. while (rs.next()) {
  14. // 解析结果集
  15. }
  16. } catch (Exception e) {
  17. // 日志信息
  18. } finally {
  19. // 7、关闭资源
  20. }

通过上面的示例可以看出直接使用 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驱动。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>mysql</groupId>
  7. <artifactId>mysql-connector-java</artifactId>
  8. </dependency>

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

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://192.168.161.3:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
  4. username: test
  5. password: 4rfv$RFV
  6. 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

  1. CREATE TABLE `article` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `author` VARCHAR(32) NOT NULL,
  4. `title` VARCHAR(32) NOT NULL,
  5. `content` VARCHAR(512) NOT NULL,
  6. `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  7. PRIMARY KEY (`id`)
  8. )
  9. COMMENT='文章'
  10. ENGINE=InnoDB;

DAO层代码:

  • jdbcTemplate.update适合于insert 、update和delete操作;
  • jdbcTemplate.queryForObject用于查询单条记录返回结果
  • jdbcTemplate.query用于查询结果列表
  • BeanPropertyRowMapper可以将数据库字段的值向Article对象映射,满足驼峰标识也可以自动映射。如:数据库create_time字段映射到createTime属性。
  1. @Repository //持久层依赖注入注解
  2. public class ArticleJDBCDAO {
  3. @Resource
  4. private JdbcTemplate jdbcTemplate;
  5. //保存文章
  6. public void save(Article article) {
  7. //jdbcTemplate.update适合于insert 、update和delete操作;
  8. jdbcTemplate.update("INSERT INTO article(author, title,content,create_time) values(?, ?, ?, ?)",
  9. article.getAuthor(),
  10. article.getTitle(),
  11. article.getContent(),
  12. article.getCreateTime());
  13. }
  14. //删除文章
  15. public void deleteById(Long id) {
  16. //jdbcTemplate.update适合于insert 、update和delete操作;
  17. jdbcTemplate.update("DELETE FROM article WHERE id = ?",id);
  18. }
  19. //更新文章
  20. public void updateById(Article article) {
  21. //jdbcTemplate.update适合于insert 、update和delete操作;
  22. jdbcTemplate.update("UPDATE article SET author = ?, title = ? ,content = ?,create_time = ? WHERE id = ?",
  23. article.getAuthor(),
  24. article.getTitle(),
  25. article.getContent(),
  26. article.getCreateTime(),
  27. article.getId());
  28. }
  29. //根据id查找文章
  30. public Article findById(Long id) {
  31. //queryForObject用于查询单条记录返回结果
  32. return (Article) jdbcTemplate.queryForObject("SELECT * FROM article WHERE id=?",
  33. new Object[]{id},new BeanPropertyRowMapper<>(Article.class));
  34. }
  35. //查询所有
  36. public List<Article> findAll(){
  37. //query用于查询结果列表
  38. return (List<Article>) jdbcTemplate.query("SELECT * FROM article ", new BeanPropertyRowMapper<>(Article.class));
  39. }
  40. }

service层接口

  1. public interface ArticleService {
  2. void saveArticle(Article article);
  3. void deleteArticle(Long id);
  4. void updateArticle(Article article);
  5. Article getArticle(Long id);
  6. List<Article> getAll();
  7. }

service层操作JDBC持久层

  1. @Slf4j
  2. @Service //服务层依赖注入注解
  3. public class ArticlleJDBCService implements ArticleService {
  4. @Resource
  5. private
  6. ArticleJDBCDAO articleJDBCDAO;
  7. @Transactional
  8. public void saveArticle( Article article) {
  9. articleJDBCDAO.save(article);
  10. //int a = 2/0; //人为制造一个异常,用于测试事务
  11. return article;
  12. }
  13. public void deleteArticle(Long id){
  14. articleJDBCDAO.deleteById(id);
  15. }
  16. public void updateArticle(Article article){
  17. articleJDBCDAO.updateById(article);
  18. }
  19. public Article getArticle(Long id){
  20. return articleJDBCDAO.findById(id);
  21. }
  22. public List<Article> getAll(){
  23. return articleJDBCDAO.findAll();
  24. }
  25. }

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

  • 重点测试一下事务的回滚,人为制造一个被除数为0的异常。
  • 在saveArticle方法上使用了@Trasactional注解,该注解基本功能为事务管理,保证saveArticle方法一旦有异常,所有的数据库操作就回滚。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号