Commit 3c5309b14e6ac44dcef5007aa7d67d2c50ce825f

Authored by dhb52
1 parent 355e47c3

feat: FindInSetEnum、NameToTypeEnum 融合为DbTypeEnum

yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/NameToTypeEnum.java renamed to 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; @@ -7,61 +7,67 @@ import lombok.Getter;
7 7
8 import java.util.Arrays; 8 import java.util.Arrays;
9 import java.util.Map; 9 import java.util.Map;
  10 +import java.util.Optional;
  11 +import java.util.function.Function;
10 import java.util.stream.Collectors; 12 import java.util.stream.Collectors;
11 13
12 -// TODO @dhb52:是不是把 FindInSetEnum、NameToTypeEnum 融合,搞成 DbTypeEnum?然后里面 type、productName,findInSet  
13 -/**  
14 - * 数据库产品名 => mp DbType 的映射关系  
15 - *  
16 - * @author dhb52  
17 - */ 14 +
18 @Getter 15 @Getter
19 @AllArgsConstructor 16 @AllArgsConstructor
20 -public enum NameToTypeEnum {  
21 - 17 +public enum DbTypeEnum {
22 /** 18 /**
23 * MySQL 19 * MySQL
24 */ 20 */
25 - MY_SQL("MySQL", DbType.MYSQL), 21 + MY_SQL("MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.MYSQL),
26 22
27 /** 23 /**
28 * Oracle 24 * Oracle
29 */ 25 */
30 - ORACLE("Oracle", DbType.ORACLE), 26 + ORACLE("Oracle", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.ORACLE),
31 27
32 /** 28 /**
33 * PostgreSQL 29 * PostgreSQL
34 */ 30 */
35 - POSTGRE_SQL("PostgreSQL", DbType.POSTGRE_SQL), 31 + POSTGRE_SQL("PostgreSQL", "POSITION('#{value}' IN #{column}) <> 0", DbType.POSTGRE_SQL),
36 32
37 /** 33 /**
38 * SQL Server 34 * SQL Server
39 */ 35 */
40 - SQL_SERVER("Microsoft SQL Server", DbType.SQL_SERVER), 36 + SQL_SERVER("Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0", DbType.SQL_SERVER),
41 37
42 /** 38 /**
43 * 达梦 39 * 达梦
44 */ 40 */
45 - DM("DM DBMS", DbType.DM), 41 + DM("DM DBMS", "FIND_IN_SET('#{value}', #{column}) <> 0", DbType.DM),
46 42
47 /** 43 /**
48 * 人大金仓 44 * 人大金仓
49 */ 45 */
50 - KINGBASE_ES("KingbaseES", DbType.KINGBASE_ES), 46 + KINGBASE_ES("KingbaseES", "POSITION('#{value}' IN #{column}) <> 0", DbType.KINGBASE_ES),
51 47
52 - // 华为openGauss ProductName 与 PostgreSQL相同 48 + // 华为openGauss 使用ProductName 与 PostgreSQL相同
53 ; 49 ;
54 50
55 - private final String name;  
56 - private final DbType type; 51 + public static final Map<String, DbTypeEnum> MAP_BY_NAME = Arrays.stream(values())
  52 + .collect(Collectors.toMap(DbTypeEnum::getName, Function.identity()));
  53 +
  54 + public static final Map<DbType, DbTypeEnum> MAP_BY_MP = Arrays.stream(values())
  55 + .collect(Collectors.toMap(DbTypeEnum::getMpDbType, Function.identity()));
57 56
58 - public static final Map<String, DbType> MAPS = Arrays.stream(values())  
59 - .collect(Collectors.toMap(NameToTypeEnum::getName, NameToTypeEnum::getType)); 57 +
  58 + private final String name;
  59 + private final String findInSetTemplate;
  60 + private final DbType mpDbType;
60 61
61 public static DbType find(String databaseProductName) { 62 public static DbType find(String databaseProductName) {
62 if (StrUtil.isBlank(databaseProductName)) { 63 if (StrUtil.isBlank(databaseProductName)) {
63 return null; 64 return null;
64 } 65 }
65 - return MAPS.get(databaseProductName); 66 + return MAP_BY_NAME.get(databaseProductName).getMpDbType();
  67 + }
  68 +
  69 + public static String getFindInSetTemplate(DbType dbType) {
  70 + return Optional.of(MAP_BY_MP.get(dbType).getFindInSetTemplate())
  71 + .orElseThrow(() -> new IllegalArgumentException("FIND_IN_SET not supported"));
66 } 72 }
67 -}  
68 \ No newline at end of file 73 \ No newline at end of file
  74 +}
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/FindInSetEnum.java deleted
1 -package cn.iocoder.yudao.framework.mybatis.core.enums;  
2 -  
3 -  
4 -import com.baomidou.mybatisplus.annotation.DbType;  
5 -import lombok.AllArgsConstructor;  
6 -import lombok.Getter;  
7 -  
8 -import java.util.Arrays;  
9 -import java.util.Map;  
10 -import java.util.Optional;  
11 -import java.util.stream.Collectors;  
12 -  
13 -/**  
14 - * find_in_set函数的跨数据库实现  
15 - *  
16 - * @author dhb52  
17 - */  
18 -@Getter  
19 -@AllArgsConstructor  
20 -public enum FindInSetEnum {  
21 -  
22 - // FIND_IN_SET: MySQL 类型  
23 - MYSQL("FIND_IN_SET('#{value}', #{column}) <> 0", DbType.MYSQL),  
24 - DM("FIND_IN_SET('#{value}', #{column}) <> 0", DbType.DM),  
25 -  
26 - // INSTR: Oracle 类型  
27 - ORACLE("INSTR(','||#{column}||',' , ',#{value},') <> 0", DbType.ORACLE),  
28 -  
29 - // CHARINDEX: SQLServer  
30 - SQLSERVER("CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',')", DbType.SQL_SERVER),  
31 -  
32 - // POSITION: PostgreSQL 类型  
33 - POSTGRE_SQL("POSITION('#{value}' IN #{column})", DbType.POSTGRE_SQL),  
34 - KINGBASE_ES("POSITION('#{value}' IN #{column})", DbType.KINGBASE_ES),  
35 -  
36 - // LOCATE: 其他  
37 - H2("LOCATE('#{value}' IN #{column})", DbType.H2),  
38 - ;  
39 -  
40 - public static final Map<DbType, String> MAPS = Arrays.stream(values())  
41 - .collect(Collectors.toMap(FindInSetEnum::getDbType, FindInSetEnum::getSqlTemplate));  
42 -  
43 - private String sqlTemplate;  
44 - private DbType dbType;  
45 -  
46 - public static String getTemplate(DbType dbType) {  
47 - return Optional.of(MAPS.get(dbType))  
48 - .orElseThrow(() -> new IllegalArgumentException("FIND_IN_SET not supported"));  
49 - }  
50 -}  
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java
1 package cn.iocoder.yudao.framework.mybatis.core.util; 1 package cn.iocoder.yudao.framework.mybatis.core.util;
2 2
3 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; 3 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
4 -import cn.iocoder.yudao.framework.mybatis.core.enums.NameToTypeEnum; 4 +import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
5 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; 5 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
6 import com.baomidou.mybatisplus.annotation.DbType; 6 import com.baomidou.mybatisplus.annotation.DbType;
7 7
@@ -52,7 +52,7 @@ public class JdbcUtils { @@ -52,7 +52,7 @@ public class JdbcUtils {
52 DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class); 52 DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class);
53 DataSource dataSource = dynamicRoutingDataSource.determineDataSource(); 53 DataSource dataSource = dynamicRoutingDataSource.determineDataSource();
54 try (Connection conn = dataSource.getConnection()) { 54 try (Connection conn = dataSource.getConnection()) {
55 - return NameToTypeEnum.find(conn.getMetaData().getDatabaseProductName()); 55 + return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName());
56 } catch (SQLException e) { 56 } catch (SQLException e) {
57 throw new IllegalArgumentException(e.getMessage()); 57 throw new IllegalArgumentException(e.getMessage());
58 } 58 }
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; @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageParam; 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 import cn.iocoder.yudao.framework.common.pojo.SortingField; 6 import cn.iocoder.yudao.framework.common.pojo.SortingField;
7 -import cn.iocoder.yudao.framework.mybatis.core.enums.FindInSetEnum; 7 +import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
8 import com.baomidou.mybatisplus.annotation.DbType; 8 import com.baomidou.mybatisplus.annotation.DbType;
9 import com.baomidou.mybatisplus.core.metadata.OrderItem; 9 import com.baomidou.mybatisplus.core.metadata.OrderItem;
10 import com.baomidou.mybatisplus.core.toolkit.StringPool; 10 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -98,7 +98,7 @@ public class MyBatisUtils { @@ -98,7 +98,7 @@ public class MyBatisUtils {
98 public static String findInSet(String column, Object value) { 98 public static String findInSet(String column, Object value) {
99 // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型 99 // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型
100 DbType dbType = JdbcUtils.getDbType(); 100 DbType dbType = JdbcUtils.getDbType();
101 - return FindInSetEnum.getTemplate(dbType) 101 + return DbTypeEnum.getFindInSetTemplate(dbType)
102 .replace("#{column}", column) 102 .replace("#{column}", column)
103 .replace("#{value}", StrUtil.toString(value)); 103 .replace("#{value}", StrUtil.toString(value));
104 } 104 }