|
|
@@ -0,0 +1,56 @@
|
|
|
+package cn.seecoder.web.service.impl.sql;
|
|
|
+
|
|
|
+import cn.seecoder.web.service.sql.SqlService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.sql.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class SqlServiceImpl implements SqlService {
|
|
|
+
|
|
|
+ private static final String DB_URL_PREFIX = "jdbc:mysql://";
|
|
|
+
|
|
|
+ private static final String DB_URL_SUFFIX = "?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false";
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String execute(String url, String db,String username, String password, String sql) {
|
|
|
+ String dbUrl = DB_URL_PREFIX + url + "/" + db + DB_URL_SUFFIX;
|
|
|
+ try(Connection conn = DriverManager.getConnection(dbUrl, username, password);
|
|
|
+ Statement stmt = conn.createStatement();
|
|
|
+ ) {
|
|
|
+ //只有select语句需要解析 resultset
|
|
|
+ if ("select".equals(sql.trim().substring(0,6).toLowerCase(Locale.ROOT))){
|
|
|
+ ResultSet rs = stmt.executeQuery(sql);
|
|
|
+ return "Boolean\n"+ convertResultSet2List(rs);
|
|
|
+ } else {
|
|
|
+ return "Boolean\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (SQLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("url: {}\nsql: {}\nsql state: {}", dbUrl,sql,e.getMessage());
|
|
|
+ return "False\n"+e.getMessage();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private List<List<String>> convertResultSet2List(ResultSet rs) throws SQLException {
|
|
|
+ ResultSetMetaData meta = rs.getMetaData();
|
|
|
+ List<List<String>> list = new ArrayList<>();
|
|
|
+ while(rs.next()){
|
|
|
+ List<String> row = new ArrayList<>(meta.getColumnCount());
|
|
|
+ for (int i = 0; i < meta.getColumnCount(); i++) {
|
|
|
+ row.add(rs.getString(i+1));
|
|
|
+ }
|
|
|
+ list.add(row);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|