Skip to content

Commit 56e6307

Browse files
committed
add FastRepository
1 parent 903ba1d commit 56e6307

File tree

10 files changed

+294
-4
lines changed

10 files changed

+294
-4
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.codingapi.springboot.fast.query;
2+
3+
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import org.springframework.core.ResolvableType;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
8+
import org.springframework.data.repository.NoRepositoryBean;
9+
10+
@NoRepositoryBean
11+
public interface FastRepository<T,ID> extends JpaRepository<T,ID>, JpaSpecificationExecutor<T> {
12+
13+
default Page<T> findAll(PageRequest request){
14+
Class<T> clazz = getDomainClass();
15+
if(request.hasFilter()){
16+
return findAll(request.getExample(clazz),request);
17+
}
18+
return findAll((org.springframework.data.domain.PageRequest)request);
19+
}
20+
21+
22+
@SuppressWarnings("unchecked")
23+
default Class<T> getDomainClass() {
24+
ResolvableType resolvableType = ResolvableType.forClass(getClass()).as(FastRepository.class);
25+
return (Class<T>) resolvableType.getGeneric(0).resolve();
26+
}
27+
28+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.codingapi.springboot.fast;
2+
3+
import com.codingapi.springboot.fast.entity.Demo;
4+
import com.codingapi.springboot.fast.repository.DemoRepository;
5+
import com.codingapi.springboot.framework.dto.request.PageRequest;
6+
import com.codingapi.springboot.framework.dto.request.QueryFilter;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.test.context.SpringBootTest;
10+
import org.springframework.data.domain.Page;
11+
import org.springframework.data.domain.Sort;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
16+
@SpringBootTest
17+
public class DemoRepositoryTest {
18+
19+
@Autowired
20+
private DemoRepository demoRepository;
21+
22+
23+
@Test
24+
void test(){
25+
demoRepository.deleteAll();
26+
Demo demo = new Demo();
27+
demo.setName("123");
28+
demoRepository.save(demo);
29+
assertTrue(demo.getId()>0);
30+
}
31+
32+
33+
@Test
34+
void query(){
35+
demoRepository.deleteAll();
36+
Demo demo1 = new Demo();
37+
demo1.setName("123");
38+
demoRepository.save(demo1);
39+
40+
Demo demo2 = new Demo();
41+
demo2.setName("456");
42+
demoRepository.save(demo2);
43+
44+
PageRequest request = new PageRequest();
45+
request.setCurrent(1);
46+
request.setPageSize(10);
47+
request.addFilter(QueryFilter.of("name","123"));
48+
49+
Page<Demo> page = demoRepository.findAll(request);
50+
assertEquals(1, page.getTotalElements());
51+
}
52+
53+
54+
@Test
55+
void sort(){
56+
demoRepository.deleteAll();
57+
Demo demo1 = new Demo();
58+
demo1.setName("123");
59+
demoRepository.save(demo1);
60+
61+
Demo demo2 = new Demo();
62+
demo2.setName("456");
63+
demoRepository.save(demo2);
64+
65+
PageRequest request = new PageRequest();
66+
request.setCurrent(1);
67+
request.setPageSize(10);
68+
69+
request.addSort(Sort.by("id").descending());
70+
Page<Demo> page = demoRepository.findAll(request);
71+
assertEquals(page.getContent().get(0).getName(),"456");
72+
assertEquals(2, page.getTotalElements());
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.codingapi.springboot.fast.repository;
2+
3+
import com.codingapi.springboot.fast.entity.Demo;
4+
import com.codingapi.springboot.fast.query.FastRepository;
5+
6+
public interface DemoRepository extends FastRepository<Demo,Integer> {
7+
8+
}

springboot-starter/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@
6767
<scope>test</scope>
6868
</dependency>
6969

70+
<dependency>
71+
<groupId>org.springframework.boot</groupId>
72+
<artifactId>spring-boot-starter-data-jpa</artifactId>
73+
<scope>test</scope>
74+
</dependency>
75+
76+
<dependency>
77+
<groupId>com.h2database</groupId>
78+
<artifactId>h2</artifactId>
79+
<scope>test</scope>
80+
</dependency>
81+
7082
</dependencies>
7183

7284

springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package com.codingapi.springboot.framework.dto.request;
22

3+
import lombok.Getter;
4+
import org.springframework.beans.BeanUtils;
5+
import org.springframework.data.domain.Example;
36
import org.springframework.data.domain.Pageable;
47
import org.springframework.data.domain.Sort;
58

9+
import java.beans.PropertyDescriptor;
610
import java.util.Optional;
711

812
public class PageRequest extends org.springframework.data.domain.PageRequest {
913

14+
@Getter
1015
private int current;
1116
private int pageSize;
17+
private QueryFilter filter;
1218

1319
private org.springframework.data.domain.PageRequest pageRequest;
1420

@@ -23,10 +29,6 @@ public PageRequest() {
2329
this(0, 20, Sort.unsorted());
2430
}
2531

26-
public int getCurrent() {
27-
return current;
28-
}
29-
3032
public void setCurrent(int current) {
3133
this.current = current > 0 ? current - 1 : 0;
3234
}
@@ -108,5 +110,33 @@ public void addSort(Sort sort) {
108110
pageRequest.getSort().and(sort);
109111
}
110112
}
113+
114+
public void addFilter(QueryFilter filter){
115+
this.filter = filter;
116+
}
117+
118+
public boolean hasFilter(){
119+
return this.filter!=null;
120+
}
121+
122+
public <T> Example<T> getExample(Class<T> clazz){
123+
if(this.filter ==null){
124+
return null;
125+
}
126+
try {
127+
Object entity = clazz.getDeclaredConstructor().newInstance();
128+
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
129+
for (PropertyDescriptor descriptor : descriptors) {
130+
String name = descriptor.getName();
131+
Object value = filter.getValue(name);
132+
if (value != null) {
133+
descriptor.getWriteMethod().invoke(entity,value);
134+
}
135+
}
136+
return (Example<T>) Example.of(entity);
137+
}catch (Exception e){
138+
return null;
139+
}
140+
}
111141
}
112142

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.codingapi.springboot.framework.dto.request;
2+
3+
import lombok.Getter;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
@Getter
9+
public class QueryFilter {
10+
11+
private final Map<String,Object> filters = new HashMap<>();
12+
13+
public QueryFilter add(String key,Object value){
14+
filters.put(key, value);
15+
return this;
16+
}
17+
18+
public static QueryFilter of(String key,Object value){
19+
QueryFilter filter = new QueryFilter();
20+
filter.add(key, value);
21+
return filter;
22+
}
23+
24+
public Object getValue(String key) {
25+
return filters.get(key);
26+
}
27+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.codingapi.springboot.framework.query.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@Setter
8+
@Getter
9+
@Table(name = "t_demo")
10+
@Entity
11+
public class Demo {
12+
13+
@Id
14+
@GeneratedValue(strategy = GenerationType.IDENTITY)
15+
private Integer id;
16+
17+
private String name;
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.codingapi.springboot.framework.query.repository;
2+
3+
import com.codingapi.springboot.framework.query.entity.Demo;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface DemoRepository extends JpaRepository<Demo,Integer> {
7+
8+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.codingapi.springboot.framework.query.test;
2+
3+
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import com.codingapi.springboot.framework.dto.request.QueryFilter;
5+
import com.codingapi.springboot.framework.query.entity.Demo;
6+
import com.codingapi.springboot.framework.query.repository.DemoRepository;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.test.context.SpringBootTest;
10+
import org.springframework.data.domain.Example;
11+
import org.springframework.data.domain.Page;
12+
import org.springframework.data.domain.Sort;
13+
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
import static org.junit.jupiter.api.Assertions.assertTrue;
16+
17+
@SpringBootTest
18+
public class DemoRepositoryTest {
19+
20+
@Autowired
21+
private DemoRepository demoRepository;
22+
23+
24+
@Test
25+
void test(){
26+
demoRepository.deleteAll();
27+
Demo demo = new Demo();
28+
demo.setName("123");
29+
demoRepository.save(demo);
30+
assertTrue(demo.getId()>0);
31+
}
32+
33+
34+
@Test
35+
void query(){
36+
demoRepository.deleteAll();
37+
38+
Demo demo1 = new Demo();
39+
demo1.setName("123");
40+
demoRepository.save(demo1);
41+
42+
Demo demo2 = new Demo();
43+
demo2.setName("456");
44+
demoRepository.save(demo2);
45+
46+
PageRequest request = new PageRequest();
47+
request.setCurrent(1);
48+
request.setPageSize(10);
49+
50+
request.addFilter(QueryFilter.of("name","123"));
51+
52+
Example<Demo> demo = request.getExample(Demo.class);
53+
System.out.println(demo);
54+
Page<Demo> page = demoRepository.findAll(demo,request);
55+
assertEquals(1, page.getTotalElements());
56+
}
57+
58+
59+
@Test
60+
void sort(){
61+
demoRepository.deleteAll();
62+
Demo demo1 = new Demo();
63+
demo1.setName("123");
64+
demoRepository.save(demo1);
65+
66+
Demo demo2 = new Demo();
67+
demo2.setName("456");
68+
demoRepository.save(demo2);
69+
70+
PageRequest request = new PageRequest();
71+
request.setCurrent(1);
72+
request.setPageSize(10);
73+
74+
request.addSort(Sort.by("id").descending());
75+
Page<Demo> page = demoRepository.findAll(request);
76+
assertEquals(page.getContent().get(0).getName(),"456");
77+
assertEquals(2, page.getTotalElements());
78+
}
79+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
server.port=8088
2+
spring.datasource.driver-class-name=org.h2.Driver
3+
spring.datasource.url=jdbc:h2:file:./test.db
4+
spring.jpa.hibernate.ddl-auto=create-drop
5+
spring.jpa.show-sql=true

0 commit comments

Comments
 (0)