• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringBoot+JPA+QueryDSL+mongodb 展示

武飞扬头像
dennis345
帮助1

QueryDSL是一个通用的查询框架. 可以大大简化代码和不同数据库的sql差异化语法问题; 通过querydsl可以实现复杂的sql补充jpa的不足;

工程截图

学新通

1. 引入依赖

mongo依赖

  1.  
          <dependency>
  2.  
              <groupId>org.springframework.boot</groupId>
  3.  
              <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4.  
          </dependency>

querydsl依赖

  1.  
          <dependency>
  2.  
              <groupId>com.querydsl</groupId>
  3.  
              <artifactId>querydsl-jpa</artifactId>
  4.  
          </dependency>
  5.  
          <dependency>
  6.  
              <groupId>com.querydsl</groupId>
  7.  
              <artifactId>querydsl-apt</artifactId>
  8.  
              <scope>provided</scope>
  9.  
          </dependency>

编译插件

  1.  
              <plugin>
  2.  
                  <groupId>com.mysema.maven</groupId>
  3.  
                  <artifactId>apt-maven-plugin</artifactId>
  4.  
                  <executions>
  5.  
                      <execution>
  6.  
                          <goals>
  7.  
                              <goal>process</goal>
  8.  
                          </goals>
  9.  
                          <configuration>
  10.  
                              <outputDirectory>target/generated-sources/java</outputDirectory>
  11.  
                              <processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
  12.  
                              </processor>
  13.  
                          </configuration>
  14.  
                      </execution>
  15.  
                  </executions>
  16.  
              </plugin>
学新通

完整的pom配置

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.  
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.  
      <modelVersion>4.0.0</modelVersion>
  6.  
  7.  
      <parent>
  8.  
          <groupId>org.springframework.boot</groupId>
  9.  
          <artifactId>spring-boot-starter-parent</artifactId>
  10.  
          <version>2.1.9.RELEASE</version>
  11.  
      </parent>
  12.  
  13.  
      <groupId>com.demo</groupId>
  14.  
      <artifactId>demo-querydsl-mongo</artifactId>
  15.  
      <version>1.0-SNAPSHOT</version>
  16.  
  17.  
      <properties>
  18.  
          <java.version>1.8</java.version>
  19.  
          <fastjson.version>1.2.83</fastjson.version>
  20.  
      </properties>
  21.  
  22.  
      <dependencies>
  23.  
          <dependency>
  24.  
              <groupId>org.springframework.boot</groupId>
  25.  
              <artifactId>spring-boot-starter-web</artifactId>
  26.  
          </dependency>
  27.  
          <dependency>
  28.  
              <groupId>org.springframework.boot</groupId>
  29.  
              <artifactId>spring-boot-starter-data-mongodb</artifactId>
  30.  
          </dependency>
  31.  
          <dependency>
  32.  
              <groupId>com.querydsl</groupId>
  33.  
              <artifactId>querydsl-jpa</artifactId>
  34.  
          </dependency>
  35.  
          <dependency>
  36.  
              <groupId>com.querydsl</groupId>
  37.  
              <artifactId>querydsl-apt</artifactId>
  38.  
              <scope>provided</scope>
  39.  
          </dependency>
  40.  
  41.  
          <dependency>
  42.  
              <groupId>com.alibaba</groupId>
  43.  
              <artifactId>fastjson</artifactId>
  44.  
              <version>${fastjson.version}</version>
  45.  
          </dependency>
  46.  
      </dependencies>
  47.  
  48.  
      <build>
  49.  
          <plugins>
  50.  
              <plugin>
  51.  
                  <groupId>org.springframework.boot</groupId>
  52.  
                  <artifactId>spring-boot-maven-plugin</artifactId>
  53.  
              </plugin>
  54.  
              <plugin>
  55.  
                  <groupId>com.mysema.maven</groupId>
  56.  
                  <artifactId>apt-maven-plugin</artifactId>
  57.  
                  <executions>
  58.  
                      <execution>
  59.  
                          <goals>
  60.  
                              <goal>process</goal>
  61.  
                          </goals>
  62.  
                          <configuration>
  63.  
                              <outputDirectory>target/generated-sources/java</outputDirectory>
  64.  
                              <processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
  65.  
                              </processor>
  66.  
                          </configuration>
  67.  
                      </execution>
  68.  
                  </executions>
  69.  
              </plugin>
  70.  
          </plugins>
  71.  
      </build>
  72.  
    </project>
学新通

2. yml配置文件

  1.  
    server:
  2.  
    port: 8200
  3.  
    servlet:
  4.  
      context-path: /demo
  5.  
  6.  
    spring:
  7.  
    data:
  8.  
      mongodb:
  9.  
        host: 127.0.0.1:27017
  10.  
        username: root
  11.  
        password: root
  12.  
        database: demo
  13.  
        authentication-database: admin

3. 创建 实体对象

@Document对应关系型数据库中的@Entity; @CreatedDate需要再启动器类里面开启审计

  1.  
    @Document(collection = "demo_user")
  2.  
    public class User {
  3.  
  4.  
      @Id
  5.  
      private String id;
  6.  
  7.  
      @NotNull
  8.  
      @Size(min = 2, max = 20)
  9.  
      private String username;
  10.  
       
  11.  
      private String name;
  12.  
  13.  
      private Integer age;
  14.  
       
  15.  
      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  16.  
      @CreatedDate
  17.  
      private Date createdDate;
  18.  
  19.  
      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  20.  
      @LastModifiedDate
  21.  
      private Date lastModifiedDate;
  22.  
    }
学新通

4. 创建Repository接口, 继承QuerydslPredicateExecutor接口, 方法都空着,继承就行了

  1.  
    @NoRepositoryBean
  2.  
    public interface BaseMongoRepository<T> extends MongoRepository<T, String>, QuerydslPredicateExecutor<T> {
  3.  
  4.  
    }

5. 创建对象 repo, 继承BaseMongoRepository方法都空着,继承就行了. 需要传递范型

  1.  
    @Repository
  2.  
    public interface UserRepository extends BaseMongoRepository<User> {
  3.  
    }
  4.  

6. 创建公共service

提供公共的方法. 对象的service继承此类即可完成相关功能

  1.  
    public class BaseService<T, I extends String> {
  2.  
  3.  
      @Autowired
  4.  
      private BaseMongoRepository<T> baseMongoRepository;
  5.  
  6.  
      public BaseMongoRepository<T> getRepository() {
  7.  
          return baseMongoRepository;
  8.  
      }
  9.  
  10.  
      public List<T> findAll() {
  11.  
          return getRepository().findAll();
  12.  
      }
  13.  
  14.  
      public Iterable<T> findAll(Predicate predicate) {
  15.  
          if (null == predicate) {
  16.  
              return findAll();
  17.  
          }
  18.  
          return getRepository().findAll(predicate);
  19.  
      }
  20.  
  21.  
      public Page<T> findAll(Pageable pageable) {
  22.  
          return getRepository().findAll(pageable);
  23.  
      }
  24.  
  25.  
      public Page<T> findAll(Predicate predicate, Pageable pageable) {
  26.  
          if (null == predicate) {
  27.  
              return findAll(pageable);
  28.  
          }
  29.  
          return getRepository().findAll(predicate, pageable);
  30.  
      }
  31.  
  32.  
      public <S extends T> S save(S entity) {
  33.  
          return getRepository().save(entity);
  34.  
      }
  35.  
  36.  
      public <S extends T> S update(S entity) {
  37.  
          return getRepository().save(entity);
  38.  
      }
  39.  
  40.  
      public T findById(I id) {
  41.  
          Optional<T> one = getRepository().findById(id);
  42.  
          if (one.isPresent()) {
  43.  
              return one.get();
  44.  
          }
  45.  
          return null;
  46.  
      }
  47.  
  48.  
      public T findOne(Predicate predicate) {
  49.  
          Optional<T> one = getRepository().findOne(predicate);
  50.  
          if (one.isPresent()) {
  51.  
              return one.get();
  52.  
          }
  53.  
          return null;
  54.  
      }
  55.  
  56.  
      public long count() {
  57.  
          return getRepository().count();
  58.  
      }
  59.  
  60.  
      public long count(Predicate predicate) {
  61.  
          return getRepository().count(predicate);
  62.  
      }
  63.  
  64.  
      public void delete(I id) {
  65.  
          T entity = findById(id);
  66.  
          delete(entity);
  67.  
      }
  68.  
  69.  
      public void delete(T entity) {
  70.  
          getRepository().delete(entity);
  71.  
      }
  72.  
  73.  
    }
学新通

7. 创建对象的service, 继承BaseService传递范型;

重写save方法. 使用querydsl 方法查询username是否重复; QUser 需要先编译才会自动生成

  1.  
    @Service
  2.  
    public class UserService extends BaseService<User, String> {
  3.  
  4.  
      @Override
  5.  
      public <S extends User> S save(S entity) {
  6.  
          BooleanBuilder builder = new BooleanBuilder();
  7.  
          builder.and(QUser.user.username.eq(entity.getUsername()));
  8.  
          long count = count(builder);
  9.  
          if (count > 1) {
  10.  
              throw new RuntimeException("username 重复");
  11.  
          }
  12.  
          return super.save(entity);
  13.  
      }
  14.  
    }
  15.  
学新通

8. 编写controller进行测试

  1.  
    @RestController
  2.  
    @RequestMapping("/user")
  3.  
    public class UserController {
  4.  
  5.  
      @Autowired
  6.  
      private UserService userService;
  7.  
  8.  
      @RequestMapping(value = "/save")
  9.  
      public Object saveUser(@ModelAttribute @Valid User user, BindingResult bindingResult, HttpServletRequest request, HttpServletResponse response) {
  10.  
          if (bindingResult.hasErrors()) {
  11.  
              return bindingResult.getFieldError().getDefaultMessage();
  12.  
          }
  13.  
          userService.save(user);
  14.  
  15.  
          JSONObject jsonObject = new JSONObject(true);
  16.  
          jsonObject.put("data", user);
  17.  
          return jsonObject;
  18.  
      }
  19.  
  20.  
      @RequestMapping(value = "/query")
  21.  
      public JSONObject queryUser(@QuerydslPredicate(root = User.class) Predicate predicate, @PageableDefault(size = 20, sort = {"createdDate"}, direction = Sort.Direction.DESC) Pageable pageable) {
  22.  
          Page<User> userPage = userService.findAll(predicate, pageable);
  23.  
  24.  
          JSONObject jsonObject = new JSONObject(true);
  25.  
          jsonObject.put("data", userPage.getContent());
  26.  
          jsonObject.put("totalPages", userPage.getTotalPages());
  27.  
          jsonObject.put("totalElements", userPage.getTotalElements());
  28.  
          jsonObject.put("pageable", userPage.getPageable());
  29.  
          return jsonObject;
  30.  
      }
  31.  
  32.  
    }
学新通

9. postman进行测试

保存接口. 通过@valid去检查合法性

学新通

查询接口; 通过

学新通

关注个人公众号获取源代码

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgachie
系列文章
更多 icon
同类精品
更多 icon
继续加载