Forráskód Böngészése

调整未知方言异常,自动识别url转换小写匹配.

https://github.com/baomidou/mybatis-plus/issues/2178
聂秋秋 5 éve
szülő
commit
87258ab7e7

+ 5 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.extension.plugins.pagination;
 
 import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
@@ -25,6 +26,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
 import org.apache.ibatis.session.RowBounds;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -83,9 +85,10 @@ public class DialectFactory {
     public static IDialect getDialect(String dialectClazz) {
         return DIALECT_CACHE.computeIfAbsent(dialectClazz, DialectFactory::classToDialect);
     }
-
+    
     public static IDialect getDialect(DbType dbType) {
-        return DIALECT_REGISTRY.getDialect(dbType);
+        return Optional.ofNullable(DIALECT_REGISTRY.getDialect(dbType))
+            .orElseThrow(() -> new MybatisPlusException(String.format("%s database not supported.", dbType.getDb())));
     }
 
     @Deprecated

+ 0 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DialectRegistry.java

@@ -48,7 +48,6 @@ public class DialectRegistry {
         dialect_enum_map.put(DbType.XU_GU, new XuGuDialect());
         dialect_enum_map.put(DbType.KINGBASE_ES, new KingbaseDialect());
         dialect_enum_map.put(DbType.PHOENIX, new PhoenixDialect());
-        dialect_enum_map.put(DbType.OTHER, new UnknownDialect());
     }
 
     public IDialect getDialect(DbType dbType) {

+ 4 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/UnknownDialect.java

@@ -20,10 +20,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
 
 /**
  * 未知方言
+ *
  * @author nieqiuqiu
+ * @deprecated 3.3.2
  */
+@Deprecated
 public class UnknownDialect implements IDialect {
-
+    
     @Override
     public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
         throw new MybatisPlusException(" not support.");

+ 15 - 14
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/JdbcUtils.java

@@ -39,33 +39,34 @@ public class JdbcUtils {
      */
     public static DbType getDbType(String jdbcUrl) {
         Assert.isFalse(StringUtils.isBlank(jdbcUrl), "Error: The jdbcUrl is Null, Cannot read database type");
-        if (jdbcUrl.contains(":mysql:") || jdbcUrl.contains(":cobar:")) {
+        String url = jdbcUrl.toLowerCase();
+        if (url.contains(":mysql:") || url.contains(":cobar:")) {
             return DbType.MYSQL;
-        } else if (jdbcUrl.contains(":mariadb:")) {
+        } else if (url.contains(":mariadb:")) {
             return DbType.MARIADB;
-        } else if (jdbcUrl.contains(":oracle:")) {
+        } else if (url.contains(":oracle:")) {
             return DbType.ORACLE;
-        } else if (jdbcUrl.contains(":sqlserver:") || jdbcUrl.contains(":microsoft:")) {
+        } else if (url.contains(":sqlserver:") || url.contains(":microsoft:")) {
             return DbType.SQL_SERVER2005;
-        } else if (jdbcUrl.contains(":sqlserver2012:")) {
+        } else if (url.contains(":sqlserver2012:")) {
             return DbType.SQL_SERVER;
-        } else if (jdbcUrl.contains(":postgresql:")) {
+        } else if (url.contains(":postgresql:")) {
             return DbType.POSTGRE_SQL;
-        } else if (jdbcUrl.contains(":hsqldb:")) {
+        } else if (url.contains(":hsqldb:")) {
             return DbType.HSQL;
-        } else if (jdbcUrl.contains(":db2:")) {
+        } else if (url.contains(":db2:")) {
             return DbType.DB2;
-        } else if (jdbcUrl.contains(":sqlite:")) {
+        } else if (url.contains(":sqlite:")) {
             return DbType.SQLITE;
-        } else if (jdbcUrl.contains(":h2:")) {
+        } else if (url.contains(":h2:")) {
             return DbType.H2;
-        } else if (jdbcUrl.contains(":dm:")) {
+        } else if (url.contains(":dm:")) {
             return DbType.DM;
-        } else if (jdbcUrl.contains(":xugu:")) {
+        } else if (url.contains(":xugu:")) {
             return DbType.XU_GU;
-        } else if (jdbcUrl.contains(":kingbase:") || jdbcUrl.contains(":kingbase8:")) {
+        } else if (url.contains(":kingbase:") || url.contains(":kingbase8:")) {
             return DbType.KINGBASE_ES;
-        } else if (jdbcUrl.contains(":phoenix:")) {
+        } else if (url.contains(":phoenix:")) {
             return DbType.PHOENIX;
         } else {
             logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not Supported!");

+ 8 - 8
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/pagination/SelectBodyToPlainSelectTest.java

@@ -58,12 +58,12 @@ class SelectBodyToPlainSelectTest {
 
     @Test
     void testPaginationInterceptorConcatOrderByBefore() {
-        String actualSql = PaginationInterceptor
+        String actualSql = new PaginationInterceptor()
             .concatOrderBy("select * from test", page);
 
         assertThat(actualSql).isEqualTo("SELECT * FROM test ORDER BY column ASC");
 
-        String actualSqlWhere = PaginationInterceptor
+        String actualSqlWhere = new PaginationInterceptor()
             .concatOrderBy("select * from test where 1 = 1", page);
 
         assertThat(actualSqlWhere).isEqualTo("SELECT * FROM test WHERE 1 = 1 ORDER BY column ASC");
@@ -71,34 +71,34 @@ class SelectBodyToPlainSelectTest {
 
     @Test
     void testPaginationInterceptorConcatOrderByFix() {
-        String actualSql = PaginationInterceptor
+        String actualSql = new PaginationInterceptor()
             .concatOrderBy("select * from test union select * from test2", page);
         assertThat(actualSql).isEqualTo("SELECT * FROM test UNION SELECT * FROM test2 ORDER BY column ASC");
 
-        String actualSqlUnionAll = PaginationInterceptor
+        String actualSqlUnionAll = new PaginationInterceptor()
             .concatOrderBy("select * from test union all select * from test2", page);
         assertThat(actualSqlUnionAll).isEqualTo("SELECT * FROM test UNION ALL SELECT * FROM test2 ORDER BY column ASC");
     }
 
     @Test
     void testPaginationInterceptorConcatOrderByFixWithWhere() {
-        String actualSqlWhere = PaginationInterceptor
+        String actualSqlWhere = new PaginationInterceptor()
             .concatOrderBy("select * from test where 1 = 1 union select * from test2 where 1 = 1", page);
         assertThat(actualSqlWhere).isEqualTo("SELECT * FROM test WHERE 1 = 1 UNION SELECT * FROM test2 WHERE 1 = 1 ORDER BY column ASC");
 
-        String actualSqlUnionAll = PaginationInterceptor
+        String actualSqlUnionAll = new PaginationInterceptor()
             .concatOrderBy("select * from test where 1 = 1 union all select * from test2 where 1 = 1 ", page);
         assertThat(actualSqlUnionAll).isEqualTo("SELECT * FROM test WHERE 1 = 1 UNION ALL SELECT * FROM test2 WHERE 1 = 1 ORDER BY column ASC");
     }
 
     @Test
     void testPaginationInterceptorOrderByEmptyColumnFix() {
-        String actualSql = PaginationInterceptor
+        String actualSql = new PaginationInterceptor()
             .concatOrderBy("select * from test", page);
 
         assertThat(actualSql).isEqualTo("SELECT * FROM test ORDER BY column ASC");
 
-        String actualSqlWhere = PaginationInterceptor
+        String actualSqlWhere = new PaginationInterceptor()
             .concatOrderBy("select * from test where 1 = 1", page);
 
         assertThat(actualSqlWhere).isEqualTo("SELECT * FROM test WHERE 1 = 1 ORDER BY column ASC");

+ 1 - 1
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DialectRegistryTest.java

@@ -25,7 +25,7 @@ class DialectRegistryTest {
         Assertions.assertEquals(dialectRegistry.getDialect(DbType.XU_GU).getClass(), XuGuDialect.class);
         Assertions.assertEquals(dialectRegistry.getDialect(DbType.KINGBASE_ES).getClass(), KingbaseDialect.class);
         Assertions.assertEquals(dialectRegistry.getDialect(DbType.PHOENIX).getClass(), PhoenixDialect.class);
-        Assertions.assertEquals(dialectRegistry.getDialect(DbType.OTHER).getClass(), UnknownDialect.class);
+        Assertions.assertNull(dialectRegistry.getDialect(DbType.OTHER));
     }
 
 }

+ 10 - 5
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/DbTypeTest.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.test;
 
 import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.*;
 import org.junit.jupiter.api.Assertions;
@@ -28,16 +29,20 @@ import org.junit.jupiter.api.Test;
 class DbTypeTest {
 
     private DialectRegistry dialectRegistry = new DialectRegistry();
-
+    
     @Test
     void test() throws ClassNotFoundException {
         DbType[] values = DbType.values();
-        Assertions.assertEquals(values.length, dialectRegistry.getDialects().size());
+        Assertions.assertEquals(values.length - 1, dialectRegistry.getDialects().size());
         for (DbType dbType : values) {
             Class<?> aClass = Class.forName(dbType.getDialect());
-            IDialect dialect = DialectFactory.getDialect(dbType);
-            Assertions.assertEquals(dialect.getClass(), aClass);
-            Assertions.assertEquals(aClass, dialectRegistry.getDialect(dbType).getClass());
+            if (DbType.OTHER != dbType) {
+                IDialect dialect = DialectFactory.getDialect(dbType);
+                Assertions.assertEquals(dialect.getClass(), aClass);
+                Assertions.assertEquals(aClass, dialectRegistry.getDialect(dbType).getClass());
+            } else {
+                Assertions.assertThrows(MybatisPlusException.class, () -> DialectFactory.getDialect(dbType));
+            }
         }
     }