<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Spring Data JPA學(xué)習(xí)筆記

      Spring Data JPA學(xué)習(xí)

      Spring Data JPA 是 Spring 框架中用于簡(jiǎn)化 JPA (Java Persistence API) 開(kāi)發(fā)的模塊,它提供了對(duì) JPA 的抽象和增強(qiáng),可以大幅減少數(shù)據(jù)訪問(wèn)層的樣板代碼。

      包名:org.springframework.data.jpa

      Persistence:持久化

      核心概念

      1. 主要組件

      • Repository 接口:Spring Data JPA 的核心接口,提供了基本的 CRUD 操作
      • JpaRepository:繼承自 Repository,提供了更多 JPA 相關(guān)的方法
      • @Entity:標(biāo)記一個(gè)類為 JPA 實(shí)體
      • @Id:標(biāo)記實(shí)體類的主鍵字段
      • @GeneratedValue:指定主鍵生成策略

      2. 基本使用

      定義實(shí)體類(屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表的字段)

      @Entity
      public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          
          private String name;
          private String email;
          
          // 構(gòu)造方法、getter和setter
      }
      

      創(chuàng)建 Repository 接口(數(shù)據(jù)庫(kù)訪問(wèn)層接口)

      public interface UserRepository extends JpaRepository<User, Long> {
          // 可以添加自定義查詢方法
      }
      

      使用 Repository

      @Service
      public class UserService {
          @Autowired
          private UserRepository userRepository;
          
          public User createUser(User user) {
              return userRepository.save(user);
          }
          
          public List<User> findAllUsers() {
              return userRepository.findAll();
          }
      }
      

      查詢方法

      Spring Data JPA 提供了強(qiáng)大的查詢方法生成機(jī)制:

      1. 方法名派生查詢

      public interface UserRepository extends JpaRepository<User, Long> {
          List<User> findByName(String name);
          List<User> findByEmailContaining(String emailPart);
          List<User> findByNameAndEmail(String name, String email);
          List<User> findByNameOrderByEmailAsc(String name);
      }
      

      2. 使用 @Query 注解

      @Query("SELECT u FROM User u WHERE u.email LIKE %?1%")
      List<User> findByEmailLike(String email);
      
      // 原生SQL查詢
      @Query(value = "SELECT * FROM users WHERE email LIKE %?1%", nativeQuery = true)
      List<User> findByEmailLikeNative(String email);
      

      3. 分頁(yè)和排序

      Page<User> findByName(String name, Pageable pageable);
      List<User> findByName(String name, Sort sort);
      

      使用示例:

      Page<User> users = userRepository.findByName(
          "John", 
          PageRequest.of(0, 10, Sort.by("email").ascending())
      );
      

      高級(jí)特性

      1. 規(guī)范模式 (Specification)

      允許使用編程方式構(gòu)建查詢:

      public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
      }
      
      // 使用示例
      Specification<User> spec = (root, query, cb) -> {
          return cb.and(
              cb.like(root.get("name"), "%John%"),
              cb.equal(root.get("active"), true)
          );
      };
      List<User> users = userRepository.findAll(spec);
      

      2. 投影 (Projection)

      可以只查詢部分字段:

      public interface UserNameOnly {
          String getName();
      }
      
      public interface UserRepository extends JpaRepository<User, Long> {
          List<UserNameOnly> findByName(String name);
      }
      

      3. 實(shí)體圖 (EntityGraph)

      解決 N+1 查詢問(wèn)題:

      @EntityGraph(attributePaths = {"orders"})
      List<User> findByName(String name);
      

      事務(wù)管理

      Spring Data JPA 默認(rèn)在 Repository 方法上添加了 @Transactional 注解:

      @Service
      @Transactional
      public class UserService {
          // 方法默認(rèn)都有事務(wù)
      }
      

      常見(jiàn)配置

      application.properties 配置示例

      # 數(shù)據(jù)源配置
      spring.datasource.url=jdbc:mysql://localhost:3306/mydb
      spring.datasource.username=root
      spring.datasource.password=secret
      
      # JPA配置
      spring.jpa.show-sql=true
      spring.jpa.hibernate.ddl-auto=update
      spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
      

      最佳實(shí)踐

      1. 盡量使用方法名派生查詢,保持代碼簡(jiǎn)潔
      2. 復(fù)雜查詢使用 @Query 注解
      3. 注意事務(wù)邊界,通常在服務(wù)層使用 @Transactional
      4. 對(duì)于關(guān)聯(lián)查詢,合理使用 FetchType 和 EntityGraph
      5. 考慮使用 DTO 投影來(lái)減少數(shù)據(jù)傳輸量

      常見(jiàn)問(wèn)題解決

      1. N+1 查詢問(wèn)題:使用 EntityGraph 或 JOIN FETCH 解決
      2. 延遲加載異常:確保在事務(wù)范圍內(nèi)訪問(wèn)延遲加載的屬性
      3. 性能問(wèn)題:合理使用批量操作和二級(jí)緩存

      Spring Data JPA 極大地簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層的開(kāi)發(fā),通過(guò)合理使用其特性,可以編寫(xiě)出既簡(jiǎn)潔又高效的持久層代碼。

      posted @ 2025-10-12 16:17  hqq的進(jìn)階日記  閱讀(16)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产一级区二级区三级区| 亚洲乱色伦图片区小说| аⅴ天堂国产最新版在线中文| 亚洲精品无码久久千人斩| 99久久国产成人免费网站| 综合色一色综合久久网| 国产亚洲精品在av| 少妇被无套内谢免费看| 视频一区视频二区视频三| 人妻护士在线波多野结衣| 久久亚洲精品情侣| 长腿校花无力呻吟娇喘| 国产精品亚洲精品日韩已满十八小 | 亚洲精品一区国产| 在线观看无码av免费不卡网站| 亚洲综合一区二区三区在线| 久久国产精品波多野结衣| 精品人妻中文字幕av| 重口SM一区二区三区视频| 男女爽爽无遮挡午夜视频| 九九热在线精品视频99| 不卡乱辈伦在线看中文字幕| 99九九视频高清在线| 人人妻人人澡人人爽曰本| 风韵丰满熟妇啪啪区老老熟妇 | 部精品久久久久久久久| 无套内谢少妇一二三四| 亚洲av成人一区二区三区| 在线看无码的免费网站| 国产不卡精品视频男人的天堂| 影音先锋啪啪av资源网站| 人妻饥渴偷公乱中文字幕| 亚洲sm另类一区二区三区| 少妇激情一区二区三区视频小说 | 精品免费看国产一区二区| 亚洲国产在一区二区三区| 久久中文字幕一区二区| 亚洲成人精品综合在线| 亚洲一区二区三区自拍天堂| 亚洲综合色丁香婷婷六月图片| 麻豆天美国产一区在线播放|