Pre Merge pull request !495 from AprilWind/dev

This commit is contained in:
AprilWind 2024-03-14 08:49:38 +00:00 committed by Gitee
commit 400385f482
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

View File

@ -2,11 +2,11 @@ package org.dromara.common.mybatis.helper;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.mybatis.enums.DataBaseType; import org.dromara.common.mybatis.enums.DataBaseType;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
@ -14,7 +14,6 @@ import java.sql.DatabaseMetaData;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 数据库助手 * 数据库助手
@ -56,19 +55,38 @@ public class DataBaseHelper {
return DataBaseType.SQL_SERVER == getDataBaseType(); return DataBaseType.SQL_SERVER == getDataBaseType();
} }
/**
* 根据数据库类型生成用于判断值是否存在于以逗号分隔的字符串中的查询条件
*
* @param var1 要判断的值
* @param var2 逗号分隔的字符串
* @return 生成的查询条件字符串
*/
public static String findInSet(Object var1, String var2) { public static String findInSet(Object var1, String var2) {
DataBaseType dataBasyType = getDataBaseType(); DataBaseType dataBasyType = getDataBaseType();
String var = Convert.toStr(var1); String var = Convert.toStr(var1);
if (dataBasyType == DataBaseType.SQL_SERVER) { if (dataBasyType == DataBaseType.SQL_SERVER) {
// 对于 SQL Server 数据库使用 CHARINDEX 函数来判断
// CHARINDEX 函数用于查找一个字符串在另一个字符串中的位置
// 这里的查询条件表示查找 var1 是否存在于以逗号分隔的字符串 var2
// charindex(',100,' , ',0,100,101,') <> 0 // charindex(',100,' , ',0,100,101,') <> 0
return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2); return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2);
} else if (dataBasyType == DataBaseType.POSTGRE_SQL) { } else if (dataBasyType == DataBaseType.POSTGRE_SQL) {
// 对于 PostgreSQL 数据库使用 POSITION 函数来判断
// POSITION 函数用于在一个字符串中查找另一个字符串并返回其位置
// 这里的查询条件表示查找 var1 是否存在于以逗号分隔的字符串 var2
// (select position(',100,' in ',0,100,101,')) <> 0 // (select position(',100,' in ',0,100,101,')) <> 0
return "(select position(',%s,' in ','||%s||',')) <> 0".formatted(var, var2); return "(select position(',%s,' in ','||%s||',')) <> 0".formatted(var, var2);
} else if (dataBasyType == DataBaseType.ORACLE) { } else if (dataBasyType == DataBaseType.ORACLE) {
// 对于 Oracle 数据库使用 INSTR 函数来判断
// INSTR 函数用于在一个字符串中查找另一个字符串并返回其位置
// 这里的查询条件表示查找 var1 是否存在于以逗号分隔的字符串 var2
// instr(',0,100,101,' , ',100,') <> 0 // instr(',0,100,101,' , ',100,') <> 0
return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var);
} }
// 默认情况下假设是 MySQL使用 FIND_IN_SET 函数来判断
// FIND_IN_SET 函数用于在一个以逗号分隔的字符串中查找一个值并返回其位置
// 这里的查询条件表示查找 var1 是否存在于以逗号分隔的字符串 var2
// find_in_set(100 , '0,100,101') // find_in_set(100 , '0,100,101')
return "find_in_set('%s' , %s) <> 0".formatted(var, var2); return "find_in_set('%s' , %s) <> 0".formatted(var, var2);
} }