关于 QueryDSL 

最近写项目,使用到了 Jpa 这个 ORM 规范支持,使用注解的方式实现 Sql ,但是用过 Jpa 的同学都知道 Jpa 对于单表操作很灵活,但是对于复杂一些的 SQL 就是很不友好了,所以这个地方我们就用到了 QueryDSL 来实现复杂的 Sql(另外强行安利一波 Tk-MyBatis)

什么是 QueryDSL ? 

    QueryDSL仅仅是一个通用的查询框架,专注于通过 JavaAPI 构建类型安全的 Sql 查询,也可以说 QueryDSL 是基于各种 ORM 框架以及 Sql 之上的一个通用的查询框架,QueryDSL 的查询,类是于 SQL 查询,很全面只不过一个是用 SQL 一个是用代码来代替 SQL -- 不多了解 QueryDSL 的其他方面了,直接进入看配置和代码吧,毕竟博主也是刚刚接触这个查询框架,就不做过多的误导了

说一下,下面示例的环境 -- MyBatis + IDEA + JPA + QueryDSL

---------------------------------------------------- 手动分界线 ----------------------------------------------------

以下为项目操作(创建项目的操作就先省略掉了,这个应该都会,不会的可以去看博主的其他博客):

首先配置 pom.xml 更古不变的定律  T_T!!  对了在安利一个插件 lombok,配合 QueryDSL 可能会更好

<!-- QueryDSL 相关依赖 -->
<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><scope>provided</scope>
</dependency>
<!-- lombok 相关依赖 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version><scope>provided</scope>
</dependency>

Ps:lombok 可以已注解的方式来对代码进行简化,省去了 get 和 set 方法,至于怎么使用 lombok ,先看本文示例吧

配置 application.properties 文件

server.port=8080
server.servlet.context-path=/
server.tomcat.uri-encoding=utf-8
###添加 MySQL 数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot_test?serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true
###用户名
spring.datasource.username=xxx
###密码
spring.datasource.password=xxx
###驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#是否自动生/更新成表,根据什么策略
spring.jpa.hibernate.ddl-auto=update
#JPA配置
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.legacy_limit_handler=true
#是否展示sql
spring.jpa.show-sql= true

创建 entiy 层,因为要先创建完实体类才可以去生成 QueryDSL

package com.cs.querydsl.model;import lombok.Data;
import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;/*** @ClassName:User* @Description:TODO User 实体类* @Author LinLuoChen* @Date 2019/7/10/14:02* @Version V1.0**/@Data // lombok 工具省去了 GET SET 方法
@Entity // 声明这个是一个实体类
@Table(name="user") // 对应的数据库的那个表
public class User {/*** @Description ID* @Author LinLuoChen* @Date  10:44**/@Id@GenericGenerator(name="id", strategy="uuid") // 这里我们的 ID 用的是 UUID@GeneratedValue(generator="id")private Integer id;/*** @Description 姓名* @Author LinLuoChen* @Date  10:44**/@Column(name = "name")private String name;/*** @Description 密码* @Author LinLuoChen* @Date  10:44**/@Column(name = "password")private String password;
}

然后生成我们的 Q实体类,第一步点击右侧 Maven 然后选择第一个文件夹,双击 compile 它会自动运行,运行成功后会生成一个 QUser 的实体类 ,因为我们的实体类叫做 User 他是根据我们实体类来生成的

开始编写 Dao 层,引入JPA 的接口 -- !!重要 !!!

package com.cs.querydsl.dao;import com.cs.querydsl.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;/*** @ClassName:UserDao* @Description:TODO 用来继承 Jpa 接口* @Author LinLuoChen* @Date 2019/7/10/14:06* @Version V1.0**/
public interface UserDao extends JpaRepository<User, String>, JpaSpecificationExecutor<User>, PagingAndSortingRepository<User, String> {// -----
}

这里我们省略 Service 层 直接看 Impl 接口实现类,这里就先写一个单表查询进行测试

package com.cs.querydsl.service.impl;import com.cs.querydsl.dao.UserDao;
import com.cs.querydsl.model.QUser;
import com.cs.querydsl.model.User;
import com.cs.querydsl.service.UserService;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import java.util.List;/*** @ClassName:UserServiceImpl* @Description:TODO 接口实现类* @Author LinLuoChen* @Date 2019/7/10/14:09* @Version V1.0**/
@Service
public class UserServiceImpl implements UserService {@AutowiredUserDao userDao;@Autowiredprivate EntityManager entityManager;//查询工厂实体private JPAQueryFactory queryFactory;//实例化控制器完成后执行该方法实例化JPAQueryFactory@PostConstructpublic void initFactory(){queryFactory = new JPAQueryFactory(entityManager);}/*** @Description 查询全部* @Author LinLuoChen* @Date  10:53* @return java.util.List<com.cs.querydsl.model.User>**/@Overridepublic List<User> findAll(User user) {// 使用 QueryDSL 进行查询QUser qUser = QUser.user;// 定于获取条件BooleanBuilder booleanBuilder = new BooleanBuilder();// 要查询的条件if(!StringUtils.isEmpty(user.getName())){// 放入要查询的条件信息booleanBuilder.and(qUser.name.contains(user.getName()));}// queryFactory 是上方定义的工厂实体 // select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询return queryFactory.select(qUser).from(qUser).where(booleanBuilder).orderBy(qUser.name.desc()).fetch();}
}

我们直接写一个测试类进行测试

package com.cs.querydsl;import com.cs.querydsl.model.User;
import com.cs.querydsl.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class QuerydslApplicationTests {@AutowiredUserService userService;@Testpublic void contextLoads() {}/*** @Description 测试查询全部方法* @Author LinLuoChen* @Date  11:22**/@Testpublic void  QueryDSLTest(){User user = new User();List<User> list = userService.findAll(user);System.out.println(list);}}

测试结果,可以运行 ~~

虽然说 QueryDSL 也可以做增删改查,但是个人不建议使用(仅限单表),因为单表操作,其实使用 Jpa 就可以了,包括 Jpa 的动态查询,都是很适合单表的,不管是代码量还是效率个人感觉都比 QueryDSL 要快,尤其是代码量,少了不止一点半点,但是连表操作的话,就比较偏向于 QueryDSL 了,特别好用!!下边是连表操作的 QueryDSL ,另外说一下上边只是演示一下 QueryDSL 的使用方法,单表还是建议用 Jpa 比较快!

---------------------------------------------------- 手动分界线 ----------------------------------------------------

package com.cs.querydsl.service.impl;import com.cs.querydsl.dao.LocDao;
import com.cs.querydsl.model.Loc;
import com.cs.querydsl.model.QLoc;
import com.cs.querydsl.model.QUser;
import com.cs.querydsl.service.LocService;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.QueryResults;
import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import java.util.List;
import java.util.stream.Collectors;/*** @ClassName:LocServiceImpl* @Description:TODO 接口实现类* @Author LinLuoChen* @Date 2019/7/10/14:09* @Version V1.0**/
@Service
public class LocServiceImpl implements LocService {@AutowiredLocDao locDao;@Autowiredprivate EntityManager entityManager;//查询工厂实体private JPAQueryFactory queryFactory;//实例化控制器完成后执行该方法实例化JPAQueryFactory@PostConstructpublic void initFactory(){queryFactory = new JPAQueryFactory(entityManager);}/*** @Description 查询全部* @Author LinLuoChen* @Date  10:53* @return java.util.List<com.cs.querydsl.model.Loc>**/@Overridepublic List<Loc> findAll(Loc loc) {// 使用 QueryDSL 进行查询QLoc qLoc = QLoc.loc1;QUser qUser = QUser.user;// 定于获取条件BooleanBuilder booleanBuilder = new BooleanBuilder();// 要查询的条件if(!StringUtils.isEmpty(loc.getLoc())){// 放入要查询的条件信息booleanBuilder.and(qLoc.loc.contains(loc.getLoc()));}//连接查询条件(Loc.id = User.id )booleanBuilder.and(qLoc.id.eq(qUser.id));// 使用 QueryDSL 进行多表联合查询QueryResults<Tuple> listResult = queryFactory.select(QLoc.loc1,QUser.user).from(qLoc, qUser)//查询两表.where(booleanBuilder).fetchResults();//遍历 java8 自带流转换成集合List<Loc> collect = listResult.getResults().stream().map(tuple -> {Loc lcs = tuple.get(qLoc);return lcs;}).collect(Collectors.toList());return collect;}
}

查看结果

源码示例地址:https://download.csdn.net/download/qq_36537546/11356940

关于 QueryDSL 配置和使用(详细)相关推荐

  1. python 打包 .app 运行 控制台窗口_Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法...

    windows系统下安装Pyinstaller cmd下输入指令 pip install PyInstaller Pyinstaller的使用 进入需要打包的目录下,执行打包命令 Pyinstalle ...

  2. Linux DNS 服务配置 (非常详细)

    Linux DNS 服务配置 (非常详细) 转载于:https://blog.51cto.com/lidi97/843516

  3. 配置Log4j(很详细)1

    配置Log4j(很详细)1 转自:http://blog.csdn.net/azheng270/archive/2008/03/12/2173430.aspx Log4J的配置文件(Configura ...

  4. linux6 ftp配置,centos6.x vsftpd配置FTP服务器详细教程

    centos6.x vsftpd配置FTP服务器详细教程 centos6.x中搭建FTP服务器步骤如下 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | grep vsftp ...

  5. Vue学习笔记之13-webpack的配置 傻子看了都会配置的超详细教程

    本文中所使用的webpack配置相关版本如下, 如果你想要用新一点的版本, 可能需要根据报错的提示,安装额外的内容 webpack 3.6.0 css-loader 2.0.2 style-loade ...

  6. 本机php环境搭建教程:windows环境下wampserver的配置教程——超级详细

    转载自:http://youchunyan5.blog.163.com/blog/static/5896062020123474456352/ 本机php环境搭建教程:windows环境下wampse ...

  7. 在Centos7中配置NIS的详细过程

    在Centos7中配置NIS的详细过程 原理 NIS(Network Information Service) 在有多台linux服务器的环境中,且一台linux服务器的账号又有很多且可能会相同,所以 ...

  8. java安装以及配置环境变量详细步骤

    java安装以及配置环境变量详细步骤 一.安装JDK(Java Development Kit开发工具包) 下载地址: http://www.oracle.com/technetwork/java/j ...

  9. 计算机如何配置交换机,Win7电脑怎么配置交换机|Win7电脑配置交换机的详细步骤...

    想在同一个环境下,给多台Win7电脑连接网络的话,我们可以给Win7电脑配置交换机,但是会给Win7电脑配置交换机的用户,没有几个会,因此有很多用户急需,在Win7电脑上配置交换机的操作方法,而小编的 ...

  10. Jenkins详细安装配置部署--超详细

    Jenkins详细安装配置部署--超详细 一.什么是CI/CD 二.Gitlab内置持续集成 持续集成(CI) 持续交付(CD) 2.1 Gitlab的CI/CD优势 2.2 Gitlab的CI/CD ...

最新文章

  1. Verilog 中 wire 和 reg 数据类型区别
  2. 【工具使用系列】关于 MATLAB 液压机构,你需要知道的事
  3. 忽如一夜冬风来,团队忽然就解散了
  4. 图像分割-LOG检测器和DOG检测器
  5. 优化matlab作业,现代设计优化算法MATLAB实现
  6. c++ 纯虚函数导出
  7. windows API 菜鸟学习之路(二)
  8. 一加功耗dump开关_一加5/5TFlyme8 9.11.14 支持功能一览
  9. 【扫盲】------Zipf分布
  10. 山东大学操作系统实验
  11. PLM -Aras Innovator 安装
  12. 使用vot-toolkit-python测试VOT2020
  13. PS在导出图片时提示无法加载扩展,未经正确签署
  14. msiexec.exe的用法
  15. 近红外 中红外 远红外
  16. 对于线性代数、特征空间、特征提取、深度学习的一些深夜思考
  17. 什么是真正的蒸汽朋克?
  18. 求素数(质数)的方法(求100以内的素数及判断该数是否为素数)
  19. 微软“咸鱼翻身”:股价沉沦17年后创历史新高
  20. FUNCTION 数据库名.GETDATE does not exist 详情页下单

热门文章

  1. WIN7运行命令大全
  2. java 生产mdb_Java生成mdb文件[MS Access文件]
  3. Dell笔记本Alienware Command Center监测不到CPU和内存数据
  4. signature=c9b7b92b79e9a32ac6be9993bfe5df5a,GBA金手指
  5. 你所不了解的“三消”游戏
  6. 【学习】——提问的智慧
  7. 单片机音乐倒数计时器c语言,基于单片机音乐倒数计时器设计.doc
  8. 基于Cisco CDP协议的家用路由器以及盒子的自动配置随想
  9. 【元胞自动机】基于元胞自动机模拟交通流仿真含Matlab源码
  10. Unity3D 发布APK安卓环境配置步骤、安装、教程(含Java/Android)(超全流程)