mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	feat: FindInSetEnum、NameToTypeEnum 融合为DbTypeEnum
This commit is contained in:
		| @@ -0,0 +1,73 @@ | ||||
| package cn.iocoder.yudao.framework.mybatis.core.enums; | ||||
|  | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| 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.function.Function; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
|  | ||||
| @Getter | ||||
| @AllArgsConstructor | ||||
| public enum DbTypeEnum { | ||||
|     /** | ||||
|      * MySQL | ||||
|      */ | ||||
|     MY_SQL("MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.MYSQL), | ||||
|  | ||||
|     /** | ||||
|      * Oracle | ||||
|      */ | ||||
|     ORACLE("Oracle", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.ORACLE), | ||||
|  | ||||
|     /** | ||||
|      * PostgreSQL | ||||
|      */ | ||||
|     POSTGRE_SQL("PostgreSQL", "POSITION('#{value}' IN #{column}) <> 0", DbType.POSTGRE_SQL), | ||||
|  | ||||
|     /** | ||||
|      * SQL Server | ||||
|      */ | ||||
|     SQL_SERVER("Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0", DbType.SQL_SERVER), | ||||
|  | ||||
|     /** | ||||
|      * 达梦 | ||||
|      */ | ||||
|     DM("DM DBMS", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.DM), | ||||
|  | ||||
|     /** | ||||
|      * 人大金仓 | ||||
|      */ | ||||
|     KINGBASE_ES("KingbaseES", "POSITION('#{value}' IN #{column}) <> 0", DbType.KINGBASE_ES), | ||||
|  | ||||
|     // 华为openGauss 使用ProductName 与 PostgreSQL相同 | ||||
|     ; | ||||
|  | ||||
|     public static final Map<String, DbTypeEnum> MAP_BY_NAME = Arrays.stream(values()) | ||||
|             .collect(Collectors.toMap(DbTypeEnum::getName, Function.identity())); | ||||
|  | ||||
|     public static final Map<DbType, DbTypeEnum> MAP_BY_MP = Arrays.stream(values()) | ||||
|             .collect(Collectors.toMap(DbTypeEnum::getMpDbType, Function.identity())); | ||||
|  | ||||
|  | ||||
|     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 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")); | ||||
|     } | ||||
| } | ||||
| @@ -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<DbType, String> 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")); | ||||
|     } | ||||
| } | ||||
| @@ -1,67 +0,0 @@ | ||||
| package cn.iocoder.yudao.framework.mybatis.core.enums; | ||||
|  | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import com.baomidou.mybatisplus.annotation.DbType; | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Getter; | ||||
|  | ||||
| import java.util.Arrays; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| // TODO @dhb52:是不是把 FindInSetEnum、NameToTypeEnum 融合,搞成 DbTypeEnum?然后里面 type、productName,findInSet | ||||
| /** | ||||
|  * 数据库产品名 => mp DbType 的映射关系 | ||||
|  * | ||||
|  * @author dhb52 | ||||
|  */ | ||||
| @Getter | ||||
| @AllArgsConstructor | ||||
| public enum NameToTypeEnum { | ||||
|  | ||||
|     /** | ||||
|      * MySQL | ||||
|      */ | ||||
|     MY_SQL("MySQL", DbType.MYSQL), | ||||
|  | ||||
|     /** | ||||
|      * Oracle | ||||
|      */ | ||||
|     ORACLE("Oracle", DbType.ORACLE), | ||||
|  | ||||
|     /** | ||||
|      * PostgreSQL | ||||
|      */ | ||||
|     POSTGRE_SQL("PostgreSQL", DbType.POSTGRE_SQL), | ||||
|  | ||||
|     /** | ||||
|      * SQL Server | ||||
|      */ | ||||
|     SQL_SERVER("Microsoft SQL Server", DbType.SQL_SERVER), | ||||
|  | ||||
|     /** | ||||
|      * 达梦 | ||||
|      */ | ||||
|     DM("DM DBMS", DbType.DM), | ||||
|  | ||||
|     /** | ||||
|      * 人大金仓 | ||||
|      */ | ||||
|     KINGBASE_ES("KingbaseES", DbType.KINGBASE_ES), | ||||
|  | ||||
|     // 华为openGauss ProductName 与 PostgreSQL相同 | ||||
|     ; | ||||
|  | ||||
|     private final String name; | ||||
|     private final DbType type; | ||||
|  | ||||
|     public static final Map<String, DbType> MAPS = Arrays.stream(values()) | ||||
|             .collect(Collectors.toMap(NameToTypeEnum::getName, NameToTypeEnum::getType)); | ||||
|  | ||||
|     public static DbType find(String databaseProductName) { | ||||
|         if (StrUtil.isBlank(databaseProductName)) { | ||||
|             return null; | ||||
|         } | ||||
|         return MAPS.get(databaseProductName); | ||||
|     } | ||||
| } | ||||
| @@ -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()); | ||||
|         } | ||||
|   | ||||
| @@ -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)); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 dhb52
					dhb52