diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/NameToTypeEnum.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/DbTypeEnum.java index fe6e998..9ea0916 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/NameToTypeEnum.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/DbTypeEnum.java @@ -7,61 +7,67 @@ import lombok.Getter; import java.util.Arrays; import java.util.Map; +import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; -// TODO @dhb52:是不是把 FindInSetEnum、NameToTypeEnum 融合,搞成 DbTypeEnum?然后里面 type、productName,findInSet -/** - * 数据库产品名 => mp DbType 的映射关系 - * - * @author dhb52 - */ + @Getter @AllArgsConstructor -public enum NameToTypeEnum { - +public enum DbTypeEnum { /** * MySQL */ - MY_SQL("MySQL", DbType.MYSQL), + MY_SQL("MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.MYSQL), /** * Oracle */ - ORACLE("Oracle", DbType.ORACLE), + ORACLE("Oracle", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.ORACLE), /** * PostgreSQL */ - POSTGRE_SQL("PostgreSQL", DbType.POSTGRE_SQL), + POSTGRE_SQL("PostgreSQL", "POSITION('#{value}' IN #{column}) <> 0", DbType.POSTGRE_SQL), /** * SQL Server */ - SQL_SERVER("Microsoft SQL Server", DbType.SQL_SERVER), + SQL_SERVER("Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0", DbType.SQL_SERVER), /** * 达梦 */ - DM("DM DBMS", DbType.DM), + DM("DM DBMS", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.DM), /** * 人大金仓 */ - KINGBASE_ES("KingbaseES", DbType.KINGBASE_ES), + KINGBASE_ES("KingbaseES", "POSITION('#{value}' IN #{column}) <> 0", DbType.KINGBASE_ES), - // 华为openGauss ProductName 与 PostgreSQL相同 + // 华为openGauss 使用ProductName 与 PostgreSQL相同 ; - private final String name; - private final DbType type; + public static final Map MAP_BY_NAME = Arrays.stream(values()) + .collect(Collectors.toMap(DbTypeEnum::getName, Function.identity())); + + public static final Map MAP_BY_MP = Arrays.stream(values()) + .collect(Collectors.toMap(DbTypeEnum::getMpDbType, Function.identity())); - public static final Map MAPS = Arrays.stream(values()) - .collect(Collectors.toMap(NameToTypeEnum::getName, NameToTypeEnum::getType)); + + private final String name; + private final String findInSetTemplate; + private final DbType mpDbType; public static DbType find(String databaseProductName) { if (StrUtil.isBlank(databaseProductName)) { return null; } - return MAPS.get(databaseProductName); + return MAP_BY_NAME.get(databaseProductName).getMpDbType(); + } + + public static String getFindInSetTemplate(DbType dbType) { + return Optional.of(MAP_BY_MP.get(dbType).getFindInSetTemplate()) + .orElseThrow(() -> new IllegalArgumentException("FIND_IN_SET not supported")); } -} \ No newline at end of file +} diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/FindInSetEnum.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/FindInSetEnum.java deleted file mode 100644 index 298d0dd..0000000 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/FindInSetEnum.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.framework.mybatis.core.enums; - - -import com.baomidou.mybatisplus.annotation.DbType; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * find_in_set函数的跨数据库实现 - * - * @author dhb52 - */ -@Getter -@AllArgsConstructor -public enum FindInSetEnum { - - // FIND_IN_SET: MySQL 类型 - MYSQL("FIND_IN_SET('#{value}', #{column}) <> 0", DbType.MYSQL), - DM("FIND_IN_SET('#{value}', #{column}) <> 0", DbType.DM), - - // INSTR: Oracle 类型 - ORACLE("INSTR(','||#{column}||',' , ',#{value},') <> 0", DbType.ORACLE), - - // CHARINDEX: SQLServer - SQLSERVER("CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',')", DbType.SQL_SERVER), - - // POSITION: PostgreSQL 类型 - POSTGRE_SQL("POSITION('#{value}' IN #{column})", DbType.POSTGRE_SQL), - KINGBASE_ES("POSITION('#{value}' IN #{column})", DbType.KINGBASE_ES), - - // LOCATE: 其他 - H2("LOCATE('#{value}' IN #{column})", DbType.H2), - ; - - public static final Map MAPS = Arrays.stream(values()) - .collect(Collectors.toMap(FindInSetEnum::getDbType, FindInSetEnum::getSqlTemplate)); - - private String sqlTemplate; - private DbType dbType; - - public static String getTemplate(DbType dbType) { - return Optional.of(MAPS.get(dbType)) - .orElseThrow(() -> new IllegalArgumentException("FIND_IN_SET not supported")); - } -} diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java index c7e9e89..c4894ca 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.mybatis.core.util; import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; -import cn.iocoder.yudao.framework.mybatis.core.enums.NameToTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.mybatisplus.annotation.DbType; @@ -52,7 +52,7 @@ public class JdbcUtils { DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class); DataSource dataSource = dynamicRoutingDataSource.determineDataSource(); try (Connection conn = dataSource.getConnection()) { - return NameToTypeEnum.find(conn.getMetaData().getDatabaseProductName()); + return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName()); } catch (SQLException e) { throw new IllegalArgumentException(e.getMessage()); } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java index 789bf75..384b49d 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.SortingField; -import cn.iocoder.yudao.framework.mybatis.core.enums.FindInSetEnum; +import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.StringPool; @@ -98,7 +98,7 @@ public class MyBatisUtils { public static String findInSet(String column, Object value) { // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型 DbType dbType = JdbcUtils.getDbType(); - return FindInSetEnum.getTemplate(dbType) + return DbTypeEnum.getFindInSetTemplate(dbType) .replace("#{column}", column) .replace("#{value}", StrUtil.toString(value)); }