Skip to content

Commit f5d987c

Browse files
committed
有数据字典
1 parent f458f8f commit f5d987c

File tree

7 files changed

+273
-35
lines changed

7 files changed

+273
-35
lines changed

hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/MybatisDaoAutoConfiguration.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
2222
import org.hswebframework.web.dao.Dao;
2323
import org.hswebframework.web.dao.mybatis.mapper.SqlTermCustomer;
24+
import org.hswebframework.web.dao.mybatis.mapper.dict.DictInTermTypeMapper;
25+
import org.hswebframework.web.dao.mybatis.mapper.dict.DictTermTypeMapper;
2426
import org.mybatis.spring.annotation.MapperScan;
2527
import org.springframework.beans.BeansException;
2628
import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -40,6 +42,25 @@
4042
@AutoConfigureAfter(MyBatisAutoConfiguration.class)
4143
@EnableConfigurationProperties(MybatisProperties.class)
4244
public class MybatisDaoAutoConfiguration {
45+
@Bean
46+
public DictTermTypeMapper dictTermTypeMapper() {
47+
return new DictTermTypeMapper(false);
48+
}
49+
50+
@Bean
51+
public DictTermTypeMapper dictNotTermTypeMapper() {
52+
return new DictTermTypeMapper(true);
53+
}
54+
55+
@Bean
56+
public DictInTermTypeMapper dictInTermTypeMapper() {
57+
return new DictInTermTypeMapper(false);
58+
}
59+
60+
@Bean
61+
public DictInTermTypeMapper dictNotInTermTypeMapper() {
62+
return new DictInTermTypeMapper(true);
63+
}
4364

4465
@Bean
4566
public BeanPostProcessor SqlTermCustomerRegister() {

hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/EasyOrmSqlBuilder.java

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apache.ibatis.mapping.ResultMapping;
2525
import org.hswebframework.ezorm.core.ValueConverter;
2626
import org.hswebframework.ezorm.core.param.*;
27-
import org.hswebframework.ezorm.rdb.meta.Correlation;
2827
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
2928
import org.hswebframework.ezorm.rdb.meta.RDBDatabaseMetaData;
3029
import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
@@ -43,23 +42,17 @@
4342
import org.hswebframework.web.commons.entity.Entity;
4443
import org.hswebframework.web.commons.entity.factory.EntityFactory;
4544
import org.hswebframework.web.dao.mybatis.builder.jpa.JpaAnnotationParser;
46-
import org.hswebframework.web.dao.mybatis.mapper.EnumDicTermTypeMapper;
47-
import org.hswebframework.web.dao.mybatis.mapper.h2.H2EnumDicInTermTypeMapper;
48-
import org.hswebframework.web.dao.mybatis.mapper.mysql.MysqlEnumDicInTermTypeMapper;
49-
import org.hswebframework.web.dao.mybatis.mapper.oracle.OracleEnumDicInTermTypeMapper;
5045
import org.hswebframework.web.dao.mybatis.plgins.pager.Pager;
5146
import org.hswebframework.web.dao.mybatis.MybatisUtils;
5247
import org.hswebframework.utils.StringUtils;
5348
import org.hswebframework.web.datasource.DataSourceHolder;
5449
import org.hswebframework.web.datasource.DatabaseType;
55-
import org.hswebframework.web.proxy.Proxy;
5650

5751
import java.sql.JDBCType;
5852
import java.util.*;
5953
import java.util.concurrent.ConcurrentHashMap;
6054
import java.util.concurrent.ConcurrentMap;
6155

62-
import static org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper.supportArray;
6356

6457
/**
6558
* 使用easyorm 动态构建 sql
@@ -103,30 +96,30 @@ private EasyOrmSqlBuilder() {
10396
simpleName.put(short.class, "short");
10497
simpleName.put(char.class, "char");
10598
simpleName.put(byte.class, "byte");
106-
107-
Dialect.MYSQL.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.MYSQL, false)));
108-
Dialect.MYSQL.setTermTypeMapper(TermType.in, supportArray(new MysqlEnumDicInTermTypeMapper(false)));
109-
Dialect.MYSQL.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.MYSQL, true)));
110-
Dialect.MYSQL.setTermTypeMapper(TermType.nin, supportArray(new MysqlEnumDicInTermTypeMapper(true)));
111-
112-
Dialect.MYSQL.setTermTypeMapper("ain", supportArray(new MysqlEnumDicInTermTypeMapper(true, true)));
113-
Dialect.MYSQL.setTermTypeMapper("anin", supportArray(new MysqlEnumDicInTermTypeMapper(false, true)));
114-
115-
116-
Dialect.H2.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.H2, false)));
117-
Dialect.H2.setTermTypeMapper(TermType.in, supportArray(new H2EnumDicInTermTypeMapper(false)));
118-
Dialect.H2.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.H2, true)));
119-
Dialect.H2.setTermTypeMapper(TermType.nin, supportArray(new H2EnumDicInTermTypeMapper(true)));
120-
Dialect.H2.setTermTypeMapper("ain", supportArray(new H2EnumDicInTermTypeMapper(true, true)));
121-
Dialect.H2.setTermTypeMapper("anin", supportArray(new H2EnumDicInTermTypeMapper(false, true)));
122-
123-
124-
Dialect.ORACLE.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, false)));
125-
Dialect.ORACLE.setTermTypeMapper(TermType.in, supportArray(new OracleEnumDicInTermTypeMapper(false)));
126-
Dialect.ORACLE.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, true)));
127-
Dialect.ORACLE.setTermTypeMapper(TermType.nin, supportArray(new OracleEnumDicInTermTypeMapper(true)));
128-
Dialect.ORACLE.setTermTypeMapper("ain", supportArray(new OracleEnumDicInTermTypeMapper(true, true)));
129-
Dialect.ORACLE.setTermTypeMapper("anin", supportArray(new OracleEnumDicInTermTypeMapper(false, true)));
99+
//
100+
// Dialect.MYSQL.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.MYSQL, false)));
101+
// Dialect.MYSQL.setTermTypeMapper(TermType.in, supportArray(new MysqlEnumDicInTermTypeMapper(false)));
102+
// Dialect.MYSQL.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.MYSQL, true)));
103+
// Dialect.MYSQL.setTermTypeMapper(TermType.nin, supportArray(new MysqlEnumDicInTermTypeMapper(true)));
104+
//
105+
// Dialect.MYSQL.setTermTypeMapper("ain", supportArray(new MysqlEnumDicInTermTypeMapper(true, true)));
106+
// Dialect.MYSQL.setTermTypeMapper("anin", supportArray(new MysqlEnumDicInTermTypeMapper(false, true)));
107+
//
108+
//
109+
// Dialect.H2.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.H2, false)));
110+
// Dialect.H2.setTermTypeMapper(TermType.in, supportArray(new H2EnumDicInTermTypeMapper(false)));
111+
// Dialect.H2.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.H2, true)));
112+
// Dialect.H2.setTermTypeMapper(TermType.nin, supportArray(new H2EnumDicInTermTypeMapper(true)));
113+
// Dialect.H2.setTermTypeMapper("ain", supportArray(new H2EnumDicInTermTypeMapper(true, true)));
114+
// Dialect.H2.setTermTypeMapper("anin", supportArray(new H2EnumDicInTermTypeMapper(false, true)));
115+
//
116+
//
117+
// Dialect.ORACLE.setTermTypeMapper(TermType.eq, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, false)));
118+
// Dialect.ORACLE.setTermTypeMapper(TermType.in, supportArray(new OracleEnumDicInTermTypeMapper(false)));
119+
// Dialect.ORACLE.setTermTypeMapper(TermType.not, supportArray(new EnumDicTermTypeMapper(Dialect.ORACLE, true)));
120+
// Dialect.ORACLE.setTermTypeMapper(TermType.nin, supportArray(new OracleEnumDicInTermTypeMapper(true)));
121+
// Dialect.ORACLE.setTermTypeMapper("ain", supportArray(new OracleEnumDicInTermTypeMapper(true, true)));
122+
// Dialect.ORACLE.setTermTypeMapper("anin", supportArray(new OracleEnumDicInTermTypeMapper(false, true)));
130123

131124
}
132125

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package org.hswebframework.web.dao.mybatis.mapper.dict;
2+
3+
import org.hswebframework.ezorm.core.OptionConverter;
4+
import org.hswebframework.ezorm.core.param.Term;
5+
import org.hswebframework.ezorm.core.param.TermType;
6+
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
7+
import org.hswebframework.ezorm.rdb.render.SqlAppender;
8+
import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
9+
import org.hswebframework.ezorm.rdb.render.dialect.RenderPhase;
10+
import org.hswebframework.ezorm.rdb.render.dialect.function.SqlFunction;
11+
import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
12+
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
13+
import org.hswebframework.web.dao.mybatis.mapper.ChangedTermValue;
14+
import org.hswebframework.web.dict.EnumDict;
15+
16+
import java.sql.JDBCType;
17+
import java.util.Arrays;
18+
import java.util.Collections;
19+
import java.util.List;
20+
21+
/**
22+
* @author zhouhao
23+
* @since 3.0.0-RC
24+
*/
25+
public class DictInTermTypeMapper extends AbstractSqlTermCustomer {
26+
27+
private boolean not;
28+
29+
public static final String USE_DICT_MASK_FLAG = "dict-mask";
30+
31+
public DictInTermTypeMapper(boolean not) {
32+
super(not ? TermType.nin : TermType.in);
33+
this.not = not;
34+
}
35+
36+
private boolean support(RDBColumnMetaData column) {
37+
Class type = column.getJavaType();
38+
if (type.isArray()) {
39+
type = type.getComponentType();
40+
}
41+
return ((type.isEnum() && EnumDict.class.isAssignableFrom(type))
42+
||
43+
(column.getProperty(USE_DICT_MASK_FLAG).isTrue() && column.getOptionConverter() != null));
44+
}
45+
46+
@SuppressWarnings("all")
47+
private List<EnumDict> getAllOption(RDBColumnMetaData column) {
48+
Class type = column.getJavaType();
49+
if (null != type) {
50+
if (type.isArray()) {
51+
type = type.getComponentType();
52+
}
53+
if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
54+
return (List) Arrays.asList(type.getEnumConstants());
55+
}
56+
}
57+
58+
OptionConverter converter = column.getOptionConverter();
59+
if (converter == null) {
60+
return Collections.emptyList();
61+
}
62+
63+
return (List) converter.getOptions();
64+
}
65+
66+
@Override
67+
public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
68+
//不支持数据字典
69+
if (!support(column)) {
70+
return buildNotSupport(wherePrefix, term, column, tableAlias);
71+
}
72+
ChangedTermValue changedValue = createChangedTermValue(term);
73+
74+
boolean any = term.getOptions().contains("any");
75+
76+
List<Object> list = BoostTermTypeMapper.convertList(column, changedValue.getOld());
77+
78+
EnumDict[] dicts = getAllOption(column)
79+
.stream()
80+
.filter(d -> d.eq(list))
81+
.toArray(EnumDict[]::new);
82+
83+
changedValue.setValue(EnumDict.toMask(dicts));
84+
Dialect dialect = column.getTableMetaData().getDatabaseMetaData().getDialect();
85+
86+
String columnName = dialect.buildColumnName(tableAlias, column.getName());
87+
String where = "#{" + wherePrefix + ".value.value}";
88+
SqlFunction sqlFunction = dialect.getFunction(SqlFunction.bitand);
89+
90+
if (sqlFunction == null) {
91+
throw new UnsupportedOperationException("数据库不支持[BITAND]函数");
92+
}
93+
String bitAnd = sqlFunction.apply(SqlFunction.Param.of(RenderPhase.where, Arrays.asList(columnName, where)));
94+
95+
String n;
96+
if (any) {
97+
n = not ? "=" : "!=";
98+
} else {
99+
n = not ? "!=" : "=";
100+
}
101+
return new SqlAppender().add(bitAnd, n, any ? "0" : where);
102+
103+
}
104+
105+
protected SqlAppender buildNotSupport(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
106+
ChangedTermValue changedValue = createChangedTermValue(term);
107+
Dialect dialect = column.getTableMetaData().getDatabaseMetaData().getDialect();
108+
109+
List<Object> values = BoostTermTypeMapper.convertList(column, changedValue.getOld());
110+
111+
changedValue.setValue(values);
112+
113+
String columnName = dialect.buildColumnName(tableAlias, column.getName());
114+
SqlAppender appender = new SqlAppender();
115+
appender.add(columnName, not ? " NOT" : " ").add("IN(");
116+
for (int i = 0; i < values.size(); i++) {
117+
appender.add("#{", wherePrefix, ".value.value[", i, "]}", ",");
118+
}
119+
appender.removeLast();
120+
appender.add(")");
121+
return appender;
122+
}
123+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.hswebframework.web.dao.mybatis.mapper.dict;
2+
3+
import org.hswebframework.ezorm.core.OptionConverter;
4+
import org.hswebframework.ezorm.core.param.Term;
5+
import org.hswebframework.ezorm.core.param.TermType;
6+
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
7+
import org.hswebframework.ezorm.rdb.render.SqlAppender;
8+
import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
9+
import org.hswebframework.ezorm.rdb.render.dialect.RenderPhase;
10+
import org.hswebframework.ezorm.rdb.render.dialect.function.SqlFunction;
11+
import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
12+
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
13+
import org.hswebframework.web.dao.mybatis.mapper.ChangedTermValue;
14+
import org.hswebframework.web.dict.EnumDict;
15+
16+
import java.sql.JDBCType;
17+
import java.util.Arrays;
18+
import java.util.Collections;
19+
import java.util.List;
20+
21+
import static org.hswebframework.web.dao.mybatis.mapper.dict.DictInTermTypeMapper.USE_DICT_MASK_FLAG;
22+
23+
/**
24+
* @author zhouhao
25+
* @since 3.0.0-RC
26+
*/
27+
public class DictTermTypeMapper extends AbstractSqlTermCustomer {
28+
29+
private boolean not;
30+
31+
public DictTermTypeMapper(boolean not) {
32+
super(not ? TermType.not : TermType.eq);
33+
this.not = not;
34+
}
35+
36+
private boolean support(RDBColumnMetaData column) {
37+
Class type = column.getJavaType();
38+
if (type.isArray()) {
39+
type = type.getComponentType();
40+
}
41+
return ((type.isEnum() && EnumDict.class.isAssignableFrom(type))
42+
||
43+
(column.getProperty(USE_DICT_MASK_FLAG).isTrue() && column.getOptionConverter() != null));
44+
}
45+
46+
@SuppressWarnings("all")
47+
private List<EnumDict> getAllOption(RDBColumnMetaData column) {
48+
Class type = column.getJavaType();
49+
if (null != type) {
50+
if (type.isArray()) {
51+
type = type.getComponentType();
52+
}
53+
if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
54+
return (List) Arrays.asList(type.getEnumConstants());
55+
}
56+
}
57+
58+
OptionConverter converter = column.getOptionConverter();
59+
if (converter == null) {
60+
return Collections.emptyList();
61+
}
62+
63+
return (List) converter.getOptions();
64+
}
65+
66+
@Override
67+
public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
68+
//不支持数据字典
69+
if (!support(column)) {
70+
return buildNotSupport(wherePrefix, term, column, tableAlias);
71+
}
72+
ChangedTermValue changedValue = createChangedTermValue(term);
73+
74+
List<Object> list = BoostTermTypeMapper.convertList(column, changedValue.getOld());
75+
76+
EnumDict[] dicts = getAllOption(column)
77+
.stream()
78+
.filter(d -> d.eq(list))
79+
.toArray(EnumDict[]::new);
80+
81+
changedValue.setValue(EnumDict.toMask(dicts));
82+
Dialect dialect = column.getTableMetaData().getDatabaseMetaData().getDialect();
83+
String columnName = dialect.buildColumnName(tableAlias, column.getName());
84+
return new SqlAppender().add(columnName, not ? " != " : "=", "#{", wherePrefix, ".value.value}");
85+
}
86+
87+
protected SqlAppender buildNotSupport(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
88+
createChangedTermValue(term);
89+
Dialect dialect = column.getTableMetaData().getDatabaseMetaData().getDialect();
90+
String columnName = dialect.buildColumnName(tableAlias, column.getName());
91+
SqlAppender appender = new SqlAppender();
92+
appender.add(columnName, not ? " != " : "=", "#{", wherePrefix, ".value.value}");
93+
return appender;
94+
}
95+
}

hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/test/java/org/hswebframework/web/dao/crud/TestCrud.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.hswebframework.ezorm.core.param.QueryParam;
55
import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
66
import org.hswebframework.web.commons.entity.param.QueryParamEntity;
7+
import org.hswebframework.web.dict.EnumDict;
78
import org.junit.Assert;
89
import org.junit.Before;
910
import org.junit.Test;
@@ -66,7 +67,7 @@ public void testInsert() {
6667

6768
QueryParamEntity query = new QueryParamEntity();
6869
//any in
69-
query.where("dataTypes", Arrays.asList(DataType.TYPE3, DataType.TYPE1));
70+
query.where("dataTypes$in$any", Arrays.asList(DataType.TYPE1, DataType.TYPE3,DataType.TYPE2));
7071
query.includes("nest.name", "*");
7172
List<TestEntity> entities = testDao.queryNest(query);
7273

@@ -75,4 +76,5 @@ public void testInsert() {
7576
System.out.println(entities);
7677
}
7778

79+
7880
}

hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ static <T extends EnumDict> List<T> getByMask(List<T> allOptions, long mask) {
189189
return arr;
190190
}
191191

192-
static <T extends EnumDict> List<T> getByMask(Supplier<List<T>> allOptionsSuppiler, long mask) {
193-
return getByMask(allOptionsSuppiler.get(), mask);
192+
static <T extends EnumDict> List<T> getByMask(Supplier<List<T>> allOptionsSupplier, long mask) {
193+
return getByMask(allOptionsSupplier.get(), mask);
194194
}
195195

196196

hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-api/src/main/java/org/hswebframework/web/entity/form/DictConfig.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import lombok.Getter;
44
import lombok.Setter;
5+
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
56
import org.hswebframework.web.commons.bean.Bean;
67
import org.hswebframework.web.commons.entity.Entity;
78

89
import java.io.Serializable;
10+
import java.util.HashMap;
911
import java.util.Map;
1012

1113
/**
@@ -22,6 +24,8 @@ public class DictConfig implements Bean {
2224

2325
private String toField;
2426

25-
private Map<String,Object> config;
27+
private Map<String, Object> config=new HashMap<>();
28+
29+
private RDBColumnMetaData column;
2630

2731
}

0 commit comments

Comments
 (0)