栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+JPA+QueryDSL+mongodb 示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+JPA+QueryDSL+mongodb 示例

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

工程截图

 

1. 引入依赖

mongo依赖

      
          org.springframework.boot
          spring-boot-starter-data-mongodb
      

querydsl依赖

      
          com.querydsl
          querydsl-jpa
      
      
          com.querydsl
          querydsl-apt
          provided
      

编译插件

          
              com.mysema.maven
              apt-maven-plugin
              
                  
                      
                          process
                      
                      
                          target/generated-sources/java
                          org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
                          
                      
                  
              
          

完整的pom配置



  4.0.0
​
  
      org.springframework.boot
      spring-boot-starter-parent
      2.1.9.RELEASE
  
​
  com.demo
  demo-querydsl-mongo
  1.0-SNAPSHOT
​
  
      1.8
      1.2.83
  
​
  
      
          org.springframework.boot
          spring-boot-starter-web
      
      
          org.springframework.boot
          spring-boot-starter-data-mongodb
      
      
          com.querydsl
          querydsl-jpa
      
      
          com.querydsl
          querydsl-apt
          provided
      
​
      
          com.alibaba
          fastjson
          ${fastjson.version}
      
  
​
  
      
          
              org.springframework.boot
              spring-boot-maven-plugin
          
          
              com.mysema.maven
              apt-maven-plugin
              
                  
                      
                          process
                      
                      
                          target/generated-sources/java
                          org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
                          
                      
                  
              
          
      
  
2. yml配置文件
server:
port: 8200
servlet:
  context-path: /demo
​
spring:
data:
  mongodb:
    host: 127.0.0.1:27017
    username: root
    password: root
    database: demo
    authentication-database: admin
3. 创建 实体对象

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

@Document(collection = "demo_user")
public class User {
​
  @Id
  private String id;
​
  @NotNull
  @Size(min = 2, max = 20)
  private String username;
   
  private String name;
​
  private Integer age;
   
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @CreatedDate
  private Date createdDate;
​
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @LastModifiedDate
  private Date lastModifiedDate;
}
4. 创建Repository接口, 继承QuerydslPredicateExecutor接口, 方法都空着,继承就行了
@NoRepositoryBean
public interface BaseMongoRepository extends MongoRepository, QuerydslPredicateExecutor {
​
}
5. 创建对象 repo, 继承BaseMongoRepository方法都空着,继承就行了. 需要传递范型
@Repository
public interface UserRepository extends BaseMongoRepository {
}
​

6. 创建公共service

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

public class BaseService {
​
  @Autowired
  private BaseMongoRepository baseMongoRepository;
​
  public BaseMongoRepository getRepository() {
      return baseMongoRepository;
  }
​
  public List findAll() {
      return getRepository().findAll();
  }
​
  public Iterable findAll(Predicate predicate) {
      if (null == predicate) {
          return findAll();
      }
      return getRepository().findAll(predicate);
  }
​
  public Page findAll(Pageable pageable) {
      return getRepository().findAll(pageable);
  }
​
  public Page findAll(Predicate predicate, Pageable pageable) {
      if (null == predicate) {
          return findAll(pageable);
      }
      return getRepository().findAll(predicate, pageable);
  }
​
  public  S save(S entity) {
      return getRepository().save(entity);
  }
​
  public  S update(S entity) {
      return getRepository().save(entity);
  }
​
  public T findById(I id) {
      Optional one = getRepository().findById(id);
      if (one.isPresent()) {
          return one.get();
      }
      return null;
  }
​
  public T findOne(Predicate predicate) {
      Optional one = getRepository().findOne(predicate);
      if (one.isPresent()) {
          return one.get();
      }
      return null;
  }
​
  public long count() {
      return getRepository().count();
  }
​
  public long count(Predicate predicate) {
      return getRepository().count(predicate);
  }
​
  public void delete(I id) {
      T entity = findById(id);
      delete(entity);
  }
​
  public void delete(T entity) {
      getRepository().delete(entity);
  }
​
}
7. 创建对象的service, 继承BaseService传递范型;

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

@Service
public class UserService extends BaseService {
​
  @Override
  public  S save(S entity) {
      BooleanBuilder builder = new BooleanBuilder();
      builder.and(QUser.user.username.eq(entity.getUsername()));
      long count = count(builder);
      if (count > 1) {
          throw new RuntimeException("username 重复");
      }
      return super.save(entity);
  }
}
​

8. 编写controller进行测试
@RestController
@RequestMapping("/user")
public class UserController {
​
  @Autowired
  private UserService userService;
​
  @RequestMapping(value = "/save")
  public Object saveUser(@ModelAttribute @Valid User user, BindingResult bindingResult, HttpServletRequest request, HttpServletResponse response) {
      if (bindingResult.hasErrors()) {
          return bindingResult.getFieldError().getDefaultMessage();
      }
      userService.save(user);
​
      JSONObject jsonObject = new JSONObject(true);
      jsonObject.put("data", user);
      return jsonObject;
  }
​
  @RequestMapping(value = "/query")
  public JSONObject queryUser(@QuerydslPredicate(root = User.class) Predicate predicate, @PageableDefault(size = 20, sort = {"createdDate"}, direction = Sort.Direction.DESC) Pageable pageable) {
      Page userPage = userService.findAll(predicate, pageable);
​
      JSONObject jsonObject = new JSONObject(true);
      jsonObject.put("data", userPage.getContent());
      jsonObject.put("totalPages", userPage.getTotalPages());
      jsonObject.put("totalElements", userPage.getTotalElements());
      jsonObject.put("pageable", userPage.getPageable());
      return jsonObject;
  }
​
}
9. postman进行测试

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

 

查询接口; 通过

 

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号