Spring Boot 之數據庫連接操作


1.1 實驗內容
我們將在這一節介紹 JDBC 相關知識點,並結合實際代碼來學習 Spring Boot 中如何進行數據庫連接以及在 Spring Boot 項目中操作數據庫。

1.2 實驗知識點

  • JDBC
  • Spring Boot 連接 MySQL
  • 使用 Spring Boot 操作 MySQL 中的數據

1.3 實驗環境

  • JDK 1.8 或者更高版本
  • Spring Boot 2.1.0-RELEASE
  • Maven 3+
  • MySQL

1.4 代碼獲取
在學習前,一定要獲取源碼,因為篇幅原因,只會截取部分關鍵代碼。

wget https://labfile.oss.aliyuncs.com/courses/1244/lou-springboot-06.zip
unzip lou-springboot-06.zip
cd lou-springboot

JDBC

JDBC 全稱為 Java Data Base Connectivity(Java 數據庫連接),主要由接口組成,是一種用於執行 SQL 語句的 Java API。各個數據庫廠家基於它各自實現了自己的驅動程序(Driver),如下圖所示:

Java 程序在獲取數據庫連接時,需要以 URL 方式指定不同類型數據庫的 Driver,在獲得特定的 Connection 連接后,可按照 JDBC 規范對不同類型的數據庫進行數據操作,代碼如下:

//第一步,注冊驅動程序
//com.MySQL.jdbc.Driver
Class.forName("數據庫驅動的完整類名");
//第二步,獲取一個數據庫的連接
Connection conn = DriverManager.getConnection("數據庫地址","用戶名","密碼");
//第三步,創建一個會話
Statement stmt=conn.createStatement();
//第四步,執行SQL語句
stmt.executeUpdate("SQL語句");
//或者查詢記錄
ResultSet rs = stmt.executeQuery("查詢記錄的SQL語句");
//第五步,對查詢的結果進行處理
while(rs.next()){
//操作
}
//第六步,關閉連接
rs.close();
stmt.close();
conn.close();

對上面幾行代碼,大家不會陌生,這是我們初學 JDBC 連接時最熟悉的代碼了,雖然現在可能用到了一些數據層 ORM 框架(比如 MyBatis 或者 Hibernate ),但是底層實現依然如同上面代碼一樣,只不過框架對其做了一些封裝而已,通過 JDBC 使得我們可以直接使用 Java 程序來對關系型數據庫進行操作,接下來我們將對 Spring Boot 如何使用 JDBC 進行實例演示。

啟動 MySQL

如果 MySQL 數據庫服務沒有啟動的話需要進行這一步操作。

進入實驗樓線上開發環境,首先打開一個命令窗口,點擊 File -> Open New Terminal 即可,之后在命令行中輸入以下命令:

sudo service mysql start
copy

因為用戶權限的關系,需要在命令前增加 sudo 取得 root 權限,不然在啟動時會報錯,之后等待 MySQL 正常啟動即可,過程如下圖所示:

創建數據庫和表結構

首先,執行如下命令登錄 MySQL 數據庫:

sudo mysql -u root

因為實驗樓線上實驗環境中 MySQL 數據庫默認並沒有設置密碼,因此以上命令即可完成登錄,登錄后執行命令:

show databases;

可以查看當前 MySQL 中的所有 database ,如果不存在我們本節課所需的 lou_springboot 數據庫,則需要把創建語句復制到 MySQL 命令行中執行( SQL 語句在文章中已經給出,直接復制即可),這樣數據庫和表結構都創建完成了,整個過程如下所示:

SQL 語句如下:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`lou_springboot` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `lou_springboot`;

DROP TABLE IF EXISTS `tb_user`;

CREATE TABLE `tb_user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '登錄名',
  `password` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

首先創建了 lou_springboot 的數據庫,之后在數據庫中新建了一個名稱為 tb_user 的數據表,表中有 id , name , password 三個字段,同學們在測試時可以直接將以上 SQL 拷貝到 MySQL 中執行即可。

Spring Boot 連接數據庫

  • 新增 pom 依賴

在進行數據庫連接前,首先將相關 jar 包依賴引入到項目中,Spring Boot 針對 JDBC 的使用提供了對應的 Starter 包:spring-boot-starter-jdbc,方便在 Spring Boot 生態中更好的使用 JDBC,演示項目中使用 MySQL 作為數據庫,因此項目中也需要引入 MySQL 驅動包,因此在 pom.xml 文件中新增如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  • 數據庫配置信息

為了能夠連接上數據庫並進行操作,在新增依賴后,我們也需要對數據庫的基本信息進行配置,比如數據庫地址、賬號、密碼等信息,這些配置依然是在 application.properties 文件中增加,配置如下:

# 數據源基本配置
spring.datasource.url=jdbc:mysql://localhost:3306/lou_springboot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
#實驗樓密碼為空
spring.datasource.password=

接下來就可以進行連接測試了。值得注意的是,在 Spring Boot 2 中,數據庫驅動類推薦使用 com.mysql.cj.jdbc.Driver,而不是我們平時比較熟悉的 com.mysql.jdbc.Driver 類了。

  • 連接測試

最后,我們編寫一個測試類來測試一下目前能否獲得與數據庫的連接,在src/test/java/com/lou/springboot/下添加測試類 ApplicationTests ,並在其中添加 datasourceTest() 單元測試方法,源碼及注釋如下:

package com.lou.springboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    // 注入數據源對象
    @Autowired
    private DataSource dataSource;

    @Test
    public void datasourceTest() throws SQLException {
        // 獲取數據庫連接對象
        Connection connection = dataSource.getConnection();
        // 判斷連接對象是否為空
        System.out.println(connection != null);
        connection.close();
    }
}

運行單元測試方法mvn test,如果 connection 對象不為空,則證明數據庫連接成功,如下圖所示,在對 connection 對象進行判空操作時,得到的結果是 connection 非空。如果數據庫連接對象沒有正常獲取,則需要檢查數據庫是否連接或者數據庫信息是否配置正確。

至此,Spring Boot 連接數據庫的過程就講解完成了,分別是引入依賴、增加數據庫信息配置、注入數據源進行數據庫操作。

Spring Boot 數據源自動配置

通過前一小節的演示大家也能夠觀察到,我們在配置文件中只需要加上數據庫的相關信息即可獲取到數據庫連接對象,那么 Spring Boot 究竟做了哪些自動配置操作使得我們可以如此簡單的就直接獲取到數據庫連接呢?首先,我們來分析一下注入的 DataSource 數據源對象,更改測試類方法如下:

    @Test
    public void datasourceTest() throws SQLException {
        // 獲取數據源類型
        System.out.println("默認數據源為:" + dataSource.getClass());
    }

運行測試方法,得到的結果為: 默認數據源為:class com.zaxxer.hikari.HikariDataSource

基於以上結果我們可以得出結論,在項目啟動前,Spring Boot 已經默認向 IOC 容器中注冊了一個類型為 HikariDataSource 的數據源對象,不然我們在使用 @Autowired 進行數據源的引入時肯定會報錯,HikariCP 是 Spring Boot 2.0 默認使用的數據庫連接池,自動配置類為 DataSourceAutoConfiguration.class 和 DataSourceConfiguration.class ,感興趣的同學可以閱讀一下源碼理解一下數據源自動配置的過程。

Spring Boot 不僅僅是自動配置了 DataSource 對象,在數據源對象自動配置完成后,Spring Boot 也自動配置了 JdbcTemplate 對象,JdbcTemplate 是 Spring 對 JDBC 的封裝,目的是使 JDBC 更加易於使用,Spring Boot 默認也並沒有集成相關的 ORM 框架,而是提供了 JdbcTemplate 來簡化開發者對於數據庫的操作,關於 ORM 框架集成到 Spring Boot 項目中的教程我會在后續實驗中演示,接下來我們使用 JdbcTemplate 來進行數據庫的常用 SQL 操作。

Spring Boot 操作 MySQL

在正確配置數據源之后,開發者可以直接在代碼中使用 JdbcTemplate 對象進行數據庫操作,接下來就是代碼實踐了,為了演示方便,我們直接在com.lou.springboot.controller下新建一個 Controller 類,並注入 JdbcTemplate 對象,接下來我們創建兩個方法,一個是查詢 tb_user 中的數據,另一個方法是根據傳入的參數向 tb_user 表中新增數據,代碼如下:

package com.lou.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class JdbcController {

    // 注入 jdbcTemplate
    @Autowired
    JdbcTemplate jdbcTemplate;

    // 查詢 tb_user 表中的所有記錄
    @GetMapping("/users/queryAll")
    public List<Map<String, Object>> queryAll() {
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from tb_user");
        return list;
    }

    // 向 tb_user 表中新增一條記錄
    @GetMapping("/users/insert")
    public Object insert(String name, String password) {
        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {
            return false;
        }
        jdbcTemplate.execute("insert into tb_user(`name`,`password`) value (\"" + name + "\",\"" + password + "\")");
        return true;
    }
}

打開 Web 服務

使用mvn spring-boot:run啟動項目,在項目啟動成功后,可以點擊頁面上方的 Web 服務直接在顯示查看網站效果。

之后會在瀏覽器中彈出 https://********.simplelab.cn 頁面,我們可以在瀏覽器中輸入如下地址進行驗證:

  • 新增:http://********.simplelab.cn/users/insert?name=shiyanlou1&password=syl123
  • 查詢:https://********.simplelab.cn/users/queryAll

如果能夠正常獲取到記錄以及正確向 tb_user 表中新增記錄就表示功能整合成功!結果如下所示:


驗證 MySQL 中的數據

最后,我們登錄實驗樓演示環境中的 MySQL 數據庫,查看表中的數據是否與前一步驟中的數據一致,過程如下:

最后得到的數據確實與 web 頁面中看到的數據一致,功能一切正常,本次實驗到此結束!

實驗總結

在 Spring Boot 項目中操作數據庫,僅僅需要幾行配置代碼即可完成數據庫的連接操作,並不需要多余的設置,再加上 Spring Boot 自動配置了 jdbcTemplate 對象,開發者可以直接上手進行數據庫的相關開發工作。希望大家對於 Spring Boot 的自動配置以及 Spring Boot 項目進行數據庫操作有了更好的認識,作為知識的補充和拓展,接下來的文章中我們也會講解 Spring Boot 與 ORM 框架的整合實踐,也希望大家能夠在課后自行學習源碼並根據文中的 SQL 實踐進行練習,代碼也需要多寫,這樣的話進步才會更加明顯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM