Commit af5520db46ef6b8000d66708ac17088389a5b17d

Authored by YunaiV
1 parent 63e31606

【缺陷修复】全局:完善对 SQLServer 2015 的兼容性

yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
@@ -6,8 +6,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -6,8 +6,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; 6 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
7 import cn.iocoder.yudao.framework.common.pojo.SortingField; 7 import cn.iocoder.yudao.framework.common.pojo.SortingField;
8 import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; 8 import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
  9 +import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
9 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 10 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
10 -import com.baomidou.mybatisplus.annotation.DbType;  
11 import com.baomidou.mybatisplus.core.conditions.Wrapper; 11 import com.baomidou.mybatisplus.core.conditions.Wrapper;
12 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 12 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
13 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 13 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -22,7 +22,6 @@ import org.apache.ibatis.annotations.Param; @@ -22,7 +22,6 @@ import org.apache.ibatis.annotations.Param;
22 22
23 import java.util.Collection; 23 import java.util.Collection;
24 import java.util.List; 24 import java.util.List;
25 -import java.util.Objects;  
26 25
27 /** 26 /**
28 * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 27 * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
@@ -151,7 +150,7 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> { @@ -151,7 +150,7 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
151 */ 150 */
152 default Boolean insertBatch(Collection<T> entities) { 151 default Boolean insertBatch(Collection<T> entities) {
153 // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理 152 // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
154 - if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) { 153 + if (JdbcUtils.isSQLServer(SqlConstants.DB_TYPE)) {
155 entities.forEach(this::insert); 154 entities.forEach(this::insert);
156 return CollUtil.isNotEmpty(entities); 155 return CollUtil.isNotEmpty(entities);
157 } 156 }
@@ -166,7 +165,7 @@ public interface BaseMapperX&lt;T&gt; extends MPJBaseMapper&lt;T&gt; { @@ -166,7 +165,7 @@ public interface BaseMapperX&lt;T&gt; extends MPJBaseMapper&lt;T&gt; {
166 */ 165 */
167 default Boolean insertBatch(Collection<T> entities, int size) { 166 default Boolean insertBatch(Collection<T> entities, int size) {
168 // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理 167 // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
169 - if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) { 168 + if (JdbcUtils.isSQLServer(SqlConstants.DB_TYPE)) {
170 entities.forEach(this::insert); 169 entities.forEach(this::insert);
171 return CollUtil.isNotEmpty(entities); 170 return CollUtil.isNotEmpty(entities);
172 } 171 }
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.object.ObjectUtils;
3 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; 4 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
4 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum; 5 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
5 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; 6 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
@@ -58,4 +59,25 @@ public class JdbcUtils { @@ -58,4 +59,25 @@ public class JdbcUtils {
58 } 59 }
59 } 60 }
60 61
  62 + /**
  63 + * 判断 JDBC 连接是否为 SQLServer 数据库
  64 + *
  65 + * @param url JDBC 连接
  66 + * @return 是否为 SQLServer 数据库
  67 + */
  68 + public static boolean isSQLServer(String url) {
  69 + DbType dbType = getDbType(url);
  70 + return isSQLServer(dbType);
  71 + }
  72 +
  73 + /**
  74 + * 判断 JDBC 连接是否为 SQLServer 数据库
  75 + *
  76 + * @param url JDBC 连接
  77 + * @return 是否为 SQLServer 数据库
  78 + */
  79 + public static boolean isSQLServer(DbType dbType) {
  80 + return ObjectUtils.equalsAny(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005);
  81 + }
  82 +
61 } 83 }
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java
@@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert; @@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; 6 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
8 -import com.baomidou.mybatisplus.annotation.DbType;  
9 import com.baomidou.mybatisplus.generator.config.DataSourceConfig; 8 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
10 import com.baomidou.mybatisplus.generator.config.GlobalConfig; 9 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
11 import com.baomidou.mybatisplus.generator.config.StrategyConfig; 10 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
@@ -18,7 +17,6 @@ import org.springframework.stereotype.Service; @@ -18,7 +17,6 @@ import org.springframework.stereotype.Service;
18 17
19 import java.util.Comparator; 18 import java.util.Comparator;
20 import java.util.List; 19 import java.util.List;
21 -import java.util.Objects;  
22 import java.util.stream.Collectors; 20 import java.util.stream.Collectors;
23 21
24 /** 22 /**
@@ -49,12 +47,11 @@ public class DatabaseTableServiceImpl implements DatabaseTableService { @@ -49,12 +47,11 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
49 // 获得数据源配置 47 // 获得数据源配置
50 DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); 48 DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
51 Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); 49 Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
52 - DbType dbType = JdbcUtils.getDbType(config.getUrl());  
53 50
54 // 使用 MyBatis Plus Generator 解析表结构 51 // 使用 MyBatis Plus Generator 解析表结构
55 DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), 52 DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
56 config.getPassword()); 53 config.getPassword());
57 - if (Objects.equals(dbType, DbType.SQL_SERVER)) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419 54 + if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
58 dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class); 55 dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
59 } 56 }
60 StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到 57 StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到