feat: add highgo support, and fix bugs

This commit is contained in:
2025-03-28 22:09:49 +08:00
parent 583b5864d5
commit dd60a99f45
10 changed files with 242 additions and 102 deletions

View File

@@ -42,8 +42,11 @@ public interface TableMapper {
List<Map<String, Object>> getListNoPage(@Param("typeName") String tableName, @Param("info") Map<String, Object> map);
Object getSequence(@Param("tableName") String tableName);
Object getHighGoSequence(@Param("tableName") String tableName);
boolean judgeHighGoSequenceExist(@Param("tableName") String tableName);
boolean judgeDamengSequenceExist(@Param("tableName") String tableName);
int createSequence(@Param("tableName") String tableName, @Param("lastId")Object lastId);
int createHighGoSequence(@Param("tableName") String tableName, @Param("lastId")Object lastId);
Long count(@Param("tableName")String tableName,@Param("sql")String sql);

View File

@@ -13,7 +13,7 @@ import java.util.Map;
public interface BaseMapper {
<E> int save(DataMap<E> dataMap);
String getDataConfig();
int save(String tableName, String pkName, Map<String, Object> data);
<E> int save(E e);

View File

@@ -39,7 +39,7 @@ public class BaseMapperImpl implements BaseMapper {
}
@Override
public <E> int save(DataMap<E> dataMap) {
public String getDataConfig() {
String key;
DatasourceConfig datasourceConfig = new DatasourceConfig();
try {
@@ -62,13 +62,22 @@ public class BaseMapperImpl implements BaseMapper {
datasourceConfig.setCommonType(DataUnit.HANGO);
}
}
return datasourceConfig.getCommonType();
}
@Override
public <E> int save(DataMap<E> dataMap) {
String dataType = getDataConfig();
JudgesNull(dataMap.getData(), "data can not be null!");
JudgesNull(dataMap.getTableName(), "tableName can not be null!");
if(DataUnit.HANGO.equals(dataType)){
dataMap.setData(formatMap(dataMap.getData()));
}
if (StringUtils.isEmpty(dataMap.getPkName())) {
dataMap.setPkName("ID");
}
int i;
if (DataUnit.ORACLE.equals(datasourceConfig.getCommonType()) || DataUnit.DAMENG.equals(datasourceConfig.getCommonType()) || DataUnit.HANGO.equals(datasourceConfig.getCommonType())) {
if (DataUnit.ORACLE.equals(dataType) || DataUnit.DAMENG.equals(dataType) || DataUnit.HANGO.equals(dataType)) {
if (org.springframework.util.StringUtils.isEmpty(dataMap.get(dataMap.getPkName()))) {
Object id = getSequence(dataMap.getTableName(), dataMap.getPkName());
dataMap.toBuilder().add(dataMap.getPkName(), id);
@@ -85,38 +94,37 @@ public class BaseMapperImpl implements BaseMapper {
return i;
}
private String formatTable(String tableName) {
return "`"+tableName+"`";
public Map<String, Object> formatMap(Map<String, Object> data){
// 遍历 Map 并转换值
for (Map.Entry<String, Object> entry : data.entrySet()) {
Object value = entry.getValue();
if (value instanceof String) {
String strValue = (String) value;
if (strValue.matches("-?\\d+")) { // 匹配整数
data.put(entry.getKey(), Long.parseLong(strValue));
} else if (strValue.matches("-?\\d*\\.\\d+")) { // 匹配浮点数
data.put(entry.getKey(), (long) Double.parseDouble(strValue));
}
} else if (value instanceof Number) {
data.put(entry.getKey(), ((Number) value).longValue());
}
}
return data;
}
@Override
public int save(String tableName, String pkName, Map<String, Object> data) {
JudgesNull(tableName, "data can not be null!");
JudgesNull(data, "tableName can not be null!");
tableName = formatTable(tableName);
String key;
DatasourceConfig datasourceConfig = new DatasourceConfig();
try {
key = DBContextHolder.getDataSource();
datasourceConfig = DataSourceUtil.get(key);
} catch (Exception e) {
if (dataType.contains("oracle")) {
datasourceConfig.setCommonType(DataUnit.ORACLE);
}
if (dataType.contains("mysql")) {
datasourceConfig.setCommonType(DataUnit.MYSQL);
}
if (dataType.contains("DmDriver")) {
datasourceConfig.setCommonType(DataUnit.DAMENG);
}
if (dataType.contains("sqlite")) {
datasourceConfig.setCommonType(DataUnit.SQLITE);
}
String dataType = getDataConfig();
if(DataUnit.HANGO.equals(dataType)){
data = formatMap(data);
}
if (StringUtils.isEmpty(pkName)) {
pkName = "ID";
}
int i;
if (datasourceConfig.getCommonType().equals(DataUnit.ORACLE) || datasourceConfig.getCommonType().equals(DataUnit.DAMENG)) {
if (DataUnit.ORACLE.equals(dataType) || DataUnit.DAMENG.equals(dataType) || DataUnit.HANGO.equals(dataType)) {
if (org.springframework.util.StringUtils.isEmpty(data.get(pkName))) {
data.put(pkName, getSequence(tableName, pkName));
}
@@ -139,9 +147,8 @@ public class BaseMapperImpl implements BaseMapper {
private int updateByWhere(Condition condition, String tableName, Map<String, Object> data) {
Map<String, Object> params = condition.getParamMap();
tableName = formatTable(tableName);
params.put("tableName", tableName);
params.put("info", data);
params.put("info", formatMap(data));
params.put("sql", condition.getSql());
int i = sqlSessionTemplate.update(TABLE_MAPPER_PACKAGE + "updateByWhere", params);
return i;
@@ -252,7 +259,6 @@ public class BaseMapperImpl implements BaseMapper {
private int deleteByWhere(Condition condition, String tableName) {
Map<String, Object> params = condition.getParamMap();
tableName = formatTable(tableName);
params.put("tableName", tableName);
params.put("sql", condition.getSql());
return sqlSessionTemplate.delete(TABLE_MAPPER_PACKAGE + "deleteByWhere", params);
@@ -339,7 +345,6 @@ public class BaseMapperImpl implements BaseMapper {
@Override
public List<Map<String, Object>> selectAll(String tableName) {
JudgesNull(tableName, "tableName can not be null!");
tableName = formatTable(tableName);
return tableMapper.useSql(SelectCondition.builder().tableName(tableName).build().getSql());
}
@@ -579,7 +584,6 @@ public class BaseMapperImpl implements BaseMapper {
}
@Override
public List<Map<String, Object>> selectJoinByCondition(String tableName, List<JoinCondition> joinCondition, Condition condition) {
JudgesNull(tableName, "tableName can not be null!");
@@ -775,7 +779,22 @@ public class BaseMapperImpl implements BaseMapper {
}
public Object getSequence(String tableName, String pkName) {
String dataType = getDataConfig();
Object id;
if (DataUnit.HANGO.equals(dataType)) {
if (!tableMapper.judgeHighGoSequenceExist(tableName.toLowerCase())) {
MyPageHelper.noCount(WebPageInfo.builder().pageNum(1).pageSize(1).order(WebPageInfo.DESC).sortField(pkName).build());
DataMap<Object> dataMap = DataMap.builder().tableName(tableName).pkName(pkName).fields(pkName).build();
Condition condition = Condition.creatCriteria(dataMap).build();
Map<String, Object> map = selectOneByCondition(condition);
if (map == null) {
tableMapper.createHighGoSequence(tableName, 1);
} else {
tableMapper.createHighGoSequence(tableName, map.get(pkName));
}
}
id = tableMapper.getHighGoSequence(tableName);
} else {
try {
id = tableMapper.getSequence(tableName);
} catch (Exception e) {
@@ -790,6 +809,7 @@ public class BaseMapperImpl implements BaseMapper {
}
id = tableMapper.getSequence(tableName);
}
}
return Long.parseLong(id.toString()) + 1L;
}
}

View File

@@ -240,6 +240,18 @@ public class Condition implements Serializable {
this.selecSql = selectCondition.getSql();
}
private Object formatValue(Object value) {
if(value instanceof String) {
String str = (String)value;
if (str.matches("-?\\d+")) { // 匹配整数
return Long.parseLong(str);
} else if (str.matches("-?\\d*\\.\\d+")) { // 匹配浮点数
return Double.parseDouble(str);
}
}
return value;
}
public ConditionBuilder(String sql, Map<String, Object> paramMap) {
this.sql = sql;
this.paramMap = paramMap;
@@ -273,8 +285,8 @@ public class Condition implements Serializable {
value = value.toString().replaceAll("\"", "");
}
String sqlKey = "item_" + IdUtil.fastUUID();
this.conditionSql += " `" + key +"` "+ EQUAL + "#{" + sqlKey + "}";
this.paramMap.put(sqlKey, value);
this.conditionSql += " " + key + EQUAL + "#{" + sqlKey + "}";
this.paramMap.put(sqlKey, formatValue(value));
return this;
}
@@ -289,8 +301,12 @@ public class Condition implements Serializable {
}
public ConditionBuilder like(String key, Object value) {
sqlCheckLike(value);
this.conditionSql += " `" + key +"` "+ " " + LIKE + " '" + value + "'";
if (value.toString().contains("\"")) {
value = value.toString().replaceAll("\"", "");
}
String sqlKey = "item_" + IdUtil.fastUUID();
this.conditionSql += " " + key + " " + LIKE + " CONCAT('%',#{" + sqlKey + "},'%')";
this.paramMap.put(sqlKey, formatValue(value));
return this;
}
@@ -310,7 +326,7 @@ public class Condition implements Serializable {
int i = 1;
for (Object object : value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, object);
this.paramMap.put(sqlKey, formatValue(object));
inStr.append("#{").append(sqlKey).append("}");
if (i != value.size()) {
inStr.append(",");
@@ -318,7 +334,7 @@ public class Condition implements Serializable {
i++;
}
inStr.append(R_CURVES);
this.conditionSql += " `" + key +"` "+ " " + IN + " " + inStr.toString();
this.conditionSql += " " + key + " " + IN + " " + inStr.toString();
return this;
}
@@ -335,9 +351,9 @@ public class Condition implements Serializable {
public ConditionBuilder between(String key, Object start, Object end) {
String sqlKey = "item_" + IdUtil.fastUUID();
String sqlKey2 = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, start);
this.paramMap.put(sqlKey2, end);
this.conditionSql += " `" + key +"` "+ " " + BETWEEN + " #{" + sqlKey + "} " + AND + " #{" + sqlKey2 + "} ";
this.paramMap.put(sqlKey, formatValue(start));
this.paramMap.put(sqlKey2, formatValue(end));
this.conditionSql += " " + key + " " + BETWEEN + " #{" + sqlKey + "} " + AND + " #{" + sqlKey2 + "} ";
return this;
}
@@ -353,8 +369,8 @@ public class Condition implements Serializable {
public ConditionBuilder lt(String key, Object value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, value);
this.conditionSql += " `" + key +"` "+ " " + LT + " #{" + sqlKey + "} ";
this.paramMap.put(sqlKey, formatValue(value));
this.conditionSql += " " + key + " " + LT + " #{" + sqlKey + "} ";
return this;
}
@@ -375,8 +391,8 @@ public class Condition implements Serializable {
public ConditionBuilder notEqual(String key, Object value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, value);
this.conditionSql += " `" + key +"` "+ " " + NOT_EQUAL + " #{" + sqlKey + "} ";
this.paramMap.put(sqlKey, formatValue(value));
this.conditionSql += " " + key + " " + NOT_EQUAL + " #{" + sqlKey + "} ";
return this;
}
@@ -392,8 +408,8 @@ public class Condition implements Serializable {
public ConditionBuilder gt(String key, Object value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, value);
this.conditionSql += " `" + key +"` "+ " " + GT + " #{" + sqlKey + "} ";
this.paramMap.put(sqlKey, formatValue(value));
this.conditionSql += " " + key + " " + GT + " #{" + sqlKey + "} ";
return this;
}
@@ -409,8 +425,8 @@ public class Condition implements Serializable {
public ConditionBuilder lte(String key, Object value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, value);
this.conditionSql += " `" + key +"` "+ " " + LTE + " #{" + value.toString() + "} ";
this.paramMap.put(sqlKey, formatValue(value));
this.conditionSql += " " + key + " " + LTE + " #{" + value.toString() + "} ";
return this;
}
@@ -426,8 +442,8 @@ public class Condition implements Serializable {
public ConditionBuilder gte(String key, Object value) {
String sqlKey = "item_" + IdUtil.fastUUID();
this.paramMap.put(sqlKey, value);
this.conditionSql += " `" + key +"` "+ " " + GTE + " #{" + value.toString() + "} ";
this.paramMap.put(sqlKey, formatValue(value));
this.conditionSql += " " + key + " " + GTE + " #{" + value.toString() + "} ";
return this;
}

View File

@@ -0,0 +1,26 @@
package com.taixingyiji.base.module.data.module;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tk.mybatis.mapper.autoconfigure.ConfigurationCustomizer;
/**
* @className MyBatisConfig
* @author lhc
* @date 2025年03月28日 19:43
* @description 描述
* @version 1.0
*/
@Configuration
public class MyBatisConfig {
@Value("${mybatis.enable-highgo}")
private boolean customObjectWrapperEnabled;
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
if (customObjectWrapperEnabled) {
configuration.setObjectWrapperFactory(new UpperCaseMapWrapperFactory());
}
};
}
}

View File

@@ -113,7 +113,7 @@ public class SelectCondition implements Serializable {
}
public SelectBuilder tableName(String tableName) {
this.tableName = "`"+tableName+"`";
this.tableName = tableName;
return this;
}

View File

@@ -0,0 +1,24 @@
package com.taixingyiji.base.module.data.module;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.MapWrapper;
import java.util.Map;
/**
* @author lhc
* @version 1.0
* @className UpperCaseMapWrapper
* @date 2025年03月28日 19:41
* @description 描述
*/
public class UpperCaseMapWrapper extends MapWrapper {
public UpperCaseMapWrapper(MetaObject metaObject, Map<String, Object> map) {
super(metaObject, map);
}
@Override
public String findProperty(String name, boolean useCamelCaseMapping) {
return name==null?"":name.toUpperCase() ;
}
}

View File

@@ -0,0 +1,26 @@
package com.taixingyiji.base.module.data.module;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import java.util.Map;
/**
* @author lhc
* @version 1.0
* @className UpperCaseMapWrapperFactory
* @date 2025年03月28日 19:40
* @description 描述
*/
public class UpperCaseMapWrapperFactory implements ObjectWrapperFactory {
@Override
public boolean hasWrapperFor(Object object) {
return object instanceof Map;
}
@Override
public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
return new UpperCaseMapWrapper(metaObject, (Map) object);
}
}

View File

@@ -156,7 +156,7 @@ public class ShiroServiceImpl implements ShiroService {
public FtToken findByToken(String accessToken) {
FtToken osToken = new FtToken();
// osToken.setToken(accessToken);
Condition condition = Condition.creatCriteria().equal("TOKEN", accessToken).build();
Condition condition = Condition.creatCriteria().andEqual("TOKEN", accessToken).build();
Map<String, Object> map = baseMapper.selectOneByCondition("FT_TOKEN", condition);
osToken.setToken((String) map.get("TOKEN"));
osToken.setTokenId((String) map.get("TOKEN_ID"));

View File

@@ -157,6 +157,9 @@
select ${tableName}_seq.nextval
from dual
</select>
<select id="getHighGoSequence" resultType="java.lang.Object">
select ${tableName}_seq.nextval
</select>
<insert id="createSequence">
CREATE
SEQUENCE ${tableName}_seq
@@ -167,6 +170,28 @@
INCREMENT BY 1
NOCACHE
</insert>
<insert id="createHighGoSequence">
CREATE SEQUENCE ${tableName}_seq
MINVALUE 1
NO MAXVALUE
START WITH ${lastId}
INCREMENT BY 1
CACHE 1;
</insert>
<select id="judgeHighGoSequenceExist" resultType="boolean">
SELECT EXISTS (
SELECT 1
FROM pg_class
WHERE relkind = 'S'
AND relname = '${tableName}_seq'
AND pg_table_is_visible(oid)
);
</select>
<select id="judgeDamengSequenceExist" resultType="boolean">
SELECT COUNT(*)
FROM SYSOBJECTS
WHERE NAME = '${tableName}_seq' AND SUBTYPE$ = 'SEQUENCE';
</select>
<select id="count" resultType="java.lang.Long">
SELECT count(0) FROM ${tableName} ${sql}
</select>