Skip to content

Commit 8cee298

Browse files
authored
Merge pull request #26 from codingapi/3.x
3.x
2 parents 25d681b + c758581 commit 8cee298

File tree

15 files changed

+445
-31
lines changed

15 files changed

+445
-31
lines changed

docs/wiki/springboot-starter-data-fast.md

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ springboot-starter-data-fast
22

33
基于JPA的快速API能力服务
44

5+
## FastController 快速API能力服务
56
```java
67
package com.codingapi.springboot.example.query;
78

@@ -45,3 +46,161 @@ value为查询语句,countQuery为查询总数语句,query为查询参数,
4546
MultiResponse为返回结果
4647
@PreAuthorize(value = "hasRole('ROLE_USER')") 用于标记当前接口的权限,如果不需要权限可以不用添加
4748

49+
## FastRepository 的使用教程
50+
51+
52+
继承FastRepository接口,实现自定义的接口,即可使用FastRepository的能力
53+
```java
54+
55+
56+
import com.codingapi.springboot.fast.entity.Demo;
57+
import com.codingapi.springboot.fast.query.FastRepository;
58+
59+
public interface DemoRepository extends FastRepository<Demo,Integer> {
60+
61+
}
62+
63+
64+
```
65+
动态FastRepository的能力展示
66+
67+
```java
68+
69+
// 重写findAll,通过Example查询
70+
@Test
71+
void findAll() {
72+
demoRepository.deleteAll();
73+
Demo demo1 = new Demo();
74+
demo1.setName("123");
75+
demoRepository.save(demo1);
76+
77+
Demo demo2 = new Demo();
78+
demo2.setName("456");
79+
demoRepository.save(demo2);
80+
81+
PageRequest request = new PageRequest();
82+
request.setCurrent(1);
83+
request.setPageSize(10);
84+
request.addFilter("name", "123");
85+
86+
Page<Demo> page = demoRepository.findAll(request);
87+
assertEquals(1, page.getTotalElements());
88+
}
89+
90+
91+
// pageRequest 自定义条件查询
92+
@Test
93+
void pageRequest() {
94+
demoRepository.deleteAll();
95+
Demo demo1 = new Demo();
96+
demo1.setName("123");
97+
demoRepository.save(demo1);
98+
99+
Demo demo2 = new Demo();
100+
demo2.setName("456");
101+
demoRepository.save(demo2);
102+
103+
PageRequest request = new PageRequest();
104+
request.setCurrent(1);
105+
request.setPageSize(10);
106+
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");
107+
108+
Page<Demo> page = demoRepository.pageRequest(request);
109+
assertEquals(1, page.getTotalElements());
110+
}
111+
112+
113+
// 动态sql的List查询
114+
@Test
115+
void dynamicListQuery() {
116+
demoRepository.deleteAll();
117+
Demo demo1 = new Demo();
118+
demo1.setName("123");
119+
demoRepository.save(demo1);
120+
121+
Demo demo2 = new Demo();
122+
demo2.setName("456");
123+
demoRepository.save(demo2);
124+
125+
List<Demo> list = demoRepository.dynamicListQuery("from Demo where name = ?1", "123");
126+
assertEquals(1, list.size());
127+
}
128+
129+
130+
// 动态sql的分页查询
131+
@Test
132+
void dynamicPageQuery() {
133+
demoRepository.deleteAll();
134+
Demo demo1 = new Demo();
135+
demo1.setName("123");
136+
demoRepository.save(demo1);
137+
138+
Demo demo2 = new Demo();
139+
demo2.setName("456");
140+
demoRepository.save(demo2);
141+
142+
Page<Demo> page = demoRepository.dynamicPageQuery("from Demo where name = ?1", PageRequest.of(1, 2), "123");
143+
assertEquals(1, page.getTotalElements());
144+
}
145+
146+
// 增加排序查询
147+
@Test
148+
void sortQuery() {
149+
demoRepository.deleteAll();
150+
Demo demo1 = new Demo();
151+
demo1.setName("123");
152+
demoRepository.save(demo1);
153+
154+
Demo demo2 = new Demo();
155+
demo2.setName("456");
156+
demoRepository.save(demo2);
157+
158+
PageRequest request = new PageRequest();
159+
request.setCurrent(1);
160+
request.setPageSize(10);
161+
162+
request.addSort(Sort.by("id").descending());
163+
Page<Demo> page = demoRepository.findAll(request);
164+
assertEquals(page.getContent().get(0).getName(), "456");
165+
assertEquals(2, page.getTotalElements());
166+
}
167+
168+
```
169+
## SortRepository的使用教程
170+
171+
```java
172+
173+
public interface DemoRepository extends FastRepository<Demo,Integer>, SortRepository<Demo,Integer> {
174+
175+
}
176+
177+
```
178+
179+
SortRepository的能力展示
180+
181+
```java
182+
183+
@Test
184+
@Transactional
185+
void pageSort() {
186+
demoRepository.deleteAll();
187+
Demo demo1 = new Demo();
188+
demo1.setName("123");
189+
demoRepository.save(demo1);
190+
191+
Demo demo2 = new Demo();
192+
demo2.setName("456");
193+
demoRepository.save(demo2);
194+
195+
List<Integer> ids = Arrays.asList(demo1.getId(), demo2.getId());
196+
System.out.println(ids);
197+
demoRepository.pageSort(PageRequest.of(1, 10), ids);
198+
199+
Demo newDemo1 = demoRepository.getReferenceById(demo1.getId());
200+
Demo newDemo2 = demoRepository.getReferenceById(demo2.getId());
201+
202+
assertEquals(newDemo2.getSort(), 1);
203+
assertEquals(newDemo1.getSort(), 0);
204+
}
205+
206+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import jakarta.persistence.EntityManager;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
8+
@Configuration
9+
public class DynamicConfiguration {
10+
11+
@Bean
12+
public DynamicQuery dynamicQuery(EntityManager entityManager){
13+
return new DynamicQuery(entityManager);
14+
}
15+
16+
@Bean
17+
public DynamicQueryContextRegister dynamicQueryContextRegister(DynamicQuery dynamicQuery){
18+
return new DynamicQueryContextRegister(dynamicQuery);
19+
}
20+
21+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import jakarta.persistence.EntityManager;
4+
import jakarta.persistence.TypedQuery;
5+
import lombok.AllArgsConstructor;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.PageImpl;
8+
import org.springframework.data.domain.PageRequest;
9+
10+
import java.util.List;
11+
12+
@AllArgsConstructor
13+
public class DynamicQuery {
14+
15+
private final EntityManager entityManager;
16+
17+
public List<?> listQuery(Class<?> clazz, String sql, Object... params) {
18+
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
19+
if (params != null) {
20+
for (int i = 0; i < params.length; i++) {
21+
query.setParameter(i + 1, params[i]);
22+
}
23+
}
24+
return query.getResultList();
25+
}
26+
27+
public Page<?> pageQuery(Class<?> clazz, String sql, String countSql, PageRequest pageRequest, Object... params) {
28+
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
29+
if (params != null) {
30+
for (int i = 0; i < params.length; i++) {
31+
query.setParameter(i + 1, params[i]);
32+
}
33+
}
34+
query.setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize());
35+
query.setMaxResults(pageRequest.getPageSize());
36+
return new PageImpl<>(query.getResultList(), pageRequest, countQuery(countSql, params));
37+
}
38+
39+
40+
private long countQuery(String sql, Object... params) {
41+
TypedQuery<Long> query = entityManager.createQuery(sql, Long.class);
42+
if (params != null) {
43+
for (int i = 0; i < params.length; i++) {
44+
query.setParameter(i + 1, params[i]);
45+
}
46+
}
47+
return query.getSingleResult();
48+
}
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
4+
import lombok.Getter;
5+
6+
public class DynamicQueryContext {
7+
8+
@Getter
9+
private static final DynamicQueryContext instance = new DynamicQueryContext();
10+
11+
private DynamicQueryContext() {
12+
13+
}
14+
15+
@Getter
16+
private DynamicQuery dynamicQuery;
17+
18+
void setDynamicQuery(DynamicQuery dynamicQuery) {
19+
this.dynamicQuery = dynamicQuery;
20+
}
21+
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import lombok.AllArgsConstructor;
4+
import org.springframework.beans.factory.InitializingBean;
5+
6+
@AllArgsConstructor
7+
public class DynamicQueryContextRegister implements InitializingBean {
8+
9+
private DynamicQuery dynamicQuery;
10+
11+
@Override
12+
public void afterPropertiesSet() throws Exception {
13+
DynamicQueryContext.getInstance().setDynamicQuery(dynamicQuery);
14+
}
15+
16+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import org.springframework.core.ResolvableType;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.PageRequest;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.repository.NoRepositoryBean;
8+
9+
import java.util.List;
10+
11+
@NoRepositoryBean
12+
public interface DynamicRepository<T, ID> extends JpaRepository<T, ID> {
13+
14+
default Class<?> getEntityClass() {
15+
ResolvableType resolvableType = ResolvableType.forClass(this.getClass()).as(DynamicRepository.class);
16+
return resolvableType.getGeneric(new int[]{0}).resolve();
17+
}
18+
19+
default List<T> dynamicListQuery(String sql, Object... params) {
20+
return (List<T>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(getEntityClass(), sql, params);
21+
}
22+
23+
default <V> List<V> dynamicListQuery(Class<V> clazz, String sql, Object... params) {
24+
return (List<V>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(clazz, sql, params);
25+
}
26+
27+
default Page<T> dynamicPageQuery(String sql, String countSql, PageRequest request, Object... params) {
28+
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, countSql, request, params);
29+
}
30+
31+
default Page<T> dynamicPageQuery(String sql, PageRequest request, Object... params) {
32+
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, "select count(1) " + sql, request, params);
33+
}
34+
35+
default <V> Page<V> dynamicPageQuery(Class<V> clazz, String sql, String countSql, PageRequest request, Object... params) {
36+
return (Page<V>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(clazz, sql, countSql, request, params);
37+
}
38+
39+
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.springboot.fast.query;
22

3+
import com.codingapi.springboot.fast.dynamic.DynamicRepository;
34
import com.codingapi.springboot.framework.dto.request.PageRequest;
45
import jakarta.persistence.criteria.Order;
56
import jakarta.persistence.criteria.Predicate;
@@ -13,7 +14,7 @@
1314
import java.util.List;
1415

1516
@NoRepositoryBean
16-
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
17+
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {
1718

1819
default Page<T> findAll(PageRequest request) {
1920
if (request.hasFilter()) {
@@ -32,7 +33,7 @@ default Class<T> getDomainClass() {
3233
}
3334

3435

35-
default Page<T> findAllByRequest(PageRequest request) {
36+
default Page<T> pageRequest(PageRequest request) {
3637
if (request.hasFilter()) {
3738
Class<T> clazz = getDomainClass();
3839
Specification<T> specification = (root, query, criteriaBuilder) -> {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.codingapi.springboot.fast.sort;
2+
3+
public interface ISort {
4+
5+
Integer getSort();
6+
7+
void setSort(Integer sort);
8+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.codingapi.springboot.fast.sort;
2+
3+
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.repository.NoRepositoryBean;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
@NoRepositoryBean
11+
public interface SortRepository<T extends ISort, ID> extends JpaRepository<T, ID> {
12+
13+
14+
default void pageSort(PageRequest request, List<ID> ids) {
15+
List<T> list = new ArrayList<>();
16+
for (int i = 0; i < ids.size(); i++) {
17+
ISort entity = getReferenceById(ids.get(i));
18+
entity.setSort(i + (request.getPageNumber() * request.getPageSize()));
19+
list.add((T) entity);
20+
}
21+
saveAll(list);
22+
}
23+
24+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
22
com.codingapi.springboot.fast.DataFastConfiguration,\
3-
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
3+
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar,\
4+
com.codingapi.springboot.fast.dynamic.DynamicConfiguration

0 commit comments

Comments
 (0)