Commit af5520db46ef6b8000d66708ac17088389a5b17d
1 parent
63e31606
【缺陷修复】全局:完善对 SQLServer 2015 的兼容性
Showing
3 changed files
with
26 additions
and
8 deletions
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<T> extends MPJBaseMapper<T> { | @@ -166,7 +165,7 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> { | ||
| 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(); // 忽略视图,业务上一般用不到 |