亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QueryDSL如何在Spring JPA中使用

發布時間:2021-04-09 16:46:50 來源:億速云 閱讀:411 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關QueryDSL如何在Spring JPA中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

pom文件配置

QueryDSL本身定位就是對某些技術的補充或者說是完善,其提供了對JPAJDBCJDO等技術的支持。這里引入的是QueryDSL-JPA,需要注意一定要引入querydsl代碼生成器插件。

  <properties>
    <java.version>1.8</java.version>
    <querydsl.version>4.2.1</querydsl.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!--使用版本較老的mysql驅動包,用于連接mysql-5.7-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.48</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <!--引入querydsl-jpa依賴-->
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
      <version>${querydsl.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <!--引入querydsl代碼生成器插件-->
      <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <dependencies>
          <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
          </dependency>
        </dependencies>
        <executions>
          <!--設置插件生效的maven生命周期-->
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <!--配置生成文件的目錄--> 
              <outputDirectory>src/generated-sources/java/</outputDirectory>
              <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

application配置文件

spring:
 datasource:
  ## 數據庫相關配置
  url: jdbc:mysql://127.0.0.1:3306/example?useSSL=false
  username: root
  password: root
  driver-class-name: com.mysql.jdbc.Driver # 指定驅動類
 jpa:
  hibernate:
   ddl-auto: update # 自動創建表以及更新表結構,生產環境慎用
  show-sql: true # 打印執行的SQL

配置類

由于QueryDSL不提供starter,所以需要自行準備一個配置類,代碼如下所示

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * QueryDSL配置類
 * @author Null
 * @date 2019-10-24
 */
@Configuration
public class QuerydslConfig {

  @Autowired
  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory queryFactory(){
    return new JPAQueryFactory(entityManager);
  }

}

啟動類

啟動類很簡單,只需要使用@SpringBootApplication即可

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class QuerydslJpaDemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(QuerydslJpaDemoApplication.class, args);
  }
}

實體類

主要有講師和課程,每個課程都有一個講師,每個講師有多個課程,即講師與課程的關系為一對多

課程

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * 課程,一個課程對應一個講師
 * @author Null
 * @date 2019-10-24
 */
@Data
@Entity
public class Course {
  /**
   * 課程ID
   */
  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  private Long id;
  /**
   * 課程名稱
   */
  private String name;
  /**
   * 對應講師的ID
   */
  private Long lecturerId;
}

講師

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * 講師,一個講師有多個課程
 * @author Null
 * @date 2019-10-24
 */
@Data
@Entity
public class Lecturer {
  /**
   * 講師ID
   */
  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  private Long id;
  /**
   * 講師名字
   */
  private String name;
  /**
   * 性別,true(1)為男性,false(0)為女性
   */
  private Boolean sex;
}

Repository接口

如果要使用QuerDSL需要Repository接口除了繼承JpaRepository接口(此接口為Spring-JPA提供的接口)外,還需要繼承QuerydslPredicateExecutor接口。關鍵示例如下:

課程Repository

import com.example.querydsl.jpa.entity.Course;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

/**
 * 課程Repository
 *
 * @author Null
 * @date 2019-10-24
 */
public interface CourseRepository extends
    JpaRepository<Course, Integer>,
    QuerydslPredicateExecutor<Course> {
}

講師Repository

import com.example.querydsl.jpa.entity.Lecturer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

/**
 * 講師Repository
 * @author Null
 * @date 2019-10-24
 */
public interface LecturerRepository extends
    JpaRepository<Lecturer,Integer>,
    QuerydslPredicateExecutor<Lecturer> {
}

代碼生成

前面配置QueryDSL代碼生成器就是用于這一步,==每次實體類有變更最好重復執行本步驟重新生成新的代碼==。由于個人習慣使用IDEA,所以以IDEA作為演示。

雙擊下圖內容即可生成代碼了,

QueryDSL如何在Spring JPA中使用

然后就會在src/generated-sources目錄可以看到生成的代碼,包名與實體包名一致,但是類名為Q開頭的文件

QueryDSL如何在Spring JPA中使用

上一步的截圖我們可以看到其實生成的代碼被IDEA識別為普通文件了,所以我們需要標記src/generated-sources/java目錄的用途,如下圖所示

QueryDSL如何在Spring JPA中使用

標記后,效果如下,可以看到代碼被正確識別了

QueryDSL如何在Spring JPA中使用

到了這一步其實已經完成整合了,下面就開始驗證是否正確整合以及展示QueryDSL的優勢了

驗證整合與演示

下面我會使用單元測試來驗證QueryDSL是否正確整合以及演示一下QueryDSL的優勢

單元測試類

這里主要是單元測試類的關鍵內容,需要注意@BeforeEachJunit5的注解,表示每個單元測試用例執行前會執行的方法其實對應Junit4@Before

/**
 * @SpringBootTest 默認不支持事務且自動回滾
 * 使用@Transactional 開啟事務,
 * 使用@Rollback(false) 關閉自動回滾
 * @author Null
 * @date 2019-10-24
 */
@SpringBootTest
class QuerydslJpaDemoApplicationTests {

  @Autowired
  private CourseRepository courseRepository;

  @Autowired
  private LecturerRepository lecturerRepository;
  
  @Autowired
  private JPAQueryFactory queryFactory;

  /**
   * 初始化數據
   */
  @BeforeEach
  public void initData(){
    // 清空數據表
    courseRepository.deleteAll();
    lecturerRepository.deleteAll();

    // 初始化講師
    Lecturer tom=new Lecturer();
    tom.setName("Tom");
    tom.setSex(true);
    lecturerRepository.save(tom);

    Lecturer marry=new Lecturer();
    marry.setName("Marry");
    marry.setSex(false);
    lecturerRepository.save(marry);

    // 初始化課程
    Course chinese=new Course();
    chinese.setName("Chinese");
    chinese.setLecturerId(tom.getId());
    courseRepository.save(chinese);

    Course physics=new Course();
    physics.setName("Physics");
    physics.setLecturerId(tom.getId());
    courseRepository.save(physics);

    Course english=new Course();
    english.setName("English");
    english.setLecturerId(marry.getId());
    courseRepository.save(english);
  }
  
  ...省略各個用例
  
}

單表模糊查詢

  /**
   * 根據課程名稱模糊查詢課程
   */
  @Test
  public void testSelectCourseByNameLike() {
    // 組裝查詢條件
    QCourse qCourse = QCourse.course;
    // %要自行組裝
    BooleanExpression expression = qCourse.name.like("P%");
    System.out.println(courseRepository.findAll(expression));
  }

聯表查詢

  /**
   * 根據講師姓名查課程
   */
  @Test
  public void testSelectCourseByLecturerName(){
    QCourse qCourse = QCourse.course;
    QLecturer qLecturer = QLecturer.lecturer;
    // 這里包含了組裝查詢條件和執行查詢的邏輯,組裝好條件后記得執行fetch()
    List<Course> courses=queryFactory.select(qCourse)
        .from(qCourse)
        .leftJoin(qLecturer)
        .on(qCourse.lecturerId.eq(qLecturer.id))
        .where(qLecturer.name.eq("Tom"))
        .fetch();
    System.out.println(courses);
  }

更新

  /**
   * 根據姓名更新講師性別<br/>
   * 使用@Transactional開啟事務<br/>
   * 使用@Rollback(false)關閉自動回滾<br/>
   */
  @Test
  @Transactional
  @Rollback(false)
  public void testUpdateLecturerSexByName(){
    QLecturer qLecturer = QLecturer.lecturer;
    // 更新Tom的性別為女性,返回的是影響記錄條數
    long num=queryFactory.update(qLecturer)
        .set(qLecturer.sex,false)
        .where(qLecturer.name.eq("Tom"))
        .execute();
    // 這里輸出被更新的記錄數
    System.out.println(num);
  }

刪除

  /**
   * 根據根據性別刪除講師
   */
  @Test
  @Transactional
  @Rollback(false)
  public void testDeleteLecturerBySex(){
    QLecturer qLecturer = QLecturer.lecturer;
    // 刪除性別為男性的講師
    long num=queryFactory.delete(qLecturer)
        .where(qLecturer.sex.eq(true))
        .execute();
    // 輸出被刪除的記錄數
    System.out.println(num);
  }

用例分析

從用例中可以看出其實QueryDSLAPI更加切合原生的SQL,基本上從代碼上就可以看出你希望執行的SQL了。

細心的朋友會發現QueryDSL是沒有insert方法,因為JPA提供的save()方法已經足夠處理了。

同時要記得要組裝好你的SQL后別忘記調用fetch()或者execute()方法。

總結

Spring Boot JPA整合QueryDSL的關鍵步驟

  • 引入依賴和插件

  • 編寫配置類

  • 使用插件生成代碼

  • 標記生成文件為代碼

  • Repository繼承QuerydslPredicateExecutor

QueryDSLAPI類似原生SQLAPI風格類似StringBuilderAPIFluent API風格)。但是不提供insert對應的操作。

關于QueryDSL如何在Spring JPA中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高雄市| 大名县| 宁阳县| 离岛区| 洪江市| 沙坪坝区| 昭觉县| 始兴县| 仙居县| 北宁市| 乌苏市| 天柱县| 通城县| 都兰县| 衡阳县| 潼关县| 东山县| 连南| 榆树市| 正阳县| 海原县| 都安| 焉耆| 理塘县| 高阳县| 抚顺市| 鹰潭市| 金寨县| 蚌埠市| 云霄县| 灵璧县| 沁源县| 军事| 开远市| 泸州市| 达州市| 蒙阴县| 东乌| 平顶山市| 台安县| 平舆县|