Querydsl为大多数数据库提供了一种基于Java的类型安全,类SQL的查询方式。相比JPA,Querydsl能提供更加强大的查询方式,比如关联查询。相比MyBatis,Querydsl省去了XML文件或者注解SQL的麻烦,直接通过流式API的方式进行调用。

除了支持关系型数据库之外,Querydsl同样支持一下存储

  • MongoDB
  • Lucene
  • Collections
  • Spatial
  • JDO

接下来通过H2+JPA的方式介绍Querydsl的基本使用(为了演示采用H2数据库)

一、创建项目,添加依赖

本文采用Spring Boot快速搭建项目,并在pom.xml中添加以下依赖

				<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.3.1</version>
</dependency> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<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>

注意

当在项目中使用的是JPA的注解( javax.persistence.Entity)的时候,需要使用JPAAnnotationProcessor生成相关的查询类,如果使用的是Hibernate注解的时候,需要将JPAAnnotationProcessor替换成com.querydsl.apt.hibernate.HibernateAnnotationProcessor。

二、创建实体类

@Entity
public class User {
@Id
private Integer id;
private String name;
// 省略getter, setter等方法
} @Entity
public class UserInfo {
@Id
private Integer userId;
private Integer sex;
}

实体类创建完成之后,重新编译项目

mvn clean package

在target/generated-sources/java目录中可以看到编译后生成的查询类(Q开头的类,例如QUser, QUserInfo)

三、测试

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class QuerydslTests {
@Autowired
private EntityManager entityManager;
private JPAQueryFactory queryFactory;
private QUser qUser;
private QUserInfo qUserInfo; @BeforeEach
void setUp() {
queryFactory = new JPAQueryFactory(entityManager);
qUser = QUser.user;
qUserInfo = QUserInfo.userInfo;
} @Test
void simpleQuery() {
User user = queryFactory.selectFrom(qUser)
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(user);
Assertions.assertEquals("XiaoMing", user.getName());
} @Test
void simpleQueryFields() {
String name = queryFactory.selectFrom(qUser)
.select(qUser.name)
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(name);
Assertions.assertEquals("XiaoMing", name);
} @Test
void join() {
Tuple tuple = queryFactory.selectFrom(qUser)
.select(qUser.id, qUser.name, qUserInfo.sex)
.innerJoin(qUserInfo).on(qUserInfo.userId.eq(qUser.id))
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(tuple);
Assertions.assertNotEquals(0, tuple.size());
Integer userId = tuple.get(0, Integer.class);
String name = tuple.get(1, String.class);
Integer sex = tuple.get(2, Integer.class);
Assertions.assertEquals(1, userId);
Assertions.assertEquals("XiaoMing", name);
Assertions.assertEquals(0, sex);
}
}

最后附上数据库初始化脚本

insert into `user` (id, name) values (1, 'XiaoMing');
insert into `user` (id, name) values (2, 'XiaoHong'); insert into `user_info` (user_id, sex) values (1, 0);
insert into `user_info` (user_id, sex) values (2, 1);

Querydsl与SpringBoot集成的更多相关文章

  1. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  2. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  3. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  4. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  5. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  6. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  7. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

  8. springboot集成redis(mybatis、分布式session)

    安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...

  9. SpringBoot集成jsp

    一.springBoot集成jsp: 1.修改pom文件 <!--集成jsp所需jar包--> <!--jsp页面使用jstl标签--> <dependency> ...

随机推荐

  1. C#设计模式学习之装饰者模式

    写这个随笔时,其实对该模式理解的并不是十分透彻.在此想到什么写什么,希望对自己对他人有所帮助. 装饰者模式主要是应用继承和组合的思想,极大的实现了程序的多态,使得的程序有了更高的扩展性. 第一个基础例 ...

  2. Java语言实现二维码的生成

    众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...

  3. 『无为则无心』Python基础 — 11、Python中的数据类型转换

    目录 1.为什么要进行数据类型转换 2.数据类型转换本质 3.数据类型转换用到的函数 4.常用数据类型转换的函数 (1)int()函数 (2)float()函数 (3)str()函数 (4)bool( ...

  4. gomod使用小结

    gomod使用小结 使用方法 把工程拷贝到$GOPATH/src之外 在工程目录下执行:go mod init {module name}该命令会创建一个go.mod文件 然后在该目录下执行 go b ...

  5. js笔记10

    1.闭包 封装:减少代码的冗余,提高代码的重复利用率 继承:本来需要开辟多个空间,只需要开辟一个空间,减少内存的消耗,提高性能 函数归属:函数归属谁,跟他在哪调用没有关系,而跟他在哪定义有关 闭包的定 ...

  6. 13、mysql主从复制原理解析

    13.1.mysql主从复制介绍: 1.普通文件,磁盘上的文件的同步方法: (1)nfs网络文件共享可以同步数据存储: (2)samba共享数据: (3)ftp数据同步: (4)定时任务:cronta ...

  7. 如何在微信小程序中使用组件?

    何为组件 组件封装一段代码,不仅可以在其他的页面中可以使用,也可以在本页面中使用,不用再重复造"轮子".组件可以提高代码的复用率,因此善于使用组件在微信小程序开发中是非常重要的. ...

  8. AcWing 1290. 越狱

    监狱有连续编号为1~n的n个房间,每个房间关押一个犯人.有 M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人信仰的宗教相同,就可能发生越狱.求有多少种状态可能发生越狱. #include< ...

  9. Docker学不会?不妨看看这篇文章

    大家好,我是辰哥! 上一篇文章(2300+字!在不同系统上安装Docker!)教大家如何在系统上安装docker,今天咱们来学习docker的基本使用. 辰哥将在本文里详细介绍docker的各种使用命 ...

  10. DB2某建表语句

    DB2建表加注解的建表语句 CREATE TABLE table_name ( company CHARACTER(1) NOT NULL DEFAULT 'N', online CHARACTER( ...