Skip to content

Commit ac75bb8

Browse files
committed
add SQLBuilder
1 parent 5fcb38e commit ac75bb8

File tree

11 files changed

+167
-25
lines changed

11 files changed

+167
-25
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>com.codingapi.springboot</groupId>
1414
<artifactId>springboot-parent</artifactId>
15-
<version>2.9.4</version>
15+
<version>2.9.5</version>
1616

1717
<url>https://github.com/codingapi/springboot-framewrok</url>
1818
<name>springboot-parent</name>

springboot-starter-data-fast/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>2.9.4</version>
8+
<version>2.9.5</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jdbc/JdbcQuery.java

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.springboot.fast.jdbc;
22

3+
import com.codingapi.springboot.fast.jpa.SQLBuilder;
34
import org.apache.commons.text.CaseUtils;
45
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.PageImpl;
@@ -37,34 +38,50 @@ public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException
3738
}
3839
}
3940

40-
public List<Map<String, Object>> queryForList(String sql, Object... params) {
41+
public List<Map<String, Object>> queryForMapList(SQLBuilder builder) {
42+
return queryForMapList(builder.getSQL(), builder.getParams());
43+
}
44+
45+
public List<Map<String, Object>> queryForMapList(String sql, Object... params) {
4146
return jdbcTemplate.query(sql, params, new CamelCaseRowMapper());
4247
}
4348

49+
public <T> List<T> queryForList(SQLBuilder builder) {
50+
return (List<T>) queryForList(builder.getSQL(), builder.getClazz(), builder.getParams());
51+
}
52+
4453
public <T> List<T> queryForList(String sql, Class<T> clazz, Object... params) {
4554
return jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<>(clazz));
4655
}
4756

57+
public <T> Page<T> queryForPage(SQLBuilder builder, PageRequest pageRequest) {
58+
return (Page<T>)queryForPage(builder.getSQL(), builder.getCountSQL(), builder.getClazz(), pageRequest, builder.getParams());
59+
}
60+
4861
public <T> Page<T> queryForPage(String sql, String countSql, Class<T> clazz, PageRequest pageRequest, Object... params) {
4962
List<T> list = jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<>(clazz));
5063
long count = this.countQuery(countSql, params);
5164
return new PageImpl<>(list, pageRequest, count);
5265
}
5366

5467
public <T> Page<T> queryForPage(String sql, Class<T> clazz, PageRequest pageRequest, Object... params) {
55-
String countSql = "select count(1) "+sql;
68+
String countSql = "select count(1) " + sql;
5669
return this.queryForPage(sql, countSql, clazz, pageRequest, params);
5770
}
5871

59-
public Page<Map<String, Object>> queryForPage(String sql, String countSql, PageRequest pageRequest, Object... params) {
72+
public Page<Map<String, Object>> queryForMapPage(SQLBuilder builder, PageRequest pageRequest) {
73+
return queryForMapPage(builder.getSQL(), builder.getCountSQL(), pageRequest, builder.getParams());
74+
}
75+
76+
public Page<Map<String, Object>> queryForMapPage(String sql, String countSql, PageRequest pageRequest, Object... params) {
6077
List<Map<String, Object>> list = jdbcTemplate.query(sql, params, new CamelCaseRowMapper());
6178
long count = this.countQuery(countSql, params);
6279
return new PageImpl<>(list, pageRequest, count);
6380
}
6481

65-
public Page<Map<String, Object>> queryForPage(String sql, PageRequest pageRequest, Object... params) {
66-
String countSql = "select count(1) "+sql;
67-
return this.queryForPage(sql, countSql, pageRequest, params);
82+
public Page<Map<String, Object>> queryForMapPage(String sql, PageRequest pageRequest, Object... params) {
83+
String countSql = "select count(1) " + sql;
84+
return this.queryForMapPage(sql, countSql, pageRequest, params);
6885
}
6986

7087

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/JPAQuery.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package com.codingapi.springboot.fast.jpa;
22

3-
import javax.persistence.EntityManager;
4-
import javax.persistence.TypedQuery;
53
import lombok.AllArgsConstructor;
64
import org.springframework.data.domain.Page;
75
import org.springframework.data.domain.PageImpl;
86
import org.springframework.data.domain.PageRequest;
97

8+
import javax.persistence.EntityManager;
9+
import javax.persistence.TypedQuery;
1010
import java.util.List;
1111

1212
@AllArgsConstructor
1313
public class JPAQuery {
1414

1515
private final EntityManager entityManager;
1616

17+
public List<?> listQuery(SQLBuilder builder) {
18+
return listQuery(builder.getClazz(),builder.getSQL(),builder.getParams());
19+
}
20+
1721
public List<?> listQuery(Class<?> clazz, String sql, Object... params) {
1822
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
1923
if (params != null) {
@@ -24,6 +28,11 @@ public List<?> listQuery(Class<?> clazz, String sql, Object... params) {
2428
return query.getResultList();
2529
}
2630

31+
public Page<?> pageQuery(SQLBuilder builder,PageRequest pageRequest) {
32+
return pageQuery(builder.getClazz(), builder.getSQL(), builder.getCountSQL(),pageRequest,builder.getParams());
33+
}
34+
35+
2736
public Page<?> pageQuery(Class<?> clazz, String sql, PageRequest pageRequest, Object... params) {
2837
return pageQuery(clazz,sql,"select count(1) " + sql,pageRequest,params);
2938
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.codingapi.springboot.fast.jpa;
2+
3+
import lombok.Getter;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class SQLBuilder {
9+
10+
private final StringBuilder sqlBuilder;
11+
private final StringBuilder countSQLBuilder;
12+
private int index;
13+
private final List<Object> params;
14+
@Getter
15+
private final Class<?> clazz;
16+
17+
public SQLBuilder(String sql) {
18+
this(null, sql, "select count(1) from " + sql);
19+
}
20+
21+
public SQLBuilder(Class<?> clazz, String sql) {
22+
this(clazz, sql, "select count(1) from " + sql);
23+
}
24+
25+
public SQLBuilder(Class<?> clazz, String sql, String countSQL) {
26+
this.countSQLBuilder = new StringBuilder(countSQL);
27+
this.sqlBuilder = new StringBuilder(sql);
28+
this.index = 1;
29+
this.params = new ArrayList<>();
30+
this.clazz = clazz;
31+
}
32+
33+
public void append(String sql, Object value) {
34+
if (value != null) {
35+
sqlBuilder.append(" ").append(sql).append(index).append(" ");
36+
countSQLBuilder.append(" ").append(sql).append(index).append(" ");
37+
params.add(value);
38+
index++;
39+
}
40+
}
41+
42+
public String getSQL() {
43+
return sqlBuilder.toString();
44+
}
45+
46+
public String getCountSQL() {
47+
return countSQLBuilder.toString();
48+
}
49+
50+
public Object[] getParams() {
51+
return params.toArray();
52+
}
53+
54+
55+
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicNativeRepository.java

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.codingapi.springboot.fast.jpa.repository;
22

33
import com.codingapi.springboot.fast.jdbc.JdbcQueryContext;
4+
import com.codingapi.springboot.fast.jpa.SQLBuilder;
45
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.PageRequest;
67
import org.springframework.data.repository.NoRepositoryBean;
@@ -11,8 +12,12 @@
1112
@NoRepositoryBean
1213
public interface DynamicNativeRepository<T, ID> extends BaseRepository<T, ID> {
1314

15+
default List<Map<String, Object>> dynamicNativeListMapQuery(SQLBuilder builder) {
16+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForMapList(builder);
17+
}
18+
1419
default List<Map<String, Object>> dynamicNativeListMapQuery(String sql, Object... params) {
15-
return JdbcQueryContext.getInstance().getJdbcQuery().queryForList(sql, params);
20+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForMapList(sql, params);
1621
}
1722

1823
default List<T> dynamicNativeListQuery(String sql, Object... params) {
@@ -23,6 +28,10 @@ default <V> List<V> dynamicNativeListQuery(Class<V> clazz, String sql, Object...
2328
return JdbcQueryContext.getInstance().getJdbcQuery().queryForList(sql, clazz, params);
2429
}
2530

31+
default <V> List<V> dynamicNativeListQuery(SQLBuilder sqlBuilder) {
32+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForList(sqlBuilder);
33+
}
34+
2635
default Page<T> dynamicNativePageQuery(String sql, String countSql, PageRequest request, Object... params) {
2736
return dynamicNativePageQuery(getEntityClass(), sql, countSql, request, params);
2837
}
@@ -39,12 +48,20 @@ default <V> Page<V> dynamicNativePageQuery(Class<V> clazz, String sql, PageReque
3948
return JdbcQueryContext.getInstance().getJdbcQuery().queryForPage(sql, clazz, request, params);
4049
}
4150

42-
default Page<Map<String, Object>> dynamicNativePageMapQuery(String sql, String countSql, PageRequest request, Object... params) {
43-
return JdbcQueryContext.getInstance().getJdbcQuery().queryForPage(sql, countSql, request, params);
51+
default <V> Page<V> dynamicNativePageQuery(SQLBuilder sqlBuilder, PageRequest request) {
52+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForPage(sqlBuilder, request);
53+
}
54+
55+
default Page<Map<String, Object>> dynamicNativeMapPageMapQuery(SQLBuilder sqlBuilder,PageRequest request) {
56+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForMapPage(sqlBuilder,request);
57+
}
58+
59+
default Page<Map<String, Object>> dynamicNativeMapPageMapQuery(String sql, String countSql, PageRequest request, Object... params) {
60+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForMapPage(sql, countSql, request, params);
4461
}
4562

46-
default Page<Map<String, Object>> dynamicNativePageMapQuery(String sql, PageRequest request, Object... params) {
47-
return JdbcQueryContext.getInstance().getJdbcQuery().queryForPage(sql, request, params);
63+
default Page<Map<String, Object>> dynamicNativeMapPageMapQuery(String sql, PageRequest request, Object... params) {
64+
return JdbcQueryContext.getInstance().getJdbcQuery().queryForMapPage(sql, request, params);
4865
}
4966

5067
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRepository.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.codingapi.springboot.fast.jpa.repository;
22

33
import com.codingapi.springboot.fast.jpa.JpaQueryContext;
4+
import com.codingapi.springboot.fast.jpa.SQLBuilder;
45
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.PageRequest;
67
import org.springframework.data.repository.NoRepositoryBean;
@@ -11,6 +12,10 @@
1112
@SuppressWarnings("unchecked")
1213
public interface DynamicRepository<T, ID> extends BaseRepository<T, ID> {
1314

15+
default List<T> dynamicListQuery(SQLBuilder builder) {
16+
return (List<T>) JpaQueryContext.getInstance().getJPAQuery().listQuery(builder);
17+
}
18+
1419
default List<T> dynamicListQuery(String sql, Object... params) {
1520
return (List<T>) JpaQueryContext.getInstance().getJPAQuery().listQuery(getEntityClass(), sql, params);
1621
}
@@ -19,12 +24,16 @@ default <V> List<V> dynamicListQuery(Class<V> clazz, String sql, Object... param
1924
return (List<V>) JpaQueryContext.getInstance().getJPAQuery().listQuery(clazz, sql, params);
2025
}
2126

27+
default Page<T> dynamicPageQuery(SQLBuilder builder, PageRequest request) {
28+
return (Page<T>) JpaQueryContext.getInstance().getJPAQuery().pageQuery(builder, request);
29+
}
30+
2231
default Page<T> dynamicPageQuery(String sql, String countSql, PageRequest request, Object... params) {
2332
return (Page<T>) JpaQueryContext.getInstance().getJPAQuery().pageQuery(getEntityClass(), sql, countSql, request, params);
2433
}
2534

2635
default Page<T> dynamicPageQuery(String sql, PageRequest request, Object... params) {
27-
return (Page<T>) JpaQueryContext.getInstance().getJPAQuery().pageQuery(getEntityClass(), sql, request, params);
36+
return (Page<T>) JpaQueryContext.getInstance().getJPAQuery().pageQuery(getEntityClass(), sql, request, params);
2837
}
2938

3039
default <V> Page<V> dynamicPageQuery(Class<V> clazz, String sql, String countSql, PageRequest request, Object... params) {

springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java

+41-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.codingapi.springboot.fast;
22

33
import com.codingapi.springboot.fast.entity.Demo;
4+
import com.codingapi.springboot.fast.jpa.SQLBuilder;
45
import com.codingapi.springboot.fast.repository.DemoRepository;
56
import com.codingapi.springboot.framework.dto.request.Filter;
67
import com.codingapi.springboot.framework.dto.request.PageRequest;
@@ -47,7 +48,7 @@ void findAll() {
4748
demoRepository.save(demo2);
4849

4950
PageRequest request = new PageRequest();
50-
request.setCurrent(0);
51+
request.setCurrent(1);
5152
request.setPageSize(10);
5253
request.addFilter("name", "123");
5354

@@ -68,7 +69,7 @@ void pageRequest() {
6869
demoRepository.save(demo2);
6970

7071
PageRequest request = new PageRequest();
71-
request.setCurrent(0);
72+
request.setCurrent(1);
7273
request.setPageSize(10);
7374
request.addFilter("name", Relation.LIKE, "%2%");
7475

@@ -89,7 +90,7 @@ void customInSearch() {
8990
demoRepository.save(demo2);
9091

9192
PageRequest request = new PageRequest();
92-
request.setCurrent(0);
93+
request.setCurrent(1);
9394
request.setPageSize(10);
9495

9596
request.addFilter("id", Relation.IN, 1, 2, 3);
@@ -116,7 +117,12 @@ void customOrSearch() {
116117
request.setPageSize(10);
117118

118119

119-
request.orFilters(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123"));
120+
// request.andFilter(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123"));
121+
request.addFilter("name", "456").orFilters(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123"));
122+
123+
request.addSort(Sort.by("id").descending());
124+
125+
120126

121127
Page<Demo> page = demoRepository.pageRequest(request);
122128
log.info("demo:{}", page.getContent());
@@ -134,7 +140,32 @@ void dynamicListQuery() {
134140
demo2.setName("456");
135141
demoRepository.save(demo2);
136142

137-
List<Demo> list = demoRepository.dynamicListQuery("from Demo where name = ?1", "123");
143+
SQLBuilder builder = new SQLBuilder(Demo.class,"from Demo where 1=1");
144+
String search = "12";
145+
builder.append("and name like ?","%"+search+"%");
146+
147+
List<Demo> list = demoRepository.dynamicListQuery(builder);
148+
assertEquals(1, list.size());
149+
}
150+
151+
152+
153+
@Test
154+
void dynamicNativeListQuery() {
155+
demoRepository.deleteAll();
156+
Demo demo1 = new Demo();
157+
demo1.setName("123");
158+
demoRepository.save(demo1);
159+
160+
Demo demo2 = new Demo();
161+
demo2.setName("456");
162+
demoRepository.save(demo2);
163+
164+
SQLBuilder builder = new SQLBuilder(Demo.class,"select * from t_demo where 1=1");
165+
String search = "12";
166+
builder.append("and name like ?","%"+search+"%");
167+
168+
List<Demo> list = demoRepository.dynamicNativeListQuery(builder);
138169
assertEquals(1, list.size());
139170
}
140171

@@ -150,7 +181,11 @@ void dynamicPageQuery() {
150181
demo2.setName("456");
151182
demoRepository.save(demo2);
152183

153-
Page<Demo> page = demoRepository.dynamicPageQuery("from Demo where name = ?1", PageRequest.of(1, 2), "123");
184+
SQLBuilder builder = new SQLBuilder(Demo.class,"select d from Demo d where 1=1","select count(1) from Demo d where 1=1");
185+
String search = "12";
186+
builder.append("and d.name like ?","%"+search+"%");
187+
188+
Page<Demo> page = demoRepository.dynamicPageQuery(builder,PageRequest.of(1, 2));
154189
assertEquals(1, page.getTotalElements());
155190
}
156191

springboot-starter-flow/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.9.4</version>
9+
<version>2.9.5</version>
1010
</parent>
1111

1212
<name>springboot-starter-flow</name>

springboot-starter-security/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.9.4</version>
9+
<version>2.9.5</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-security</artifactId>

springboot-starter/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.codingapi.springboot</groupId>
77
<artifactId>springboot-parent</artifactId>
8-
<version>2.9.4</version>
8+
<version>2.9.5</version>
99
</parent>
1010
<artifactId>springboot-starter</artifactId>
1111

0 commit comments

Comments
 (0)