Spring Boot快速入門(四):使用jpa進行數據庫操做

添加依賴

新建項目選擇web,JPA,MySQL三個依賴java

圖片描述

對於已存在的項目能夠在bulid.gradle加入,spring boot將會幫你自動配置好mysql

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('mysql:mysql-connector-java')

配置基本信息

而後在src/main/resources/application.properties下添加基本配置git

#數據庫鏈接地址
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false
#數據庫帳號
spring.datasource.username=root
#數據庫密碼
spring.datasource.password=123456zxc
#數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#jpa設置
spring.jpa.hibernate.ddl-auto=create
#是否在控制檯顯示數據庫語句
spring.jpa.show-sql=true

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

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

至此基本配置完成web

建立實體

建立一個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,經過ORM框架其會被映射到數據庫表中,因爲配置了hibernate.hbm2ddl.auto,在應用啓動的時候框架會自動去數據庫中建立對應的表。spring

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;//id
    @Column(length = 30)//長度30
    private String name;//名稱
    @Column(nullable = false)//不可空
    private Integer age;//年齡

    public User()
    {
    }

    public User(String name, Integer 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;
    }
}

建立數據訪問接口

建立一個userRepository接口,進行數據庫操做sql

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

import java.util.List;

public interface UserRepository extends JpaRepository<User, Long>//JpaRepository<實體類型,主鍵類型>
{
    // 經過名稱找到用戶
    User findByName(String name);

    // 經過名稱和年齡找到用戶
    User findByNameAndAge(String name, Integer age);

    // 經過名稱模糊查詢
    List<User> findByNameLike(String name);

    // 使用hql查詢
    @Query("from User u where u.name=:name")//:name對應@Param裏的name
    User findByHQL(@Param("name") String name);

    // 使用sql查詢
    @Query(value = "select * from user where name = ?1 and age = ?2", nativeQuery = true)//?1表示第一個參數,?2表示第二個參數
    User findBySQL(String name, Integer age);
}

單元測試

在src/test/java/你的包名/你的項目名ApplicationTests編寫對應的單元測試來驗證編寫的內容是否正確數據庫

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;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaLearnApplicationTests
{
    // 注入userRepository
    @Autowired
    private UserRepository userRepository;

    @Test
    public void contextLoads()
    {
        // 添加10個測試用例
        userRepository.save(new User("QQQ",1));
        userRepository.save(new User("WWW",2));
        userRepository.save(new User("EEE",3));
        userRepository.save(new User("AAA",4));
        userRepository.save(new User("SSS",5));
        userRepository.save(new User("DDD",6));
        userRepository.save(new User("ZZZ",7));
        userRepository.save(new User("XXX",8));
        userRepository.save(new User("CCC",9));
        userRepository.save(new User("QQQ2",10));

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

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

        // 測試findByHQL, 查詢姓名爲AAA的User
        Assert.assertEquals(4, userRepository.findByHQL("AAA").getAge().longValue());

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

        // 測試findBySQL, 查詢姓名爲SSS而且年齡爲5的User
        Assert.assertEquals("SSS", userRepository.findBySQL("SSS", 5).getName());

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

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

        // 測試findAll, 查詢名字有Q的有幾個
        Assert.assertEquals(2,userRepository.findByNameLike("%Q%").size());
    }

}

圖片描述

圖片描述

點擊運行測試用例服務器

圖片描述

源碼地址:https://github.com/LieRabbit/...
原文地址:https://lierabbit.cn/2018/01/...session

相關文章
相關標籤/搜索