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; | package cn.iocoder.yudao.framework.mybatis.core.util; | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; | 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.dynamic.datasource.DynamicRoutingDataSource; | ||||||
| import com.baomidou.mybatisplus.annotation.DbType; | import com.baomidou.mybatisplus.annotation.DbType; | ||||||
|  |  | ||||||
| @@ -52,7 +52,7 @@ public class JdbcUtils { | |||||||
|         DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class); |         DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class); | ||||||
|         DataSource dataSource = dynamicRoutingDataSource.determineDataSource(); |         DataSource dataSource = dynamicRoutingDataSource.determineDataSource(); | ||||||
|         try (Connection conn = dataSource.getConnection()) { |         try (Connection conn = dataSource.getConnection()) { | ||||||
|             return NameToTypeEnum.find(conn.getMetaData().getDatabaseProductName()); |             return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName()); | ||||||
|         } catch (SQLException e) { |         } catch (SQLException e) { | ||||||
|             throw new IllegalArgumentException(e.getMessage()); |             throw new IllegalArgumentException(e.getMessage()); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; | |||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageParam; | import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.SortingField; | 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.annotation.DbType; | ||||||
| import com.baomidou.mybatisplus.core.metadata.OrderItem; | import com.baomidou.mybatisplus.core.metadata.OrderItem; | ||||||
| import com.baomidou.mybatisplus.core.toolkit.StringPool; | import com.baomidou.mybatisplus.core.toolkit.StringPool; | ||||||
| @@ -98,7 +98,7 @@ public class MyBatisUtils { | |||||||
|     public static String findInSet(String column, Object value) { |     public static String findInSet(String column, Object value) { | ||||||
|         // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型 |         // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型 | ||||||
|         DbType dbType = JdbcUtils.getDbType(); |         DbType dbType = JdbcUtils.getDbType(); | ||||||
|         return FindInSetEnum.getTemplate(dbType) |         return DbTypeEnum.getFindInSetTemplate(dbType) | ||||||
|                 .replace("#{column}", column) |                 .replace("#{column}", column) | ||||||
|                 .replace("#{value}", StrUtil.toString(value)); |                 .replace("#{value}", StrUtil.toString(value)); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 dhb52
					dhb52