SpringBoot+JPA+QueryDSL+mongodb 展示
QueryDSL是一个通用的查询框架. 可以大大简化代码和不同数据库的sql差异化语法问题; 通过querydsl可以实现复杂的sql补充jpa的不足;
工程截图
1. 引入依赖
mongo依赖
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-data-mongodb</artifactId>
-
</dependency>
querydsl依赖
-
<dependency>
-
<groupId>com.querydsl</groupId>
-
<artifactId>querydsl-jpa</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>com.querydsl</groupId>
-
<artifactId>querydsl-apt</artifactId>
-
<scope>provided</scope>
-
</dependency>
编译插件
-
<plugin>
-
<groupId>com.mysema.maven</groupId>
-
<artifactId>apt-maven-plugin</artifactId>
-
<executions>
-
<execution>
-
<goals>
-
<goal>process</goal>
-
</goals>
-
<configuration>
-
<outputDirectory>target/generated-sources/java</outputDirectory>
-
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
-
</processor>
-
</configuration>
-
</execution>
-
</executions>
-
</plugin>
完整的pom配置
-
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>2.1.9.RELEASE</version>
-
</parent>
-
-
<groupId>com.demo</groupId>
-
<artifactId>demo-querydsl-mongo</artifactId>
-
<version>1.0-SNAPSHOT</version>
-
-
<properties>
-
<java.version>1.8</java.version>
-
<fastjson.version>1.2.83</fastjson.version>
-
</properties>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-data-mongodb</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>com.querydsl</groupId>
-
<artifactId>querydsl-jpa</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>com.querydsl</groupId>
-
<artifactId>querydsl-apt</artifactId>
-
<scope>provided</scope>
-
</dependency>
-
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>fastjson</artifactId>
-
<version>${fastjson.version}</version>
-
</dependency>
-
</dependencies>
-
-
<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>
-
<executions>
-
<execution>
-
<goals>
-
<goal>process</goal>
-
</goals>
-
<configuration>
-
<outputDirectory>target/generated-sources/java</outputDirectory>
-
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
-
</processor>
-
</configuration>
-
</execution>
-
</executions>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
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需要再启动器类里面开启审计
-
-
public class User {
-
-
-
private String id;
-
-
-
-
private String username;
-
-
private String name;
-
-
private Integer age;
-
-
-
-
private Date createdDate;
-
-
-
-
private Date lastModifiedDate;
-
}
4. 创建Repository接口, 继承QuerydslPredicateExecutor接口, 方法都空着,继承就行了
-
-
public interface BaseMongoRepository<T> extends MongoRepository<T, String>, QuerydslPredicateExecutor<T> {
-
-
}
5. 创建对象 repo, 继承BaseMongoRepository方法都空着,继承就行了. 需要传递范型
-
-
public interface UserRepository extends BaseMongoRepository<User> {
-
}
-
6. 创建公共service
提供公共的方法. 对象的service继承此类即可完成相关功能
-
public class BaseService<T, I extends String> {
-
-
-
private BaseMongoRepository<T> baseMongoRepository;
-
-
public BaseMongoRepository<T> getRepository() {
-
return baseMongoRepository;
-
}
-
-
public List<T> findAll() {
-
return getRepository().findAll();
-
}
-
-
public Iterable<T> findAll(Predicate predicate) {
-
if (null == predicate) {
-
return findAll();
-
}
-
return getRepository().findAll(predicate);
-
}
-
-
public Page<T> findAll(Pageable pageable) {
-
return getRepository().findAll(pageable);
-
}
-
-
public Page<T> findAll(Predicate predicate, Pageable pageable) {
-
if (null == predicate) {
-
return findAll(pageable);
-
}
-
return getRepository().findAll(predicate, pageable);
-
}
-
-
public <S extends T> S save(S entity) {
-
return getRepository().save(entity);
-
}
-
-
public <S extends T> S update(S entity) {
-
return getRepository().save(entity);
-
}
-
-
public T findById(I id) {
-
Optional<T> one = getRepository().findById(id);
-
if (one.isPresent()) {
-
return one.get();
-
}
-
return null;
-
}
-
-
public T findOne(Predicate predicate) {
-
Optional<T> 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 需要先编译才会自动生成
-
-
public class UserService extends BaseService<User, String> {
-
-
-
public <S extends User> 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进行测试
-
-
-
public class UserController {
-
-
-
private UserService userService;
-
-
-
public Object saveUser( { 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;
-
}
-
-
-
public JSONObject queryUser( { Predicate predicate, Pageable pageable)
-
Page<User> 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去检查合法性
查询接口; 通过
关注个人公众号获取源代码
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgachie
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24