spring boot 1.5.4 集成spring-Data-JPA(七)

上一篇:springboot 1.5.4 集成JdbcTemplate(六)

1      Spring Boot使用Spring-Data-JPA訪問數據庫

spring boot整合jdbcTemplate項目源碼:

spring-boot相關項目源碼,

碼雲地址:https://git.oschina.net/wyait/springboot1.5.4.git

github地址https://github.com/wyait/spring-boot-1.5.4.git


1.1  Sping data JPA簡介

關於Spring Data jpa這裏就不詳細做說明,只簡單的介紹一下:

 

由於Spring-data-jpa依賴於Hibernate。如果您對Hibernate有一定了解,下面內容可以毫不費力的看懂並上手使用Spring-data-jpa。如果您還是Hibernate新手,您可以先按如下方式入門,再建議回頭學習一下Hibernate以幫助這部分的理解和進一步使用。

 

在實際開發過程中,對數據庫的操作無非就“增刪改查”。就最爲普遍的單表操作而言,除了表和字段不同外,語句都是類似的,開發人員需要寫大量類似而枯燥的語句來完成業務邏輯。

 

爲了解決這些大量枯燥的數據操作語句,我們第一個想到的是使用ORM框架,比如:Hibernate。通過整合Hibernate之後,我們以操作Java實體的方式最終將數據改變映射到數據庫表中。

 

爲了解決抽象各個Java實體基本的“增刪改查”操作,我們通常會以泛型的方式封裝一個模板Dao來進行抽象簡化,但是這樣依然不是很方便,我們需要針對每個實體編寫一個繼承自泛型模板Dao的接口,再編寫該接口的實現。雖然一些基礎的數據訪問已經可以得到很好的複用,但是在代碼結構上針對每個實體都會有一堆Dao的接口和實現。

 

由於模板Dao的實現,使得這些具體實體的Dao層已經變的非常“薄”,有一些具體實體的Dao實現可能完全就是對模板Dao的簡單代理,並且往往這樣的實現類可能會出現在很多實體上。Spring-data-jpa的出現正可以讓這樣一個已經很“薄”的數據訪問層變成只是一層接口的編寫方式

 

1.2  Spring Data的核心接口Repository

Repository,它不提供任何方法,開發者需要在自己定義的接口中聲明需要的方法:

 

 public interface Repository<T, ID extendsSerializable> { }

1. Repository是一個空接口,即是一個標記接口;

2. 若我們定義的接口繼承了Repository,則該接口會被IOC容器識別爲一個Repository Bean納入到IOC容器中,進而可以在該接口中定義滿足一定規範的方法。

3. 實際上也可以通過@RepositoryDefinition,註解來替代繼承Repository接口。

4. 查詢方法以find | read | get開頭;

5. 涉及查詢條件時,條件的屬性用條件關鍵字連接,要注意的是條件屬性以首字母大寫。

6. 使用@Query註解可以自定義JPQL語句實現更靈活的查詢。

 

CrudRepository 接口提供了最基本的對實體類的添刪改查操作

      --T save(T entity);//保存單個實體   

       --Iterable<T> save(Iterable<?extends T> entities);//保存集合        

       --T findOne(ID id);//根據id查找實體         

       --boolean exists(ID id);//根據id判斷實體是否存在         

       --Iterable<T> findAll();//查詢所有實體,不用或慎用!         

       --long count();//查詢實體數量         

       --void delete(ID id);//根據Id刪除實體         

       --void delete(T entity);//刪除一個實體   

       --void delete(Iterable<? extends T>entities);//刪除一個實體的集合         

       --void deleteAll();//刪除所有實體,不用或慎用!   

PagingAndSortingRepository接口

該接口提供了分頁與排序功能  

   --Iterable<T>findAll(Sort sort); //排序   

--Page<T> findAll(Pageable pageable); //分頁查詢(含排序功能)

JpaRepository:查找所有實體,排序、查找所有實體,執行緩存與數據庫同步

 

JpaSpecificationExecutor:不屬於Repository體系,實現一組 JPACriteria 查詢相關的方法,封裝  JPACriteria 查詢條件。通常使用匿名內部類的方式來創建該接口的對象。

 

自定義 Repository:可以自己定義一個MyRepository接口。

 

1.3  Spring Boot集成Spring-Data-JPA實現

   pom中引入Spring-Data-JPA依賴

<dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-data-jpa</artifactId>

      </dependency>

   數據源沿用JdbcTemplate配置,新添加hbm2ddl配置:

#   配置數據源

spring.datasource.url=jdbc:mysql://localhost:3306/test

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# hbm2ddl 數據表和實體類映射生成配置

spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動創建、更新、驗證數據庫表結構。該參數的幾種配置如下:

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

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

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

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

   新建實體類Cat,並添加映射註解

創建一個Cat實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會被映射到數據庫表中,由於配置了hibernate.hbm2ddl.auto,在應用啓動的時候框架會自動去數據庫中創建對應的表。


@Entity//映射表

public class Cat {

   @Id//主鍵

   @GeneratedValue//主鍵生成策略

   privateLong id;

   @Column(nullable= false)

   privateString name;

   @Column

   privateInteger age;

   //無參構造

   //帶參構造[一定要寫無參構造]

   編寫Dao實現

public interface CatRepositoryextends JpaRepository<Cat, Long> {

   CatfindByName(String name);

 

   @Query("fromCat c where c.name=:name and c.age=:age")

   CatfindCat(@Param("name") String name, @Param("age") Integerage);

 

}

   編寫ServiceCatServiceCatServiceImpl //TODO

   @Autowired

   privateCatRepository catRepository;

 

   @Override

   publicCat findCat(String name) {

      this.catRepository.save(newCat("張三", 27));

      this.catRepository.save(newCat("王五", 27));

      this.catRepository.save(newCat("趙六", 26));

      this.catRepository.save(newCat("呵呵", 27));

      this.catRepository.save(newCat("哈哈", 29));

      this.catRepository.save(newCat("李白", 7));

 

      returnthis.catRepository.findCat(name,7);

   }

 

   @Override

   publicCat findByName(String name) {

      returnthis.catRepository.findByName(name);

   }

   編寫Controller

@Controller

public class CatController {

   @Autowired

   privateCatService catService;

 

   /**

    *

    * @描述:查詢cat數據

    * @創建人:wyait

    * @創建時間:2017627下午3:54:20

    * @return

    */

   @RequestMapping("/findCat")

   @ResponseBody

   publicCat findUser() {

      Cat c = this.catService.findCat("李白");

      returnc;

   }

 

   /**

    *

    * @描述:查詢cat數據

    * @創建人:wyait

    * @創建時間:2017627下午3:54:20

    * @return

    */

   @RequestMapping("/findByName")

   @ResponseBody

   publicCat findByName() {

      Catc = this.catService.findByName("張三");

      returnc;

   }

}

 

   啓動,測試:

查看數據庫:自動生成cat

wKioL1nIWO-BpuuvAABWkxCAgUw534.png

訪問:http://127.0.0.1:8080/findCat

wKiom1nIWTeinZiyAAA3d2MDiD0802.pngwKioL1nIWSGB-yLiAAA_MeOm7s0787.png

cat數據表:

wKioL1nIWSqAadMWAAAhsDfh21w360.png

 

1.4  Spring-data-jpa總結

Spring-data-jpa中,只需要編寫類似上面這樣的接口就可實現數據訪問。不再像我們以往編寫了接口時候還需要自己編寫接口實現類,直接減少了我們的文件清單(mapper.xml)。

 

下面對上面的CatRepository做一些解釋,該接口繼承自JpaRepository,通過查看JpaRepository接口的API文檔,可以看到該接口本身已經實現了創建(save)、更新(save)、刪除(delete)、查詢(findAllfindOne)等基本操作的函數,因此對於這些基礎操作的數據訪問就不需要開發者再自己定義。

 

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

 

    Cat  findByName(String name)

 

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

 

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

 

Spring-data-jpa的能力遠不止本文提到的這些,由於本文主要以整合介紹爲主,對於Spring-data-jpa的使用只是介紹了常見的使用方式。諸如@Modifying操作、分頁排序、原生SQL支持以及與SpringMVC的結合使用等等內容就不在本文中詳細展開。


項目源碼,

碼雲地址:https://git.oschina.net/wyait/springboot1.5.4.git

github地址:https://github.com/wyait/spring-boot-1.5.4.git


spring boot系列文章:

spring boot 1.5.4 概述(一)

spring boot 1.5.4入門和原理(二)

spring boot 1.5.4 之web開發(三)

spring boot 1.5.4 整合JSP(四)

spring boot 1.5.4 集成devTools(五)

spring boot 1.5.4 集成JdbcTemplate(六)

spring boot 1.5.4 集成spring-Data-JPA(七)

spring boot 1.5.4 配置文件詳解(八)

spring boot 1.5.4 統一異常處理(九)

spring boot 1.5.4 定時任務和異步調用(十)

spring boot 1.5.4 整合log4j2(十一)

spring boot 1.5.4 整合 mybatis(十二)

spring boot 1.5.4 整合 druid(十三)

spring boot 1.5.4 之監控Actuator(十四)

spring boot 1.5.4 整合webService(十五)

spring boot 1.5.4 整合redis、攔截器、過濾器、監聽器、靜態資源配置(十六)

spring boot 1.5.4 整合rabbitMQ(十七)

spring boot 1.5.4 集成Swagger2構建Restful API(十八)

spring boot 1.5.9 整合redis(十九



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