SpringBoot2.0優雅整合Spring Data JPA

在我們的實際開發的過程中,無論多複雜的業務邏輯到達持久層都回歸到了“增刪改查”的基本操作,可能會存在關聯多張表的複雜sql,但是對於單表的“增刪改查”也是不可避免的,大多數開發人員對於這個簡單而繁瑣的操作都比較煩惱。

爲了解決這種大量枯燥的簡單數據庫操作,大致的解決該問題的有三種方式

1、使用類似Hibernate的ORM框架,通過Hibernate完成java實體類和數據庫之間的映射,完成簡單的單表的“增刪改查”

2、使用代碼生成工具生成單表的“增刪改查”代碼,省去我們手動編寫的過程

3、使用Spring-data-jpa這樣的技術,它實現了模板Dao層,只需要在Dao,通過繼承一個接口,就可輕鬆完成“增刪改查”,具體使用方法如下:

一、在pom.xml文件中添加如下依賴

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

</dependency>

二、在application.yml文件中配置數據庫信息和jpa信息(注意:不同的SpringBoot版本jpa配置的方法可能會有不同)

spring:    
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
    username: root

    password: 123456

  jpa:
    hibernate:
      ddl-auto: update

個人推薦使用yml格式的配置文件,看起來更加清晰簡單(注意:每個配置屬性的縮進是兩個空格,這點一定要注意,不然會出現配置錯誤的情況,也可以在開發工具中安裝相關的yml的插件方便查看)。

jpa的配置後 jpa.hibernate.ddl-auto= update,在其他低版本的SpringBoot中也有使用spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 這種配置的,具體根據版本而定。該配置的主要作用是:自動創建、更新、驗證數據庫結構

1、create:每次加載hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因(一般只會在第一次創建時使用)

2、create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除

3、update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以後加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到服務器後,表結構是不會被馬上建立起來的,是要等應用第一次運行起來後纔會

4、validate:每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值

三、創建實體

創建一個User類,配置好上面的信息後,啓動項目,對應的數據庫就會自動生成對應的表結構。@Table、@Entity、@Id等註解是jpa的相關知識,後面的文章將詳細講述。

@Table(name = "t_user")
@Entity
public class User {


@Id
@GeneratedValue

private Long id;

 

@Column
private String name;//姓名

 

@Column

private Integer age;//年齡

        .....

}

四、創建數據庫訪問Dao層

@Repository
public interface UserRepository  extends JpaRepository<User,Long>{

/**
* 根據年紀查詢用戶
* @param age
* @return
*/
User findByAge(Integer age);

/**
* 根據年紀和姓名查詢
* @param name
* @param age
* @return
*/
User findByNameAndAge(String name, Integer age);

/**
  * 對於複雜查詢可以使用@Query 編寫sql
  * @param name
  * @return
*/
 @Query("from User u where u.name=:name")
 User findUser(@Param("name") String name);

}

該Dao繼承了JpaRepository接口,指定了需要操作的實體對象和實體對象的主鍵類型,通過查看JpaRepository接口源碼可以看到,裏面已經封裝了創建(save)、更新(save)、刪除(delete)、查詢(findAll、findOne)等基本操作的函數,使用起來非常方便了,但是還是會存在一些複雜的sql,spring-data-jpa還提供了一個非常方便的方式,通過實體屬性來命名方法,它會根據命名來創建sql查詢相關數據,對應更加複雜的語句,還可以用直接寫sql來完成,具體例子如上所示。

五、單元測試

使用junit進行單元測試,代碼如下

/**
 * 
 * @author pangdatao
 * 
 * SpringBoot 之前的版本配置單元測試類時使用 @SpringApplicationConfiguration(Application.class)
 * SpringBoot 1.5.9  改用@SpringBootTest(classes = Application.class)
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class JpaTest {

@Autowired
private UserRepository userRepository;

/**
* 新增用戶
* @throws Exception
*/
@Test
public void testAddUser() throws Exception {
User user = new User();
user.setName("zhangsan");
user.setAge(12);
userRepository.save(user);

User user2 = new User();
user2.setName("lishi");
user2.setAge(22);
userRepository.save(user2);
}

/**
* 刪除用戶(根據對象刪除時,必須要有ID屬性)
* @throws Exception
*/
@Test
public void testDelUser() throws Exception {
User user = new User();
user.setId(1L);
user.setName("zhangsan");
user.setAge(12);
userRepository.delete(user);
}

/**
* 修改用戶信息
* @throws Exception
*/
@Test
public void testUpdUser() throws Exception {
User user = new User();
user.setId(2L);
user.setName("zhangsan11");
user.setAge(122);
userRepository.save(user);
}

/**
* 查詢用戶
* @throws Exception
*/
@Test
public void testQueryUser() throws Exception {
User user = userRepository.findByAge(22);
System.out.println(user.getName());

User user2 = userRepository.findByNameAndAge("lishi", 22);
System.out.println(user2.getName());

User user3 = userRepository.findUser("zhangsan11");
System.out.println(user3.getName());
}

/**
* 查詢所有用戶
* @throws Exception
*/
@Test
public void testQueryUserList() throws Exception {
List<User> list = userRepository.findAll();
for (User user : list) {
System.out.println(user.getName());
}
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章