Spring Data JDBC、JPA

解決数據庫訪問的問題,把數據持久化存儲。

JDBC

MySql,Oracle,H2…關係型數據庫如此多,寫代碼時不可能針对每一種數據庫都去想如何处理和存儲。
于是要求每個數據庫提供一個驅動程序,寫代碼時只跟驅動程序打交道,而不跟具體的數據庫做交互。
JDBC就是这樣一種媒介,屏蔽了各種數據庫的差異性。

DataSource

JDBC DataSource 是一个数据库连接池,可以管理一组预先打开的数据库连接,并通过 DataSource 对象将它们提供给应用程序。由于在应用程序中创建和关闭数据库连接可能会导致性能问题,因此使用 DataSource 可以有效地避免这些问题。

  1. 可以配置 DataSource 对象以自动检测和清除空闲或过期的数据库连接。
  2. 可以配置 DataSource 对象以在连接不可用时重试连接。
  3. 可以使用不同的 DataSource 实现来支持分布式事务和集群应用程序。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class JdbcDataSourceExample {
    public static void main(String[] args) {
    try {
    // 创建 DataSource 对象
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost/test");
    dataSource.setUsername("root");
    dataSource.setPassword("password");

    // 获取数据库连接
    Connection conn = dataSource.getConnection();

    // 创建 Statement 对象
    Statement stmt = conn.createStatement();

    // 执行 SQL 查询
    ResultSet rs = stmt.executeQuery("SELECT * FROM customers");

    // 处理结果集
    while(rs.next()) {
    System.out.println(rs.getString("name") + " " + rs.getString("email"));
    }

    // 关闭结果集、Statement 对象和数据库连接
    rs.close();
    stmt.close();
    conn.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    每次都要建立連接,釋放連接,麻烦又重复,如何簡化呢?

SpringBoot Starter JDBC

Spring已經把这些抽取出來了,提取成了模板,只要提供可变的部分即可。
添加依赖:

1
2
3
4
<dependency>
<groupId>org.sptingframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

H2數據庫依赖包

H2数据库是一款基于Java编写的嵌入式关系型数据库管理系统(RDBMS),它支持SQL和JDBC API。它被设计成一个轻量级的数据库,可嵌入到Java应用程序中,并且非常容易使用和部署。具有高性能、小型化、可嵌入性、易用性和免费开源等优点

1
2
3
4
5
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

H2訪問:

表结構的構造:
表结構的構造
17行表示Taco是哪個order的,18行表示Taco在这個order里的先后順序:
表

我們不會直接操作对象,所以需要建立接口:

操作配料表的接口:
应用層代碼只看到接口,DAO層實現

  • 只要接口沒改变,實現怎么改都能用
  • 只關心使用不關心怎么實現
    操作配料表的

JdbcTemplate模版

spring提拱的模版,需要用時把它注入進來
JdbcTemplate
只需要提供變化的部分就能用,比如查詢,只要提供查詢語句和把查到的結果轉成Java对象的實現就可以了
查詢
轉換对象:
轉換对象
插入:
插入

JPA

JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

定義接口繼承CurdRepository就好了,方法都集成了:
數據接口

对表數據定制化操作

  1. @Table
    可以針对領域对象,指定將对象对应到哪張表,名字一樣可不加

    1
    @Table("doll")
  2. @Column
    指定列名

  3. @OneToMany