SpringBoot Jpa入門案例
我們先來了解一下是什麼是springboot jpa,springboot jpa的入門又是怎麼樣的呢?
1.springboot jpa是sun公司提供的持久化規範,為java開發人員提供了一種物件/關聯對映工具來 管理java應用中的關係資料。它主要表現是為了簡化現有的持久化開發工作和整合ORM技術,結habernate、toplink、JDO等ORM框架各自為營的局面。
2.Spring Boot Jpa 是 Spring 基於 ORM 框架、Jpa 規範的基礎上封裝的一套 Jpa 應用框架,可使開發者用極簡的程式碼即可實現對資料的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴充套件!學習並使用 Spring Data Jpa 可以極大提高開發效率!
Spring Boot Jpa 讓我們解脫了 DAO 層的操作,基本上所有 CRUD 都可以依賴於它來實現
注意:Jpa 是一套規範,不是一套產品,那麼像 Hibernate,TopLink,JDO 他們是一套產品,如果說這些產品實現了這個 Jpa 規範,那麼我們就可以叫他們為 Jpa 的實現產品。
3.瞭解一下Spring Data jpa
SpringData為我們提供使用統的API來對資料訪問層進行操作;這主要是Spring Data Commons專案來實現的。Spring Data Commons讓我們在使用關係型或者非關係型資料訪問技術時都基於Spring提供的統一標準,標準包含了CRUD(建立、獲取、更新、刪除)、查詢、排序和分頁的相關操作。
4.統一的Repository介面
Repository<T, ID extends Serializable> : 統一介面
RevisionRepository<T, ID extends Serializable, N extends Number & Comparable> :
基於樂觀鎖機制CrudRepository<T, ID extends Serializable> : 基本CRUD操作
PagingAndSortingRepository<T, ID extends Serializable> :基本CRUD及分頁
瞭解完基本的概念之後,我們就開始進行一個小小的案例吧:
我們首先配置一下配置檔案,由於springboot Data 脫離Dao操作,所以,我們只需要有一個庫,便能自動生成相應的資料表,而這些,只需要在springboot 中的配置檔案中實現(以application.poroerties為例)
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #hibernate的ddl操作 spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect #顯示sql的執行 spring.jpa.show-sql=true #格式化資料庫的語句 spring.jpa.properties.hibernate.format_sql=true
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
配置好這些,自己建立一個model,在model裡面建立資料庫表(類名)
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
@Entity//引入jpa的對映關係
public class User {
@Id//生成主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增主鍵
private Long id;
@Column(nullable = false, unique = true)
private String userName;
@Column(nullable = false)
private String passWord;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = true, unique = true)
private String nickName;
@Column(nullable = false)
private String regTime;
public User() {
}
public User(String userName, String passWord, String email, String nickName, String regTime) {
this.userName = userName;
this.passWord = passWord;
this.email = email;
this.nickName = nickName;
this.regTime = regTime;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getRegTime() {
return regTime;
}
public void setRegTime(String regTime) {
this.regTime = regTime;
}
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
注意: 既然是SpringBoot Data Jpa 就應該有相應的駐註解需要特別注意
@Entity//引入jpa的對映關係
@GeneratedValue(strategy = GenerationType.IDENTITY)//生成的主鍵型別
- 1
- 2
接下來,我們就去實現
import com.neo.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public interface UserRepository extends JpaRepository<User, Long> {
User findByUserName(String userName);
User findByUserNameOrEmail(String username, String email);
//超時處理
@Transactional(timeout = 10)
@Modifying
@Query("update User set userName = ?1 where id = ?2")
int modifyById(String userName, Long id);
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteById(Long id);
@Query("select u from User u where u.email = ?1")
User findByEmail(String email);
@Query("select u from User u")
Page<User> findALL(Pageable pageable);
Page<User> findByNickName(String nickName, Pageable pageable);
Slice<User> findByNickNameAndEmail(String nickName, String email,Pageable pageable);
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
我來解釋一下里面的一些比較重要的東西:
首先是繼承JpaRepository<T, ID>
,由於springboot底層實現了自動化配置,所以我們呼叫jpa的使用介面就行了。
接著就是幾個註解:
@Transactional、@Modifying 、@Query
這幾個註解為什麼會出現在這裡面
@Transactional
:是事務的宣告,是說明這個方法是一個事務,在後面呼叫時,將操作與事務有關的東西;
@Modifying
註解在@Query註解中編寫JPQL實現DELETE
和UPDATE
操作的時候必須加上@modifying
註解,以通知Spring Data 這是一個DELETE
或UPDATE
操作,UPDATE
或者DELETE
操作需要使用事務。
注意JPQL不支援INSERT操作。
最後,我們建立一個測試類:
import com.neo.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.text.DateFormat;
import java.util.Date;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests {
@Resource
private UserRepository userRepository;
@Test
public void testSave() {
//轉義時間
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String formattedDate = dateFormat.format(date);
userRepository.save(new User("aa", "aa123456","[email protected]", "aa", formattedDate));
userRepository.save(new User("bb", "bb123456","[email protected]", "bb", formattedDate));
userRepository.save(new User("cc", "cc123456","[email protected]", "cc", formattedDate));
// Assert.assertEquals(3, userRepository.findAll().size());
// Assert.assertEquals("bb", userRepository.findByUserNameOrEmail("bb", "[email protected]").getNickName());
// userRepository.delete(userRepository.findByUserName("aa"));
}
@Test
public void testBaseQuery() {
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String formattedDate = dateFormat.format(date);
User user=new User("ff", "ff123456","[email protected]", "ff", formattedDate);
userRepository.findAll();
userRepository.findById(3L);
userRepository.save(user);
user.setId(2L);
userRepository.delete(user);
userRepository.count();
userRepository.existsById(3L);
}
@Test
public void testCustomSql() {
userRepository.modifyById("cc",3L);
userRepository.deleteById(3L);
userRepository.findByEmail("[email protected]");
}
@Test
public void testPageQuery() {
int page=1,size=2;
Sort sort = new Sort(Sort.Direction.DESC,"id");
Pageable pageable = PageRequest.of(page,size,sort);
userRepository.findALL(pageable);
userRepository.findByNickName("cc", pageable);
System.out.println(pageable);
}
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
開啟資料庫,就能見你到自己裡面所新增的資料。
以上借鑑了(純潔的微笑)經驗的分享:http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html