mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-02 00:10:58 +08:00
add sqlserver2005 support
This commit is contained in:
parent
3ea40c7e2f
commit
f0a7198645
@ -28,7 +28,7 @@ import java.util.Map;
|
||||
*
|
||||
* @author loolly
|
||||
*/
|
||||
public class DialectFactory{
|
||||
public class DialectFactory {
|
||||
|
||||
private static final Map<DataSource, Dialect> DIALECT_POOL = new SafeConcurrentHashMap<>();
|
||||
|
||||
@ -71,6 +71,8 @@ public class DialectFactory{
|
||||
return new H2Dialect(dbConfig);
|
||||
} else if (DriverNames.DRIVER_SQLSERVER.equalsIgnoreCase(driverName)) {
|
||||
return new SqlServer2012Dialect(dbConfig);
|
||||
} else if (DriverNames.DRIVER_SQLSERVER_OLD.equalsIgnoreCase(driverName)) {
|
||||
return new SqlServer2005Dialect(dbConfig);
|
||||
} else if (DriverNames.DRIVER_PHOENIX.equalsIgnoreCase(driverName)) {
|
||||
return new PhoenixDialect(dbConfig);
|
||||
} else if (DriverNames.DRIVER_DM.equalsIgnoreCase(driverName)) {
|
||||
|
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2024. looly(loolly@aliyun.com)
|
||||
* Hutool is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* https://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
package org.dromara.hutool.db.dialect.impl;
|
||||
|
||||
import org.dromara.hutool.core.text.StrPool;
|
||||
import org.dromara.hutool.core.text.StrUtil;
|
||||
import org.dromara.hutool.db.Page;
|
||||
import org.dromara.hutool.db.config.DbConfig;
|
||||
import org.dromara.hutool.db.dialect.DialectName;
|
||||
import org.dromara.hutool.db.sql.QuoteWrapper;
|
||||
import org.dromara.hutool.db.sql.SqlBuilder;
|
||||
|
||||
/**
|
||||
* SQLServer2005-2008方言实现<br>
|
||||
* 参考:jdbc-plus
|
||||
*
|
||||
* @author niliwei, looly
|
||||
*/
|
||||
public class SqlServer2005Dialect extends AnsiSqlDialect {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private static final String DEFAULT_TABLE_ALIAS = "table_alias_";
|
||||
private static final String DEFAULT_ROWNUM_ALIAS = "rownum_";
|
||||
|
||||
@Override
|
||||
public String dialectName() {
|
||||
return DialectName.SQLSERVER.name();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param dbConfig 数据库配置
|
||||
*/
|
||||
public SqlServer2005Dialect(final DbConfig dbConfig) {
|
||||
super(dbConfig);
|
||||
//双引号和中括号适用,双引号更广泛
|
||||
quoteWrapper = new QuoteWrapper('"');
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SqlBuilder wrapPageSql(final SqlBuilder find, final Page page) {
|
||||
String querySql = find.toString();
|
||||
|
||||
String tableAlias = DEFAULT_TABLE_ALIAS;
|
||||
while (querySql.contains(tableAlias)) {
|
||||
tableAlias += StrPool.UNDERLINE;
|
||||
}
|
||||
String rownumAlias = DEFAULT_ROWNUM_ALIAS;
|
||||
while (querySql.contains(rownumAlias)) {
|
||||
rownumAlias += StrPool.UNDERLINE;
|
||||
}
|
||||
|
||||
final String orderBy = getOrderByPart(querySql);
|
||||
final String distinctStr;
|
||||
if (StrUtil.startWithIgnoreCase(querySql, "select distinct")) {
|
||||
querySql = querySql.substring(15);
|
||||
distinctStr = "DISTINCT ";
|
||||
} else {
|
||||
querySql = querySql.substring(6);
|
||||
distinctStr = StrUtil.EMPTY;
|
||||
}
|
||||
|
||||
return SqlBuilder.of("WITH " + tableAlias + " AS (SELECT " + distinctStr + "TOP 100 PERCENT "
|
||||
+ " ROW_NUMBER() OVER (" + orderBy + ") as " + rownumAlias + ", "
|
||||
+ querySql + ") SELECT * FROM " + tableAlias + " WHERE " + rownumAlias + " BETWEEN " +
|
||||
(page.getBeginIndex() + 1) + " AND " + page.getEndIndex() + " ORDER BY " + rownumAlias);
|
||||
}
|
||||
|
||||
private static String getOrderByPart(final String sql) {
|
||||
final int orderByIndex = StrUtil.indexOfIgnoreCase(sql, "order by");
|
||||
return orderByIndex > -1 ? sql.substring(orderByIndex) : "ORDER BY CURRENT_TIMESTAMP";
|
||||
}
|
||||
}
|
@ -37,6 +37,11 @@ public class SqlServer2012Dialect extends AnsiSqlDialect {
|
||||
quoteWrapper = new QuoteWrapper('"');
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dialectName() {
|
||||
return DialectName.SQLSERVER2012.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SqlBuilder wrapPageSql(final SqlBuilder find, final Page page) {
|
||||
if (!StrUtil.containsIgnoreCase(find.toString(), "order by")) {
|
||||
@ -49,9 +54,4 @@ public class SqlServer2012Dialect extends AnsiSqlDialect {
|
||||
.append(page.getPageSize())//
|
||||
.append(" row only");//
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dialectName() {
|
||||
return DialectName.SQLSERVER2012.name();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user