javascript
Spring boot (5):Spring data jpa 的使用
總結:
jpa是一套規范,不是一套產品。jpa是一套規范,不是一套產品。
spring data jpa是spring基于ORM框架、JPA規范的基礎上封裝的一套JPA應用框架,提供了包括增刪改等在內的常用功能,且易擴展!
spring data jpa讓我們解脫了dao層的操作,基本所有的CRUD都可以依賴它來實現。
基本查詢分兩種:
1.spring data的默認實現(繼承JpaRepository父類,或使用默認方法,如save、delete、count、findAll等等)
2.根據查詢的方法名自動解析成SQL(如findXXBy, readAXXBy,queryXXBy, countXXBy, findByEmailLike)
3.1 分頁查詢
spring data jpa幫我們實現了分頁功能,需要傳入參數Pageable,當有多個參數傳入時,建議Pageable作為最后一個參數傳入
3.2 限制查詢
有時候我們只需要查詢前N個元素,或者支取前一個實體。
自定義SQL查詢
在查詢方法上使用@query注解,如果涉及到刪除和修改加上@Modifying,也可以添加@Transactional對書屋的支持,查詢超時的設置。
多表查詢
兩種方式:
1.利用hibernate的級聯查詢實現
2.創建一個結果集的接口來接受連表查詢后的結果(在運行中spring會給這個接口生成一個代理來接收返回的結果,代碼匯總使用getXX的形式獲取)
多數據源的支持
1.同源數據庫的多源支持
三個步驟:
- 配置多數據源
- 不同源的實體放入不同的數據源、事務支持
- 聲明不同的包路徑下使用不同的數據源、事務支持
2.異構數據庫多源支持
比如即需要對mysql支持,也需要對MongoDB支持。
實體類聲明@Entity關系型數據庫支持類型、聲明@Document為mongodb支持類型,不同的數據源使用不同的實體就可以了
但是,如果User用戶既使用mysql也使用MongoDB,也可以做混合使用
也可以通過不同包路徑進行聲明,比如A包路徑下使用mysql,B包路徑下使用MongoDB。
介紹spring data jpa的常用方法與注意事項
Spring data jpa介紹
jpa 是什么?
jpa 是sun官方提出的java持久化規范。它為java開發人員提供了一種對象/關系映射工具來管理java應用中的關系數據。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate、TopLink、JDO等ORM框架各自為營的局面。
注意:jpa是一套規范,不是一套產品,像Hibernate、TopLink、JDO這些是一套產品,是JPA的實現產品。
- Spring data jpa是spring 基于 ORM框架、JPA規范的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易擴展!學習并使用Spring data jpa 可以極大的提高開發效率。
- Spring data jpa讓我們解脫了dao層的操作,基本所有的CRUD都可以依賴它來實現
基本查詢
基本查詢分兩種:一種是spring data 默認已經實現,一種是根據查詢的方法來自動解析成SQL。
預先生成方法
spring data jpa 默認預先生成了一些基本的CURD的方法,例如:增刪改等等。
首先有一個entity:
@Entity(name="user") public class UserEntity implements Serializable{/***/private static final long serialVersionUID = 1L;@Id@GeneratedValueprivate long id;@Column(nullable=false, unique=true)private String userName;@Column()private String passWord;@Column()private SexEnums userSex;@Column()private String nickName;//省略set、get}1 繼承 JpaRepository
public interface UserRepository extends JpaRepository<User, Long> { }2 使用默認方法
@Test public void testBaseQuery() throws Exception {User user=new User();userRepository.findAll();userRepository.findOne(1l);userRepository.save(user);userRepository.delete(user);userRepository.count();userRepository.exists(1l); // ... }自定義簡單查詢
自定義的簡單查詢就是根據方法名來自動生成SQL,主要的語法是 findXXBy,readAXXBy,queryXXBy,countXXBy,getXXBy后面跟屬性名稱:
User findByUserName(String userName);也可以加一些關鍵字And、Or
User findByUserNameOrEmail(String username, String email);修改、刪除、統計也是類似語法
Long deleteById(Long id); Long countByUserName(String userName)基本上SQL體系的關鍵詞都可以使用,例如:Like、IgnoreCase、OrderBy。
List<User> findByEmailLike(String email); User findByUserNameIgnoreCase(String userName); List<User> findByUserNameOrderByEmailDesc(String email);具體關鍵詞,使用方法和生成sql如下表
復雜查詢
在實際的開發中我們需要用到分頁、刪除、連表等查詢的時候就需要特殊方法或者自定義SQL
1 分頁查詢
分頁查詢在實際使用中非常普遍了,Spring dadta jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入參數Pageable,當查詢中多個參數的時候,Pageable建議作為最后一個參數傳入
Page<User> findALL(Pageable pageable); Page<User> findByUserName(String userName,Pageable pageable);Pageable 是Spring 封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則
public void testPageQuery() throws Exception{int page = 1, size=10;Sort sort = new Sort(Direction.DESC, "id");PageAble pageable = new PageRequest(page, size, sort);userRepository.findAll(pageable);userRepository.findByUserName("testName", pageable); }限制查詢
有時候我們只需要查詢前N個元素,或者支取前一個實體。
2 自定義SQL查詢
其實Spring data 絕大部分的SQL都可以根據方法名定義的方式來實現,但是由于某些原因我們想使用自定義的sql來查詢,spring data也是完美支持的;
在查詢方法上使用@query注解,如涉及到刪除和修改加上在這里@Modifying。也可以根據需要添加 @Transactional 對事務的支持,查詢超時的設置等。
3 多表查詢
多表查詢在spring data jpa中有兩種實現方式,第一種是利用hibernate 的級聯查詢來實現,第二種是創建一個結果集的接口來接受連表查詢后的結果,這里主要講第二種方式。
1 定義一個結果集的接口類
public interface HotelSummary {City getCity();String getName(); Double getAverageRating(); default Integer getAverageRatingRounded() {return getAverageRating() == null ? null : (int) Math.round(getAverageRating());} }2 查詢的方法返回類型設置為新創建的接口
@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "- "from Hotel h left outer join h.reviews r where h.city = ?1 group by h") Page<HotelSummary> findByCity(City city, Pageable pageable); //返回類型為新創建的接口類型@Query("select h.name as name, avg(r.rating) as averageRating "- "from Hotel h left outer join h.reviews r group by h") Page<HotelSummary> findByCity(Pageable pageable);3 使用
Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name")); for(HotelSummary summay:hotels){System.out.println("Name" +summay.getName()); }在運行中Spring會給接口(HotelSummary)自動生產一個代理類來接收返回的結果,代碼匯總使用getXX的形式來獲取
多數據源的支持
同源數據庫的多源支持
日常項目中因為使用分布式開發模式,不同的服務有不同的數據源,常常需要在一個項目中使用多個數據源,因此需要配置spring data jpa對多數據源的使用,一般分為三個步驟:
- 1 配置多數據源
- 2 不同源的實體類放入不同包路徑
- 3 聲明不同的包路徑下使用不同的數據源、事務支持
這里有一篇文章寫得很清楚:Spring Boot多數據源配置與使用
異構數據庫多源支持
比如我們的項目中,即需要對mysql的支持,也需要對mongoDB的查詢等。
實體類聲明@Entity關系型數據庫支持類型、聲明@Document為mongodb支持類型,不同的數據源使用不同的實體就可以了。
但是,如果User用戶既使用mysql也使用MongoDB,也可以做混合使用
interface JpaPersonRepository extends Repository<Person, Long> {… }interface MongoDBPersonRepository extends Repository<Person, Long> {… }@Entity @Document public class Person {… }也可以通過對不同的包路徑進行聲明,比如A包路徑下使用mysql,B包路徑下使用MongoDB
@EnableJpaRepositories(basePackages = "com.neo.repositories.jpa") @EnableMongoRepositories(basePackages = "com.neo.repositories.mongo") interface Configuration { }其他
使用枚舉
使用枚舉的時候,我們希望數據庫中存儲的事枚舉對應的String類型,而不是枚舉的索引值,需要在屬性上面添加@Enumerated(EnumType.STRING)注解
@Enumerated(EnumType.STRING) @Column(nullable = true) private UserType type;不需要和數據庫映射的屬性
正常情況下我們在實體類上加上注解 @Entity, 就會讓實體類和表相關聯。如果其中某個屬性我們不需要和數據庫來關聯,只是在展示的時候做計算,只需要加上 @Transient屬性即可。
這里有一個開源項目幾乎使用了這里介紹的所有標簽和布局,大家可以參考:參考案例
總結
以上是生活随笔為你收集整理的Spring boot (5):Spring data jpa 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么选主硬盘(主机硬盘怎么选)
- 下一篇: Win10时钟不读秒?这么做一目了然