Skip to content

Commit 9434829

Browse files
committed
[new] name query
1 parent c17ec34 commit 9434829

File tree

6 files changed

+66
-24
lines changed

6 files changed

+66
-24
lines changed

README.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* SQL is written in Markdown
1414

1515

16-
[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md)
16+
[UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md)[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md)
1717

1818
```sql
1919
-- findUserByIds
@@ -30,13 +30,7 @@ SELECT [@id column] FROM user_base
3030
### extend CrudJdbcRepository not CrudRepository,because [curd-repository.md](curd-repository.md)
3131
### not support @Query or QueryDSL, sql must be written in markdown
3232
### batch update
33-
> need rewriteBatchedStatements=true&allowMultiQueries=true
34-
```java
35-
public interface UserInfoRepository extends CrudJdbcRepository<UserInfoDO, Long> {
36-
@BatchUpdate
37-
int batchUpdate(List<UserInfoDO> list);
38-
}
39-
```
33+
4034
### [multi-datasource.md](multi-datasource.md)
4135

4236
## Getting Started with JDBC mybatis

README.zh-CN.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
* 扩展简易动态sql写法 [easy-dynamic-sql.md](easy-dynamic-sql.md)
1919

20-
[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md)
20+
[UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md)[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md)
2121

2222
```sql
2323
-- findUserByIds
@@ -30,6 +30,7 @@ SELECT [@id column] FROM user_base
3030
</where>
3131
```
3232
## 特性
33+
### 支持按方法名查询 但不推荐过度使用 [method-name-query.md](method-name-query.md)
3334
### crud 继成 CrudJdbcRepository 不是CrudRepository 因为需要新增和去掉部分方法
3435
### 不提供@Query或QueryDSL,sql统一写在markdown文件里面
3536
### 批量更新

jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/NameQueryUtil.java

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
1717

18+
import java.util.ArrayList;
19+
import java.util.Collection;
1820
import java.util.HashMap;
21+
import java.util.List;
1922
import java.util.Map;
2023
import java.util.stream.Collectors;
2124

@@ -141,6 +144,10 @@ public static SqlWithParam nameSql(String method,Class<?> entityType, Map<String
141144
int index =0;
142145
SplitMap lastSplit =new SplitMap("",EnumStep.Column);
143146
int i=0;
147+
List<Object> objectList= new ArrayList<>();
148+
for (Map.Entry<String, Object> entry : parameter.entrySet()) {
149+
objectList.add(entry.getValue());
150+
}
144151
while (i<splits.length) {
145152
StringBuilder stringBuilder=new StringBuilder(splits[i]);
146153
String sqlSplit=null;
@@ -168,40 +175,60 @@ public static SqlWithParam nameSql(String method,Class<?> entityType, Map<String
168175
if(null!=sqlSplit){
169176
EnumStep thisStep= columnsMap.get(mapKey).getEnumStep();
170177
if(thisStep.equals(EnumStep.Join)||thisStep.equals(EnumStep.End)){
171-
index=genMybatisSql(lastSplit,sql,index);
178+
index=genMybatisSql(lastSplit,sql,index,objectList.get(index));
172179
index++;
173180
}
174181
sql.append(sqlSplit).append(StringPool.SPACE);
175182
lastSplit= columnsMap.get(mapKey);
176183
}
177184
}
178185
if(lastSplit.getEnumStep().equals(EnumStep.Column)||lastSplit.getEnumStep().equals(EnumStep.Condition)){
179-
genMybatisSql(lastSplit,sql,index);
186+
genMybatisSql(lastSplit,sql,index,objectList.get(index));
180187
}
181-
Map<String,Object> newParam= new HashMap<>();
182-
int k=0;
183-
for (Map.Entry<String, Object> entry : parameter.entrySet()) {
184-
newParam.put(ParamPre+k,entry.getValue());
185-
k++;
188+
SqlWithParam sqlWithParam = new SqlWithParam();
189+
sqlWithParam.setSql(sql.toString());
190+
List<Object> newParams= new ArrayList<>();
191+
for (Object value : objectList) {
192+
if (value instanceof Collection) {
193+
Collection collection= (Collection) value;
194+
newParams.addAll(collection);
195+
}else{
196+
newParams.add(value);
197+
}
186198
}
199+
sqlWithParam.setParams(newParams.toArray());
187200
log.debug("gen sql {}",sql);
188-
return MybatisTpl.generate(method,sql.toString(),newParam);
201+
return sqlWithParam;
189202
}
190203

191-
private static int genMybatisSql(SplitMap lastSplit, StringBuilder sql, int index){
204+
private static int genMybatisSql(SplitMap lastSplit, StringBuilder sql, int index,Object value){
192205
String split =lastSplit.getSplit();
193206
if(lastSplit.getEnumStep().equals(EnumStep.Column)){
194207
sql.append(" = ");
195208
}
196209
if(split.equals("in")||split.equals("not in")){
197-
sql.append(UtilAll.UString.format("<foreach collection=\"{}\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">#{item}</foreach> ",ParamPre+index));
210+
if (!(value instanceof Collection||value.getClass().isArray())){
211+
throw new JdbcMybatisRuntimeException("in query parameter must collection or array");
212+
}
213+
StringBuilder inSb=new StringBuilder("(");
214+
if (value instanceof Collection) {
215+
for (Object o : (Collection<?>) value) {
216+
inSb.append("?,");
217+
}
218+
}
219+
if (value.getClass().isArray()) {
220+
for (Object o : (Object[]) value) {
221+
inSb.append("?,");
222+
}
223+
}
224+
sql.append(inSb.substring(0,inSb.length()-1)).append(")");
198225
return index;
199226
}
200227
if(split.equals("between")){
201-
sql.append(UtilAll.UString.format("#{{}} and #{{}} ",ParamPre+index,ParamPre+(index+1)));
228+
sql.append("? and ? ");
202229
return index+1;
203230
}
204-
sql.append(UtilAll.UString.format("#{{}} ",ParamPre+index));
231+
sql.append("? ");
205232
return index;
206233

207234
}

method-name-query.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
## method name query
2+
3+
| keyword | sample | SQL |
4+
|:--------|:--------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
5+
| And | findByLastnameAndFirstname | ... where lastname = ? and firstname = ? |
6+
| Or | findByLastnameOrFirstname | ... where lastname = ? or firstname = ? |
7+
| Is, Eq | findByLastnameEq/findByLastname | … where lastname = ? |
8+
| not | findByLastnameNot | … where lastname != ? |
9+
| Between | findByStartDateBetween | … where startDate between ? and ? |
10+
| Lt | findByStartDateLt | … where startDate > ? |
11+
| Lte | findByStartDateLte | … where startDate >= ? |
12+
| Gt | findByStartDateGr | … where startDate > ? |
13+
| Gte | findByStartDateGte | … where startDate >= ? |
14+
| After | findByStartDateAfter | … where startDate > ? |
15+
| Before | findByStartDateBefore | … where startDate < ? |
16+
| Like | findByFirstnameLike | … where firstname like ? |
17+
| NotLike | findByFirstnameNotLike | … where firstname not like ? |
18+
| OrderBy | findByAgeOrderByLastnameDesc | … where age = ? order by lastname desc |
19+
| in | findByAgeIn | … where age in (?,?) |
20+
| NotIn | findByAgeNotIn | … where age not in (?,?) |

spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoMethodDaoTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ class UserInfoMethodDaoTest {
4242
public void methodSql() {
4343
SqlWithParam sqlWithParam = NameQueryUtil.nameSql(
4444
"findListByUserCodeIn",UserInfoDO.class,new MyHashMap()
45-
.set("233",0).set("2",9));
45+
.set("111",new String[]{"233","333"}).set("2",9));
4646
if(null!=sqlWithParam){
47-
log.info("\nnameSql {}", JsonUtil.toJson(sqlWithParam.getSql()));
47+
log.info("\nnameSql {}", sqlWithParam.getSql());
4848
}
4949
}
5050
@Test

spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void findByUserCodes() {
5454

5555
@Test
5656
public void findUserNameByCode() {
57-
String sqlDialect=System.getenv("SQL_DIALECT");
57+
String sqlDialect=System.getenv("ID_END");
5858
log.info("XXX:: "+sqlDialect);
5959
String userName = userInfoRepository.findUserNameByCode("u000");
6060
log.info("\n userName {}",userName);

0 commit comments

Comments
 (0)