1. 程式人生 > >(七)springboot+mysql+jpa簡單實現

(七)springboot+mysql+jpa簡單實現

1 首先需要在pom.xml引入我們需要的包

 <dependency>    
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <groupId>org.springframework.boot</groupId>
</dependency>

<dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId
>
<scope>runtime</scope> </dependency>

上面的pom我就不說了,相信大家都能看懂一個是mysql的連線一個是引用的jpa

2 在application.xml中配置:資料庫連線資訊(如使用嵌入式資料庫則不需要)、自動建立表結構的設定,例如使用mysql的情況如下:

spring.datasource.url=jdbc:mysql://xxxxx:3306/test
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource
.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=update

上面是你的mysql資料庫連線。spring.jpa.hibernate.ddl-auto 是hibernate的配置屬性,其主要作用是:自動建立、更新、驗證資料庫表結構。該引數的幾種配置如下:

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

3 建立實體
建立一個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會被對映到資料庫表中,由於配置了spring.jpa.hibernate.ddl-auto,在應用啟動的時候框架會自動去資料庫中建立對應的表。

package com.fy.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;

/**
 * @author : lqf
 * @description : 測試實體
 * @date : Create in 15:26 2018/5/4
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class User implements Serializable {

    /**
     * 主鍵id
     */
    @Id
    @GeneratedValue
    private Integer id;

    /**
     * 姓名
     */
    @Column(name = "name", nullable = false)
    private String name;

    /**
     * 年齡
     */
    @Column(name = "age", nullable = false)
    private Integer age;
}

上面的實體類中沒有提供get、set、構造方法等而是用了很多註解,這裡說明一下註解(明白的自動略過)

  • @Data : 自動為所有欄位新增@ToString, @EqualsAndHashCode, @Getter方法,為非final欄位新增@Setter,和@RequiredArgsConstructor
  • @NoArgsConstructor : 自動生成無參建構函式
  • @AllArgsConstructor : 自動生成全參建構函式
  • @Builder : 用在類、構造器、方法上,為你提供複雜的builder APIs,讓你可以像如下方式一樣呼叫Person.builder().name(“Adam Savage”).city(“San Francisco”).job(“Mythbusters”).job(“Unchained Reaction”).build();
  • @Entity : 對實體註釋。任何Hibernate對映物件都要有這個註釋
  • @Table : 宣告此物件對映到資料庫的資料表,通過它可以為實體指定表(talbe),目錄(Catalog)和schema的名字。該註釋不是必須的,如果沒有則系統使用預設值(實體的短類名)。

4 建立資料訪問介面
下面針對User實體建立對應的Repository介面實現對該實體的資料訪問,如下程式碼:

package com.fy.repository;

import com.fy.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

/**
* @author : lqf
* @description : 測試 User repository
* @date : Create in 15:35 2018/5/4
*/
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);
}

在上例中,我們可以看到下面兩個函式:

  • User findByName(String name)
  • User findByNameAndAge(String name, Integer age)

它們分別實現了按name查詢User實體和按name和age查詢User實體,可以看到我們這裡沒有任何類SQL語句就完成了兩個條件查詢方法。這就是Spring-data-jpa的一大特性:通過解析方法名建立查詢。

除了通過解析方法名來建立查詢外,它也提供通過使用@Query 註解來建立查詢,您只需要編寫JPQL語句,並通過類似“:name”來對映@Param指定的引數,就像例子中的第三個findUser函式一樣。

package com.fy;

import com.fy.domain.User;
import com.fy.repository.UserRepository;
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 AgentApiApplicationTests {

   @Autowired
   private UserRepository userRepository;

   @Test
   public void contextLoads() {
      // 建立10條記錄
      userRepository.save(new User("AAA", 10));
      userRepository.save(new User("BBB", 20));
      userRepository.save(new User("CCC", 30));
      userRepository.save(new User("DDD", 40));
      userRepository.save(new User("EEE", 50));
      userRepository.save(new User("FFF", 60));
      userRepository.save(new User("GGG", 70));
      userRepository.save(new User("HHH", 80));
      userRepository.save(new User("III", 90));
      userRepository.save(new User("JJJ", 100));

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

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

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

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

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

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

   }

}

到此一個簡單的springboot + mysql +jpa就實現了。