Skip to content

Commit d429295

Browse files
committed
refactor(基础模块): 优化对clob的支持
1 parent 4094816 commit d429295

File tree

12 files changed

+281
-158
lines changed

12 files changed

+281
-158
lines changed

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/ValueCodec.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ default E encodeNull(){
1212

1313
D decode(Object data);
1414

15+
default E encodeNull(ColumnMetadata column){
16+
return encodeNull();
17+
}
18+
1519
default E encode(Object value, ColumnMetadata column){
1620
return encode(value);
1721
}

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public Object decode(Object data) {
5858
public Object encode(Object data) {
5959
if (data == null) {
6060
if (valueCodec != null) {
61-
return valueCodec.encodeNull();
61+
return valueCodec.encodeNull(this);
6262
}
6363
return null;
6464
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/ClobValueCodec.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.SneakyThrows;
66
import org.hswebframework.ezorm.core.ValueCodec;
77
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
8+
import org.hswebframework.ezorm.rdb.executor.NullValue;
9+
import org.hswebframework.ezorm.rdb.metadata.DataType;
810
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
911
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1012
import reactor.core.publisher.Flux;
@@ -21,14 +23,29 @@ public class ClobValueCodec implements ValueCodec {
2123

2224
public static final ClobValueCodec INSTANCE = new ClobValueCodec();
2325

26+
static boolean isClobType(DataType type) {
27+
return type.getSqlType() == JDBCType.LONGVARCHAR ||
28+
type.getSqlType() == JDBCType.LONGNVARCHAR ||
29+
type.getSqlType() == JDBCType.CLOB;
30+
}
31+
32+
@Override
33+
public Object encodeNull(ColumnMetadata column) {
34+
if (column instanceof RDBColumnMetadata col) {
35+
if (ClobValueCodec.isClobType(col.getType())) {
36+
return NullValue.of(LongCharSequence.class, col.getType());
37+
}
38+
return NullValue.of(col.getType());
39+
}
40+
return null;
41+
}
42+
2443
@Override
2544
public Object encode(Object value, ColumnMetadata column) {
2645
Object val = this.encode(value);
2746
if (val instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
28-
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
29-
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
30-
col.getType().getSqlType() == JDBCType.CLOB) {
31-
return new ClobValue(cs);
47+
if (ClobValueCodec.isClobType(col.getType())) {
48+
return new LongCharSequence(cs);
3249
}
3350
}
3451
return val;

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/JsonValueCodec.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import lombok.extern.slf4j.Slf4j;
1212
import org.hswebframework.ezorm.core.ValueCodec;
1313
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
14+
import org.hswebframework.ezorm.rdb.executor.NullValue;
1415
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
1516
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1617
import org.reactivestreams.Publisher;
@@ -24,7 +25,6 @@
2425
import java.nio.ByteBuffer;
2526
import java.sql.Blob;
2627
import java.sql.Clob;
27-
import java.sql.JDBCType;
2828
import java.util.Collection;
2929
import java.util.Map;
3030
import java.util.TimeZone;
@@ -104,15 +104,25 @@ public JsonValueCodec(Class<?> targetType, JavaType type) {
104104
this.targetType = targetType;
105105
}
106106

107+
@Override
108+
public Object encodeNull(ColumnMetadata column) {
109+
if (column instanceof RDBColumnMetadata col) {
110+
// clob 类型
111+
if (ClobValueCodec.isClobType(col.getType())) {
112+
return NullValue.of(LongCharSequence.class, col.getType());
113+
}
114+
return NullValue.of(col.getType());
115+
}
116+
return ValueCodec.super.encodeNull(column);
117+
}
118+
107119
@Override
108120
public Object encode(Object value, ColumnMetadata column) {
109121
Object data = encode(value);
110122
if (data instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
111123
// clob 类型
112-
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
113-
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
114-
col.getType().getSqlType() == JDBCType.CLOB) {
115-
return new ClobValue(cs);
124+
if (ClobValueCodec.isClobType(col.getType())) {
125+
return new LongCharSequence(cs);
116126
}
117127
}
118128
return data;

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/ClobValue.java renamed to hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/LongCharSequence.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package org.hswebframework.ezorm.rdb.codec;
22

3-
import org.reactivestreams.Publisher;
43
import reactor.util.annotation.NonNull;
54

6-
import java.io.IOException;
75
import java.io.Reader;
86
import java.io.StringReader;
97
import java.util.stream.IntStream;
108

11-
public class ClobValue implements CharSequence {
9+
public class LongCharSequence implements CharSequence {
1210

1311
private final CharSequence charSequence;
1412

15-
public ClobValue(CharSequence charSequence) {
13+
public LongCharSequence(CharSequence charSequence) {
1614
this.charSequence = charSequence;
1715
}
1816

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/NullValue.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@
88
@Getter
99
@AllArgsConstructor(staticName = "of")
1010
public class NullValue {
11-
@Deprecated
12-
private Class type;
1311

14-
@NonNull
12+
private Class<?> type;
13+
1514
private DataType dataType;
1615

17-
public static NullValue of(DataType dataType){
18-
return of(dataType.getJavaType(),dataType);
16+
public static NullValue of(DataType dataType) {
17+
return of(dataType.getJavaType(), dataType);
18+
}
19+
20+
public Class<?> getType() {
21+
return type == null ? dataType.getJavaType() : type;
1922
}
2023

2124
@Override
2225
public String toString() {
23-
return "null" + (dataType==null?"": (type != null ? "(" + dataType.getId() + ")" : ""));
26+
return "null" + (type != null ? "("+type.getSimpleName()+")" : (dataType != null ? "(" + dataType.getId() + ")" : ""));
2427
}
2528
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/jdbc/JdbcSqlExecutorHelper.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package org.hswebframework.ezorm.rdb.executor.jdbc;
22

33
import lombok.SneakyThrows;
4-
import org.hswebframework.ezorm.rdb.codec.ClobValue;
4+
import org.hswebframework.ezorm.rdb.codec.LongCharSequence;
55
import org.hswebframework.ezorm.rdb.executor.NullValue;
66

7-
import javax.sql.rowset.serial.SerialClob;
87
import java.io.ByteArrayInputStream;
9-
import java.io.CharArrayReader;
8+
import java.io.StringReader;
109
import java.sql.*;
1110
import java.util.ArrayList;
1211
import java.util.Date;
@@ -38,18 +37,22 @@ protected static void preparedStatementParameter(PreparedStatement statement, Ob
3837
for (Object object : parameter) {
3938
if (object == null) {
4039
statement.setNull(index++, Types.NULL);
41-
} else if (object instanceof NullValue) {
42-
statement.setNull(index++, ((NullValue) object).getDataType().getSqlType().getVendorTypeNumber());
40+
} else if (object instanceof NullValue nullValue) {
41+
Class<?> javaType = nullValue.getType();
42+
if (LongCharSequence.class == javaType) {
43+
statement.setCharacterStream(index++, new StringReader(""));
44+
} else {
45+
statement.setNull(index++, nullValue.getDataType().getSqlType().getVendorTypeNumber());
46+
}
4347
} else if (object instanceof Date) {
4448
statement.setTimestamp(index++, new java.sql.Timestamp(((Date) object).getTime()));
4549
} else if (object instanceof byte[] b) {
4650
statement.setBlob(index++, new ByteArrayInputStream(b));
47-
} else if (object instanceof ClobValue cb) {
51+
} else if (object instanceof LongCharSequence cb) {
4852
statement.setCharacterStream(index++, cb.reader());
4953
} else {
5054
statement.setObject(index++, object);
5155
}
52-
5356
}
5457
}
5558

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/reactive/r2dbc/R2dbcReactiveSqlExecutor.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import lombok.Setter;
66
import lombok.extern.slf4j.Slf4j;
77
import org.hswebframework.ezorm.core.CastUtil;
8-
import org.hswebframework.ezorm.rdb.codec.ClobValue;
8+
import org.hswebframework.ezorm.rdb.codec.LongCharSequence;
99
import org.hswebframework.ezorm.rdb.executor.BatchSqlRequest;
1010
import org.hswebframework.ezorm.rdb.executor.DefaultColumnWrapperContext;
1111
import org.hswebframework.ezorm.rdb.executor.NullValue;
@@ -251,11 +251,15 @@ protected Statement prepareStatement(Statement statement, SqlRequest request) {
251251
for (Object parameter : request.getParameters()) {
252252
if (parameter == null) {
253253
bindNull(statement, index, String.class);
254-
} else if (parameter instanceof NullValue) {
255-
bindNull(statement, index, ((NullValue) parameter).getDataType().getJavaType());
254+
} else if (parameter instanceof NullValue nullValue) {
255+
Class<?> javaType = nullValue.getType();
256+
if (javaType == LongCharSequence.class) {
257+
javaType = Clob.class;
258+
}
259+
bindNull(statement, index, javaType);
256260
} else {
257261
// convert clob
258-
if (parameter instanceof ClobValue cb) {
262+
if (parameter instanceof LongCharSequence cb) {
259263
parameter = Clob.from(Mono.just(cb.source()));
260264
}
261265
bind(statement, index, parameter);

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public RDBColumnMetadata clone() {
221221
public Object encode(Object data) {
222222
if (data == null || data instanceof NullValue) {
223223
if (valueCodec != null) {
224-
Object newVal = valueCodec.encodeNull();
224+
Object newVal = valueCodec.encodeNull(this);
225225
if (newVal != null) {
226226
return newVal;
227227
}

0 commit comments

Comments
 (0)