Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 175d285

Browse files
[bug] 新增mybatis jdbcTemplate 支持
1 parent 91b304e commit 175d285

File tree

5 files changed

+203
-4
lines changed

5 files changed

+203
-4
lines changed

‎jdbc-mybatis/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111
<artifactId>jdbc-mybatis</artifactId>
12-
<version>2.5.0.1</version>
12+
<version>2.5.1</version>
1313
<dependencies>
1414
<dependency>
1515
<groupId>com.vonchange.common</groupId>

‎jdbc-mybatis/src/main/java/com/vonchange/jdbc/core/CrudClient.java‎ renamed to ‎jdbc-mybatis/src/main/java/com/vonchange/jdbc/client/CrudClient.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.vonchange.jdbc.core;/*
1+
package com.vonchange.jdbc.client;/*
22
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,8 +15,8 @@
1515
*/
1616

1717

18-
import com.vonchange.jdbc.client.JdbcClient;
1918
import com.vonchange.jdbc.config.ConstantJdbc;
19+
import com.vonchange.jdbc.core.DefaultCrudClient;
2020
import com.vonchange.jdbc.mapper.AbstractPageWork;
2121
import com.vonchange.jdbc.model.DataSourceWrapper;
2222
import com.vonchange.mybatis.dialect.MySQLDialect;

‎jdbc-mybatis/src/main/java/com/vonchange/jdbc/core/DefaultCrudClient.java‎

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

33
import com.vonchange.common.util.ConvertUtil;
44
import com.vonchange.common.util.StringPool;
5+
import com.vonchange.jdbc.client.CrudClient;
56
import com.vonchange.jdbc.client.JdbcClient;
67
import com.vonchange.jdbc.config.ConstantJdbc;
78
import com.vonchange.jdbc.config.EnumRWType;
@@ -29,7 +30,7 @@
2930
import java.util.Map;
3031
import java.util.concurrent.ConcurrentHashMap;
3132

32-
public class DefaultCrudClient implements CrudClient{
33+
public class DefaultCrudClient implements CrudClient{
3334
private static final Logger log = LoggerFactory.getLogger(DefaultCrudClient.class);
3435
private final MyJdbcTemplate classicOps;
3536
private final DataSourceWrapper dataSourceWrapper;
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.vonchange.jdbc.mybatis;
2+
3+
import com.vonchange.common.util.StringPool;
4+
import com.vonchange.jdbc.model.SqlParam;
5+
import com.vonchange.jdbc.util.JdbcUtil;
6+
import com.vonchange.jdbc.util.MybatisTpl;
7+
import com.vonchange.mybatis.dialect.Dialect;
8+
import org.springframework.jdbc.core.JdbcOperations;
9+
import org.springframework.jdbc.core.PreparedStatementCreator;
10+
import org.springframework.jdbc.core.PreparedStatementCreatorFactory;
11+
import org.springframework.jdbc.core.SqlParameter;
12+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
13+
import org.springframework.jdbc.core.namedparam.NamedParameterUtils;
14+
import org.springframework.jdbc.core.namedparam.ParsedSql;
15+
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
16+
import org.springframework.jdbc.support.JdbcUtils;
17+
import org.springframework.lang.Nullable;
18+
19+
import javax.sql.DataSource;
20+
import java.sql.DatabaseMetaData;
21+
import java.sql.SQLException;
22+
import java.util.ArrayList;
23+
import java.util.Collection;
24+
import java.util.HashMap;
25+
import java.util.List;
26+
import java.util.Locale;
27+
import java.util.Map;
28+
import java.util.function.Consumer;
29+
30+
public abstract class MybatisJdbcTemplate extends NamedParameterJdbcTemplate {
31+
public MybatisJdbcTemplate(DataSource dataSource) {
32+
super(dataSource);
33+
DatabaseMetaData metaData = null;
34+
try {
35+
metaData = dataSource.getConnection().getMetaData();
36+
String name = metaData.getDatabaseProductName().toLowerCase(Locale.ENGLISH);
37+
//h2
38+
System.out.println("XXXX::"+name);
39+
} catch (SQLException e) {
40+
throw new RuntimeException(e);
41+
}
42+
}
43+
44+
public MybatisJdbcTemplate(JdbcOperations classicJdbcTemplate) {
45+
super(classicJdbcTemplate);
46+
}
47+
48+
protected PreparedStatementCreator getPreparedStatementCreator(String sql, SqlParameterSource paramSource,
49+
@Nullable Consumer<PreparedStatementCreatorFactory> customizer) {
50+
Map<String,Object> param =toMap(paramSource);
51+
SqlParam sqlParam = genSqlParam(sql,param);
52+
if(null==sqlParam){
53+
return getPreparedStatementCreatorOriginal(sql,paramSource,customizer);
54+
}
55+
List<SqlParameter> declaredParameters = buildSqlParameterList(sqlParam.getParams());
56+
PreparedStatementCreatorFactory pscf = new PreparedStatementCreatorFactory(sqlParam.getSql(),declaredParameters);
57+
if (customizer != null) {
58+
customizer.accept(pscf);
59+
}
60+
Object[] paramObj=sqlParam.getParams().toArray();
61+
return pscf.newPreparedStatementCreator(paramObj);
62+
}
63+
protected PreparedStatementCreator getPreparedStatementCreatorOriginal(String sql, SqlParameterSource paramSource,
64+
@Nullable Consumer<PreparedStatementCreatorFactory> customizer) {
65+
66+
ParsedSql parsedSql = getParsedSql(sql);
67+
PreparedStatementCreatorFactory pscf = getPreparedStatementCreatorFactory(parsedSql, paramSource);
68+
if (customizer != null) {
69+
customizer.accept(pscf);
70+
}
71+
Object[] params = NamedParameterUtils.buildValueArray(parsedSql, paramSource, null);
72+
return pscf.newPreparedStatementCreator(params);
73+
}
74+
protected abstract Dialect dialect();
75+
private SqlParam genSqlParam(String sql,Map<String,Object> param){
76+
if(!sql.contains(StringPool.SPACE)){
77+
return MybatisTpl.generate("sql."+sql,param,dialect());
78+
}
79+
if(sql.contains("[@")){//#{ spel 也有的 ||sql.contains("#{"
80+
return MybatisTpl.generate(sql,sql,param,dialect());
81+
}
82+
if(sql.contains("#{")){
83+
if(!sql.contains(":#{")){
84+
return MybatisTpl.generate(sql,sql,param,dialect());
85+
}
86+
}
87+
return null;
88+
}
89+
public static List<SqlParameter> buildSqlParameterList(Collection<?> param) {
90+
List<SqlParameter> params = new ArrayList<>(param.size());
91+
for (Object value : param) {
92+
if(null==value){
93+
params.add(new SqlParameter(JdbcUtils.TYPE_UNKNOWN));
94+
continue;
95+
}
96+
params.add(new SqlParameter(JdbcUtil.sqlTypeFor(value.getClass())));
97+
}
98+
return params;
99+
}
100+
public static List<SqlParameter> buildSqlParameterListX(SqlParameterSource paramSource) {
101+
String[] paramNames = paramSource.getParameterNames();
102+
if (paramNames == null) {
103+
return new ArrayList<>();
104+
}
105+
List<SqlParameter> params = new ArrayList<>(paramNames.length);
106+
for (String paramName : paramNames) {
107+
params.add(new SqlParameter(
108+
paramName, paramSource.getSqlType(paramName), paramSource.getTypeName(paramName)));
109+
}
110+
return params;
111+
}
112+
113+
private Map<String,Object> toMap( SqlParameterSource paramSource){
114+
String[] parameterNames = paramSource.getParameterNames();
115+
Map<String,Object> map = new HashMap<>();
116+
if(null==parameterNames){
117+
return map;
118+
}
119+
for (String paramName : parameterNames) {
120+
map.put(paramName,paramSource.getValue(paramName));
121+
}
122+
return map;
123+
}
124+
125+
126+
127+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright 2017-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.vonchange.jdbc.util;
17+
18+
19+
import org.springframework.jdbc.support.JdbcUtils;
20+
21+
import java.math.BigDecimal;
22+
import java.math.BigInteger;
23+
import java.sql.Date;
24+
import java.sql.Time;
25+
import java.sql.Timestamp;
26+
import java.sql.Types;
27+
import java.util.HashMap;
28+
import java.util.Map;
29+
30+
/**
31+
* Contains methods dealing with the quirks of JDBC, independent of any Entity, Aggregate or Repository abstraction.
32+
*
33+
* @author Jens Schauder
34+
*/
35+
public class JdbcUtil {
36+
37+
private static final Map<Class<?>, Integer> sqlTypeMappings = new HashMap<>();
38+
39+
static {
40+
41+
sqlTypeMappings.put(String.class, Types.VARCHAR);
42+
sqlTypeMappings.put(BigInteger.class, Types.BIGINT);
43+
sqlTypeMappings.put(BigDecimal.class, Types.NUMERIC);
44+
sqlTypeMappings.put(Byte.class, Types.TINYINT);
45+
sqlTypeMappings.put(byte.class, Types.TINYINT);
46+
sqlTypeMappings.put(Short.class, Types.SMALLINT);
47+
sqlTypeMappings.put(short.class, Types.SMALLINT);
48+
sqlTypeMappings.put(Integer.class, Types.INTEGER);
49+
sqlTypeMappings.put(int.class, Types.INTEGER);
50+
sqlTypeMappings.put(Long.class, Types.BIGINT);
51+
sqlTypeMappings.put(long.class, Types.BIGINT);
52+
sqlTypeMappings.put(Double.class, Types.DOUBLE);
53+
sqlTypeMappings.put(double.class, Types.DOUBLE);
54+
sqlTypeMappings.put(Float.class, Types.REAL);
55+
sqlTypeMappings.put(float.class, Types.REAL);
56+
sqlTypeMappings.put(Boolean.class, Types.BIT);
57+
sqlTypeMappings.put(boolean.class, Types.BIT);
58+
sqlTypeMappings.put(byte[].class, Types.VARBINARY);
59+
sqlTypeMappings.put(Date.class, Types.DATE);
60+
sqlTypeMappings.put(Time.class, Types.TIME);
61+
sqlTypeMappings.put(Timestamp.class, Types.TIMESTAMP);
62+
}
63+
64+
public static int sqlTypeFor(Class<?> type) {
65+
return sqlTypeMappings.keySet().stream() //
66+
.filter(k -> k.isAssignableFrom(type)) //
67+
.findFirst() //
68+
.map(sqlTypeMappings::get) //
69+
.orElse(JdbcUtils.TYPE_UNKNOWN);
70+
}
71+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /