日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring boot (5):Spring data jpa 的使用

發布時間:2023/12/3 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring boot (5):Spring data jpa 的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結:

  • jpa是什么,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個元素,或者支取前一個實體。
  • //分頁查詢 Page<User> findALL(Pageable pageable); Page<User> findByUserName(String userName,Pageable pageable); //限制查詢 User findFirstByOrderByLastnameAsc();
  • 自定義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個元素,或者支取前一個實體。

    User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<User> queryFirst10ByLastname(String lastname, Pageable pageable); List<User> findFirst10ByLastname(String lastname, Sort sort); List<User> findTop10ByLastname(String lastname, Pageable pageable);

    2 自定義SQL查詢

    其實Spring data 絕大部分的SQL都可以根據方法名定義的方式來實現,但是由于某些原因我們想使用自定義的sql來查詢,spring data也是完美支持的;
    在查詢方法上使用@query注解,如涉及到刪除和修改加上在這里@Modifying。也可以根據需要添加 @Transactional 對事務的支持,查詢超時的設置等。

    @Modifying @Query("update User u set u.userName = ?1 where c.id = ?2") int modifyByIdAndUserId(String userName, Long id);@Transactional @Modifying @Query("delete from User where id = ?1") void deleteByUserId(Long id);@Transactional(timeout = 10) @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress);

    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支持類型,不同的數據源使用不同的實體就可以了。

    interface PersonRepository extends Repository<Person, Long> {}@Entity public class Person {}interface UserRepository extends Repository<User, Long> {}@Document public class User {}

    但是,如果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屬性即可。

    @Transient private String userName;

    這里有一個開源項目幾乎使用了這里介紹的所有標簽和布局,大家可以參考:參考案例

    總結

    以上是生活随笔為你收集整理的Spring boot (5):Spring data jpa 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。