SpringBoot:3.SpringBoot使用Spring-data-jpa實現數據庫訪問

作Web開發,首先要能將數據渲染到網頁中展現,其次是要獲取數據庫數據展現到視圖層,在前面的文章SpringBoot整合Thymeleaf模板引擎渲染web視圖,咱們實現了從後端數據展現到視圖層,那麼下面咱們經過使用Spring Data Jpa來實現簡單的數據庫增刪改查功能。java

1.pom.xml中引入依賴的jar包

<!--Web開發依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--junit測試依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--jpa依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>    
        <!-- 引入MySQL鏈接的依賴包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>

由於項目是基於Spring Boot 2.1.9.RELEASE版本的,而我本地使用的Mysql是5.X版本,因此這裏引入mysql依賴的時候添加了版本信息,這樣能夠引入相應的版本,若是不加版本信息將會引入8.X版本的Mysql,可能在運行項目測試出現錯誤。mysql

2.配置application.properties數據庫信息

# 數據庫鏈接信息
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 自動建立表結構的設置
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要做用是:自動建立、更新、驗證數據庫表結構。該參數的幾種配置以下:git

  • create:每次加載hibernate時都會刪除上一次的生成的表,而後根據你的model類再從新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是致使數據庫表數據丟失的一個重要緣由。
  • create-drop:每次加載hibernate時根據model類生成表,可是sessionFactory一關閉,表就自動刪除
  • update:最經常使用的屬性,第一次加載hibernate時根據model類會自動創建起表的結構(前提是先創建好數據庫),之後加載hibernate時根據model類自動更新表結構,即便表結構改變了但表中的行仍然存在不會刪除之前的行。要注意的是當部署到服務器後,表結構是不會被立刻創建起來的,是要等應用第一次運行起來後纔會。
  • validate:每次加載hibernate時,驗證建立數據庫表結構,只會和數據庫中的表進行比較,不會建立新表,可是會插入新值。

3.建立實體類

建立一個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,經過ORM框架其會被映射到數據庫表中,因爲配置了hibernate.hbm2ddl.auto,而且配置的值爲:create-drop,在應用啓動的時候框架會自動去數據庫中建立對應的表,應用中止時則會自動刪除表信息。程序員

package com.w3cjava.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }   
}

4.建立數據訪問接口

下面針對User實體建立對應的Repository接口實現對該實體的數據訪問,以下代碼:github

package com.w3cjava.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.w3cjava.entity.User;
/**
 * 
 * @class  UserRepository
 * @version 1.0.0
 * @author cos
 * @desc   建立對應的Repository接口實現對該實體的數據訪問
 *
 */
public interface UserRepository extends JpaRepository<User, Long> {

    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}

經過繼承JpaRepository接口,已經實現了基礎的增(save)刪(delete)改(save)查(findAll、findOne),具體能夠查看API文檔,所以開發過程當中,基本的數據訪問層不須要開發者再本身定義。web

項目開發過程當中,每每對數據的訪問都比較複雜,這時候就須要程序員本身定義相對複雜的Sql語句。具體能夠參考API文檔spring

Spring Data Jpa還提供了經過解析方法名建立查詢,好比上面的代碼:sql

User findByName(String name);

    User findByNameAndAge(String name, Integer age);

5.單元測試

整合Spring Data Jpa所須要的基本類和配置已經準備好,下面進行簡單的單元測試。數據庫

package com.w3cjava.service;

import org.junit.Assert;
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 com.w3cjava.SpringBootSpringDataJpaApplication;
import com.w3cjava.dao.UserRepository;
import com.w3cjava.entity.User;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBootSpringDataJpaApplication.class})
public class UserServiceTest {
    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {

        // 建立10條記錄
        userRepository.save(new User("A", 10));
        userRepository.save(new User("B", 20));
        userRepository.save(new User("C", 30));
        userRepository.save(new User("D", 40));
        userRepository.save(new User("E", 50));
        userRepository.save(new User("F", 60));
        userRepository.save(new User("G", 70));
        userRepository.save(new User("H", 80));
        userRepository.save(new User("I", 90));
        userRepository.save(new User("J", 100));

        // 測試findAll, 查詢全部記錄
        Assert.assertEquals(10, userRepository.findAll().size());

        // 測試findByName, 查詢姓名爲FFF的User
        Assert.assertEquals(60, userRepository.findByName("F").getAge().longValue());

        // 測試findUser, 查詢姓名爲FFF的User
        Assert.assertEquals(60, userRepository.findUser("F").getAge().longValue());

        // 測試findByNameAndAge, 查詢姓名爲FFF而且年齡爲60的User
        Assert.assertEquals("F", userRepository.findByNameAndAge("F", 60).getName());

        // 測試刪除姓名爲AAA的User
        userRepository.delete(userRepository.findByName("A"));

        // 測試findAll, 查詢全部記錄, 驗證上面的刪除是否成功
        Assert.assertEquals(9, userRepository.findAll().size());

    }
}

6.參考文章

Cannot load driver class: com.mysql.jdbc.Driver: https://blog.csdn.net/linmeng...
spring Boot--junit單元測試: https://blog.csdn.net/adminBf...
源碼:03.Spring-Boot-SpringDataJpasegmentfault

歡迎掃面下列二維碼關注「餘弦的自留地」公衆微信號
在這裏插入圖片描述萬物之中,但願至美

相關文章
相關標籤/搜索