SpringBoot2.0之三 優雅整合Spring Data JPA

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

  爲了解決這種大量枯燥的簡單數據庫操做,大體的解決該問題的有三種方式
一、使用相似Hibernate的ORM框架,經過Hibernate完成java實體類和數據庫之間的映射,完成簡單的單表的「增刪改查」mysql

二、使用代碼生成工具生成單表的「增刪改查」代碼,省去咱們手動編寫的過程(我將在後面的文章中給出可定製化生成代碼方法,敬請關注!)git

三、使用Spring-data-jpa這樣的技術,它實現了模板Dao層,只須要在Dao,經過繼承一個接口,就可輕鬆完成「增刪改查」,具體使用方法以下:spring

1、在pom.xml文件中添加以下依賴sql

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

2、在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 這種配置的,具體根據版本而定。該配置的主要做用是:自動建立、更新、驗證數據庫結構微信

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

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

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

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

3、建立實體

建立一個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;//年齡

     // .....
}

4、建立數據庫訪問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來完成,具體例子如上所示。

5、單元測試
使用junit進行單元測試,代碼以下

/**
 * 
 * @author 明天的地平線
 * 
 * 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());
        }
    }
    

}

數據庫數據以下:

  本文主要以SpringBoot整合jpa爲主,Spring-data-jpa的內容遠比以上內容豐富和強大,例如分頁排序、對原生sql的支持等,後續將對此內容進行專門講解,感興趣的小夥伴能夠關注個人博客和微信公衆號。

Git代碼地址:https://gitee.com/Somta/Sprin...
原文地址:http://somta.com.cn/#/blog/vi...

本文由明天的地平線創做,如想了解更多更詳細的內容,請關注一下公衆號,公衆號內將進行最新最實時的更新!

圖片描述

相關文章
相關標籤/搜索