sql执行器开发

This commit is contained in:
暮光:城中城
2019-08-21 23:17:04 +08:00
parent f0920be5a5
commit 1f7cd7ad6c
18 changed files with 608 additions and 32 deletions

View File

@@ -1,19 +1,35 @@
package com.zyplayer.doc.db.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.core.util.StringUtil;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.DbFavorite;
import com.zyplayer.doc.data.repository.manage.entity.DbHistory;
import com.zyplayer.doc.data.repository.manage.mapper.DbFavoriteMapper;
import com.zyplayer.doc.data.service.manage.DbFavoriteService;
import com.zyplayer.doc.data.service.manage.DbHistoryService;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* sql执行器
@@ -28,13 +44,23 @@ public class DbSqlExecutorController {
@Resource
SqlExecutor sqlExecutor;
@Resource
DbHistoryService dbHistoryService;
@Resource
DbFavoriteService dbFavoriteService;
@PostMapping(value = "/execute")
public ResponseJson execute(Long sourceId, String executeId, String sql, String params) {
Map<String, Object> paramMap = JSON.parseObject(params);
if (StringUtils.isBlank(sql)) {
return DocDbResponseJson.warn("执行的SQL不能为空");
}
try {
Map<String, Object> paramMap = JSON.parseObject(params);
ExecuteResult executeResult = sqlExecutor.execute(sourceId, executeId, sql, paramMap);
String resultJsonStr = JSON.toJSONString(executeResult, SerializerFeature.WriteMapNullValue);
SerializeConfig mapping = new SerializeConfig();
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
mapping.put(Timestamp.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
String resultJsonStr = JSON.toJSONString(executeResult, mapping, SerializerFeature.WriteMapNullValue);
return DocDbResponseJson.ok(resultJsonStr);
} catch (Exception e) {
return DocDbResponseJson.warn(StringUtil.getException(e));
@@ -46,5 +72,43 @@ public class DbSqlExecutorController {
sqlExecutor.cancel(executeId);
return DocDbResponseJson.ok();
}
@PostMapping(value = "/history/list")
public ResponseJson historyList() {
UpdateWrapper<DbHistory> wrapper = new UpdateWrapper<>();
wrapper.orderByDesc("id");
List<DbHistory> favoriteList = dbHistoryService.list(wrapper);
return DocDbResponseJson.ok(favoriteList);
}
@PostMapping(value = "/favorite/list")
public ResponseJson favoriteList() {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
UpdateWrapper<DbFavorite> wrapper = new UpdateWrapper<>();
wrapper.eq("create_user_id", currentUser.getUserId());
wrapper.eq("yn", 1);
wrapper.orderByDesc("id");
List<DbFavorite> favoriteList = dbFavoriteService.list(wrapper);
return DocDbResponseJson.ok(favoriteList);
}
@PostMapping(value = "/favorite/add")
public ResponseJson addFavorite(DbFavorite dbFavorite) {
Integer yn = Optional.ofNullable(dbFavorite.getYn()).orElse(1);
if (yn == 1 && StringUtils.isBlank(dbFavorite.getContent())) {
return DocDbResponseJson.warn("收藏的SQL不能为空");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (dbFavorite.getId() != null && dbFavorite.getId() > 0) {
dbFavoriteService.updateById(dbFavorite);
} else {
dbFavorite.setCreateTime(new Date());
dbFavorite.setCreateUserId(currentUser.getUserId());
dbFavorite.setCreateUserName(currentUser.getUsername());
dbFavorite.setYn(1);
dbFavoriteService.save(dbFavorite);
}
return DocDbResponseJson.ok();
}
}

View File

@@ -1,6 +1,12 @@
package com.zyplayer.doc.db.framework.db.mapper.base;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.DbFavorite;
import com.zyplayer.doc.data.repository.manage.entity.DbHistory;
import com.zyplayer.doc.data.service.manage.DbFavoriteService;
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 com.zyplayer.doc.db.framework.db.interceptor.SqlLogUtil;
@@ -33,6 +39,8 @@ public class SqlExecutor {
@Resource
DatabaseRegistrationBean databaseRegistrationBean;
@Resource
DbHistoryService dbHistoryService;
// 执行中的PreparedStatement信息用于强制取消执行
private static final Map<String, PreparedStatement> statementMap = new ConcurrentHashMap<>();
@@ -80,7 +88,11 @@ public class SqlExecutor {
StaticSqlSource parse = (StaticSqlSource) sqlSourceBuilder.parse(sql, Object.class, paramMap);
BoundSql boundSql = parse.getBoundSql(new Object());
sql = boundSql.getSql();
logger.info("sql ==> {}", SqlLogUtil.getSqlString(paramMap, boundSql));
String sqlStr = SqlLogUtil.getSqlString(paramMap, boundSql);
logger.info("sql ==> {}", sqlStr);
// 保留历史记录
dbHistoryService.saveHistory(sqlStr);
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
PreparedStatement preparedStatement = null;
// 执行查询
@@ -100,8 +112,8 @@ public class SqlExecutor {
while (resultSet.next()) {
Map<String, Object> resultMap = new LinkedHashMap<>();
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 0; i < metaData.getColumnCount(); i++) {
resultMap.put(metaData.getColumnName(i + 1), resultSet.getObject(i + 1));
for (int i = 1; i < metaData.getColumnCount() + 1; i++) {
resultMap.put(metaData.getColumnName(i), resultSet.getObject(i));
}
if (handler != null) {
handler.handleResult(resultMap);