优化SQL编辑器引入方式,优化自动提示,优化sqlserver表、字段注释获取和更新方式,数据查询时改为需指定数据库,便于库表检索提示
This commit is contained in:
@@ -83,12 +83,14 @@ public class DatabaseDocController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 不再使用此接口,优化了
|
||||
* 获取编辑器所需的所有信息,用于自动补全
|
||||
* 此接口会返回所有库表结构,介意的话请自己手动屏蔽调此接口
|
||||
*
|
||||
* @param sourceId
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
@PostMapping(value = "/getEditorData")
|
||||
public ResponseJson getEditorData(Long sourceId) {
|
||||
// 没权限,返回空
|
||||
|
||||
@@ -20,6 +20,8 @@ import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
|
||||
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
|
||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||
import com.zyplayer.doc.db.framework.utils.JSONUtil;
|
||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
||||
import com.zyplayer.doc.db.service.DbBaseService;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -51,9 +53,11 @@ public class DbSqlExecutorController {
|
||||
DbHistoryService dbHistoryService;
|
||||
@Resource
|
||||
DbFavoriteService dbFavoriteService;
|
||||
@Resource
|
||||
DatabaseServiceFactory databaseServiceFactory;
|
||||
|
||||
@PostMapping(value = "/execute")
|
||||
public ResponseJson execute(Long sourceId, String executeId, String sql, String params) {
|
||||
public ResponseJson execute(Long sourceId, String executeId, String dbName, String sql, String params) {
|
||||
if (StringUtils.isBlank(sql)) {
|
||||
return DocDbResponseJson.warn("执行的SQL不能为空");
|
||||
}
|
||||
@@ -63,6 +67,8 @@ public class DbSqlExecutorController {
|
||||
if (!manageAuth && !select && !update) {
|
||||
return DocDbResponseJson.warn("没有该数据源的执行权限");
|
||||
}
|
||||
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(sourceId);
|
||||
String useDbSql = dbBaseService.getUseDbSql(dbName);
|
||||
// 保留历史记录
|
||||
dbHistoryService.saveHistory(sql.trim(), sourceId);
|
||||
List<String> resultList = new LinkedList<>();
|
||||
@@ -80,13 +86,14 @@ public class DbSqlExecutorController {
|
||||
executeParam.setExecuteId(executeId);
|
||||
executeParam.setExecuteType(executeType);
|
||||
executeParam.setSql(sqlItem);
|
||||
executeParam.setPrefixSql(useDbSql);
|
||||
executeParam.setMaxRows(1000);
|
||||
ExecuteResult executeResult = sqlExecutor.execute(executeParam);
|
||||
String resultJsonStr = JSON.toJSONString(executeResult, JSONUtil.serializeConfig, SerializerFeature.WriteMapNullValue);
|
||||
resultList.add(resultJsonStr);
|
||||
} catch (Exception e) {
|
||||
logger.error("执行出错", e);
|
||||
ExecuteResult executeResult = ExecuteResult.error(StringUtil.getException(e), sqlItem);
|
||||
ExecuteResult executeResult = ExecuteResult.error(e.getMessage(), sqlItem);
|
||||
resultList.add(JSON.toJSONString(executeResult));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,12 @@ public class ExecuteParam {
|
||||
private Long datasourceId;
|
||||
private Integer maxRows;
|
||||
private String executeId;
|
||||
private String prefixSql;
|
||||
private ExecuteType executeType;
|
||||
|
||||
public ExecuteParam() {
|
||||
}
|
||||
|
||||
public Long getDatasourceId() {
|
||||
return datasourceId;
|
||||
}
|
||||
@@ -74,4 +78,12 @@ public class ExecuteParam {
|
||||
public void setMaxRows(Integer maxRows) {
|
||||
this.maxRows = maxRows;
|
||||
}
|
||||
|
||||
public String getPrefixSql() {
|
||||
return prefixSql;
|
||||
}
|
||||
|
||||
public void setPrefixSql(String prefixSql) {
|
||||
this.prefixSql = prefixSql;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,12 @@ package com.zyplayer.doc.db.framework.db.mapper.base;
|
||||
|
||||
import com.alibaba.druid.pool.DruidPooledConnection;
|
||||
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
||||
import com.zyplayer.doc.core.util.StringUtil;
|
||||
import com.zyplayer.doc.data.service.manage.DbHistoryService;
|
||||
import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean;
|
||||
import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.ibatis.builder.SqlSourceBuilder;
|
||||
import org.apache.ibatis.builder.StaticSqlSource;
|
||||
import org.apache.ibatis.mapping.BoundSql;
|
||||
@@ -93,16 +95,23 @@ public class SqlExecutor {
|
||||
// String sqlStr = SqlLogUtil.getSqlString(paramMap, boundSql);
|
||||
// 有参数的时候不输出日志,暂时只有导数据才有参数
|
||||
if (CollectionUtils.isEmpty(executeParam.getParamList())) {
|
||||
if (StringUtils.isNotBlank(executeParam.getPrefixSql())) {
|
||||
logger.info("prefix sql ==> {}", executeParam.getPrefixSql());
|
||||
}
|
||||
logger.info("sql ==> {}", executeParam.getSql());
|
||||
}
|
||||
|
||||
// List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
|
||||
PreparedStatement preparedStatement = null;
|
||||
PreparedStatement prefixStatement = null;
|
||||
DruidPooledConnection connection = null;
|
||||
// 执行查询
|
||||
try {
|
||||
long startTime = System.currentTimeMillis();
|
||||
connection = factoryBean.getDataSource().getConnection();
|
||||
if (StringUtils.isNotBlank(executeParam.getPrefixSql())) {
|
||||
prefixStatement = connection.prepareStatement(executeParam.getPrefixSql());
|
||||
prefixStatement.execute();
|
||||
}
|
||||
preparedStatement = connection.prepareStatement(executeParam.getSql());
|
||||
// 设置当前的PreparedStatement
|
||||
statementMap.put(executeParam.getExecuteId(), preparedStatement);
|
||||
@@ -150,6 +159,13 @@ public class SqlExecutor {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
statementMap.remove(executeParam.getExecuteId());
|
||||
try {
|
||||
if (prefixStatement != null && !prefixStatement.isClosed()) {
|
||||
prefixStatement.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("关闭Statement失败");
|
||||
}
|
||||
try {
|
||||
if (preparedStatement != null && !preparedStatement.isClosed()) {
|
||||
preparedStatement.close();
|
||||
|
||||
@@ -35,37 +35,37 @@
|
||||
WITH PRIMARYINFO( COLUMNNAME ,ISPRAMARY) AS
|
||||
(
|
||||
SELECT C.NAME,'true' AS COLUMNNAME
|
||||
FROM SYSINDEXES I
|
||||
JOIN SYSINDEXKEYS K ON I.ID = K.ID AND I.INDID = K.INDID
|
||||
JOIN SYSOBJECTS O ON I.ID = O.ID
|
||||
JOIN SYSCOLUMNS C ON I.ID=C.ID AND K.COLID = C.COLID
|
||||
FROM ${dbName}..SYSINDEXES I
|
||||
JOIN ${dbName}..SYSINDEXKEYS K ON I.ID = K.ID AND I.INDID = K.INDID
|
||||
JOIN ${dbName}..SYSOBJECTS O ON I.ID = O.ID
|
||||
JOIN ${dbName}..SYSCOLUMNS C ON I.ID=C.ID AND K.COLID = C.COLID
|
||||
WHERE O.XTYPE = 'U'
|
||||
AND EXISTS(SELECT 1 FROM SYSOBJECTS WHERE XTYPE = 'PK' AND NAME = I.NAME)
|
||||
AND EXISTS(SELECT 1 FROM ${dbName}..SYSOBJECTS WHERE XTYPE = 'PK' AND NAME = I.NAME)
|
||||
AND O.NAME=#{tableName}
|
||||
)
|
||||
SELECT (
|
||||
SELECT IS_IDENTITY FROM SYS.ALL_COLUMNS
|
||||
WHERE SYS.ALL_COLUMNS.NAME=SYSCOLUMNS.NAME AND OBJECT_ID = OBJECT_ID(#{tableName})
|
||||
SELECT IS_IDENTITY FROM ${dbName}.SYS.ALL_COLUMNS
|
||||
WHERE ${dbName}.SYS.ALL_COLUMNS.NAME=SYSCOLUMNS.NAME AND OBJECT_ID = OBJECT_ID('${dbName}..${tableName}')
|
||||
) selfIncrement, SYSCOLUMNS.NAME name,SYSTYPES.NAME type,Iif(SYSCOLUMNS.ISNULLABLE=1,'1','0') nullable,
|
||||
SYSCOLUMNS.LENGTH length,PRIMARYINFO.ISPRAMARY primaryKey
|
||||
FROM SYSCOLUMNS
|
||||
FROM ${dbName}..SYSCOLUMNS
|
||||
LEFT JOIN PRIMARYINFO ON PRIMARYINFO.COLUMNNAME=NAME
|
||||
LEFT JOIN SYSTYPES ON SYSCOLUMNS.XUSERTYPE = SYSTYPES.XUSERTYPE
|
||||
WHERE SYSCOLUMNS.ID = OBJECT_ID(#{tableName})
|
||||
LEFT JOIN ${dbName}..SYSTYPES ON SYSCOLUMNS.XUSERTYPE = SYSTYPES.XUSERTYPE
|
||||
WHERE SYSCOLUMNS.ID = OBJECT_ID('${dbName}..${tableName}')
|
||||
</select>
|
||||
|
||||
<select id="getTableAndColumnBySearch" resultMap="QueryTableColumnDescDtoMap">
|
||||
SELECT top 500
|
||||
A.name AS TABLE_NAME,B.name AS COLUMN_NAME,C.value AS DESCRIPTION
|
||||
FROM sys.tables A
|
||||
INNER JOIN sys.columns B ON B.object_id = A.object_id
|
||||
LEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_id
|
||||
FROM ${dbName}.sys.tables A
|
||||
INNER JOIN ${dbName}.sys.columns B ON B.object_id = A.object_id
|
||||
LEFT JOIN ${dbName}.sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_id
|
||||
WHERE convert(nvarchar(max),C.value) like #{searchText} OR B.name like #{searchText}
|
||||
</select>
|
||||
|
||||
<select id="getTableDescList" resultType="com.zyplayer.doc.db.framework.db.dto.TableDescDto">
|
||||
select 'TABLEDESC_SYS' as tableName, value as description, major_id as majorId
|
||||
from sys.extended_properties
|
||||
from ${dbName}.sys.extended_properties
|
||||
WHERE minor_id=0
|
||||
<if test="tableName != null">
|
||||
and major_id=object_id(#{tableName})
|
||||
@@ -73,24 +73,24 @@
|
||||
</select>
|
||||
|
||||
<insert id="updateTableDesc">
|
||||
IF ((SELECT COUNT(*) from fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', #{tableName}, NULL, NULL)) > 0)
|
||||
EXEC sp_updateextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
IF ((SELECT COUNT(*) from ${dbName}..fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', #{tableName}, NULL, NULL)) > 0)
|
||||
EXEC ${dbName}..sp_updateextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
, @level0type = 'SCHEMA', @level0name = 'dbo'
|
||||
, @level1type = 'TABLE', @level1name = #{tableName}
|
||||
ELSE
|
||||
EXEC sp_addextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
EXEC ${dbName}..sp_addextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
, @level0type = 'SCHEMA', @level0name = 'dbo'
|
||||
, @level1type = 'TABLE', @level1name = #{tableName}
|
||||
</insert>
|
||||
|
||||
<insert id="updateTableColumnDesc">
|
||||
IF ((SELECT COUNT(*) from fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', #{tableName}, 'COLUMN', #{columnName})) > 0)
|
||||
EXEC sp_updateextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
IF ((SELECT COUNT(*) from ${dbName}..fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', #{tableName}, 'COLUMN', #{columnName})) > 0)
|
||||
EXEC ${dbName}..sp_updateextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
, @level0type = 'SCHEMA', @level0name = 'dbo'
|
||||
, @level1type = 'TABLE', @level1name = #{tableName}
|
||||
, @level2type = 'COLUMN', @level2name = #{columnName}
|
||||
ELSE
|
||||
EXEC sp_addextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
EXEC ${dbName}..sp_addextendedproperty @name = 'MS_Description', @value = #{newDesc}
|
||||
, @level0type = 'SCHEMA', @level0name = 'dbo'
|
||||
, @level1type = 'TABLE', @level1name = #{tableName}
|
||||
, @level2type = 'COLUMN', @level2name = #{columnName}
|
||||
|
||||
@@ -370,6 +370,20 @@ public abstract class DbBaseService {
|
||||
return sqlSb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定数据库的SQL
|
||||
*
|
||||
* @return use db
|
||||
* @author 暮光:城中城
|
||||
* @since 2020年4月24日
|
||||
*/
|
||||
public String getUseDbSql(String dbName) {
|
||||
if (StringUtils.isNotBlank(dbName)) {
|
||||
return "use " + dbName;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取查询总条数的SQL
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user