zoukankan      html  css  js  c++  java
  • Querydsl与SpringBoot集成

    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);
    
  • 相关阅读:
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    linux_shell_根据网站来源分桶
    mac_Alfred_快捷设置
    linux_无密登录
    crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取
    linux下查看最消耗CPU、内存的进程
    绕过登陆常用万能密码
    ctf比赛linux文件监控和恢复shell
    Python爬虫之Selenium的常用方法
    CTF比赛时准备的一些shell命令
  • 原文地址:https://www.cnblogs.com/thisismarc/p/13594398.html
Copyright © 2011-2022 走看看