(七)springboot+mysql+jpa簡單實現
阿新 • • 發佈:2019-01-04
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就實現了。