拓展阅读
The jdbc pool for java.(java 手写 jdbc 数据库连接池实现)
The simple mybatis.(手写简易版 mybatis)
1. 介绍
1.1 背景
Querydsl的诞生源于以类型安全的方式维护HQL查询的需求。逐步构建HQL查询需要进行字符串连接,导致代码难以阅读。通过普通字符串进行HQL构建时对域类型和属性的不安全引用是另一个问题。
在不断变化的领域模型中,类型安全在软件开发中带来巨大的好处。领域的变化直接反映在查询中,而在查询构建中使用自动完成可以使查询构建更快速、更安全。
最初Querydsl的目标语言是Hibernate的HQL,但现在它支持JPA、JDO、JDBC、Lucene、Hibernate Search、MongoDB、Collections和RDFBean作为后端。
如果您完全是Java中的数据库访问新手,https://www.marcobehler.com/guides/a-guide-to-accessing-databases-in-java 提供了对各种部分、组件和选项的良好概述,并向您展示了QueryDSL的确切位置。
1.2 原则
类型安全是Querydsl的核心原则。查询是基于生成的查询类型构建的,这些类型反映了您的领域类型的属性。
同时,函数/方法调用以完全类型安全的方式构建。
一致性是另一个重要原则。查询路径和操作在所有实现中都相同,而且查询接口具有共同的基础接口。
要了解 Querydsl 查询和表达式类型的表达能力,请参阅javadocs并查看com.querydsl.core.Query、com.querydsl.core.Fetchable和com.querydsl.core.types.Expression。
2.1. 查询JPA
Querydsl定义了一种在持久化领域模型数据之上进行查询的通用静态类型语法。
JDO和JPA是Querydsl的主要集成技术。本指南描述了如何将Querydsl与JPA结合使用。
Querydsl for JPA是JPQL和Criteria查询的替代品。它将Criteria查询的动态性与JPQL的表达能力结合在一起,而且是完全类型安全的。
2.1.1. Maven集成
将以下依赖项添加到您的Maven项目中:
<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>${querydsl.version}</version><scope>provided</scope>
</dependency><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><version>${querydsl.version}</version>
</dependency>
现在,配置Maven APT插件:
<project><build><plugins>...<plugin><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><goals><goal>process</goal></goals><configuration><outputDirectory>target/generated-sources/java</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions></plugin>...</plugins></build>
</project>
JPAAnnotationProcessor会找到使用javax.persistence.Entity注解的领域类型,并为它们生成查询类型。
如果您的领域类型中使用了Hibernate注解,您应该使用APT处理器com.querydsl.apt.hibernate.HibernateAnnotationProcessor。
运行clean install
,您将获得生成的Query类型,存储在target/generated-sources/java
目录中。
如果您使用Eclipse,请运行mvn eclipse:eclipse
,将target/generated-sources/java
包含为源文件夹,以更新Eclipse项目。
现在,您可以构造JPA查询实例和查询领域模型的实例。