All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.gallery.db.factory.AbstractDataSourceCtr Maven / Gradle / Ivy

package io.gallery.db.factory;

import io.gallery.db.bean.DataBaseBO;
import io.gallery.db.bean.DataBaseConnection;
import io.gallery.db.bean.DataBaseGenericPage;
import io.gallery.db.util.DBT;
import io.gallery.db.util.DataBaseAjaxResultContext;
import io.gallery.db.util.DataBaseTools;
import io.gallery.db.util.DataSourceUtil;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.*;

/**
 * 数据源
 */
public abstract class AbstractDataSourceCtr {
    private final Log logger = LogFactory.getLog(getClass());

    @PostMapping(value = "{dsid}/{table}")
    @ApiOperation(value = "新增记录", notes = "数据")
    @ResponseBody
    public Object add(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                      @ApiParam(value = "表名", required = true) @PathVariable String table,
                      @RequestBody Map vo,
                      DataBaseAjaxResultContext result) {
        DataBaseConnection conn = getDataBaseConnection(dsid);
        AbstractDataBase adb = DBT.getDataBase(conn.getDriverClassName());
        NamedParameterJdbcTemplate source = DataSourceUtil.npsource(conn);
        DataBaseBO dbo = DataBaseBO.init().setId(dsid).setTableName(table).setVo(vo).buildForInsert();
        try {
            result.setSuccess(adb.insert(source, dbo) > 0);
            result.setResult(vo);
        } catch (Exception e) {
            logger.error(e.getMessage());
            result.setSuccess(false);
        }
        return result;
    }

    @DeleteMapping(value = "{dsid}/{table}/{key}/{id}")
    @ApiOperation(value = "根据主键删除记录", notes = "数据")
    @ResponseBody
    public Object delete(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                         @ApiParam(value = "表名", required = true) @PathVariable String table,
                         @ApiParam(value = "主键字段名", required = true) @PathVariable String key,
                         @ApiParam(value = "主键", required = true) @PathVariable String id,
                         DataBaseAjaxResultContext result) {
        DataBaseConnection conn = getDataBaseConnection(dsid);
        AbstractDataBase adb = DBT.getDataBase(conn.getDriverClassName());
        NamedParameterJdbcTemplate source = DataSourceUtil.npsource(conn);
        DataBaseBO dbo = DataBaseBO.init().setId(dsid).setTableName(table).setKeyName(key).setKeyValue(id).buildForDelete();
        try {
            result.setResult(adb.delete(source, dbo));
        } catch (Exception e) {
            result.setSuccess(false);
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    @DeleteMapping(value = "{dsid}/{table}/{id}")
    @ApiOperation(value = "根据主键删除记录", notes = "数据")
    @ResponseBody
    public Object delete(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                         @ApiParam(value = "表名", required = true) @PathVariable String table,
                         @ApiParam(value = "主键", required = true) @PathVariable String id,
                         DataBaseAjaxResultContext result) {
        return delete(dsid, table, "id", id, result);
    }

    @PutMapping(value = "{dsid}/{table}/{key}/{id}")
    @ApiOperation(value = "根据主键修改记录", notes = "数据")
    @ResponseBody
    public Object edit(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                       @ApiParam(value = "表名", required = true) @PathVariable String table,
                       @ApiParam(value = "主键字段名", required = true) @PathVariable String key,
                       @ApiParam(value = "主键", required = true) @PathVariable String id,
                       @RequestBody Map vo,
                       DataBaseAjaxResultContext result) {
        DataBaseBO dbo = DataBaseBO.init().setId(dsid).setTableName(table).setKeyName(key).setKeyValue(id).setVo(vo).buildForUpdate();
        DataBaseConnection conn = getDataBaseConnection(dsid);
        AbstractDataBase adb = DBT.getDataBase(conn.getDriverClassName());
        NamedParameterJdbcTemplate source = DataSourceUtil.npsource(conn);
        try {
            result.setResult(adb.update(source, dbo));
        } catch (Exception e) {
            result.setSuccess(false);
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    @PutMapping(value = "{dsid}/{table}/{id}")
    @ApiOperation(value = "根据主键修改记录", notes = "数据")
    @ResponseBody
    public Object edit(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                       @ApiParam(value = "表名", required = true) @PathVariable String table,
                       @ApiParam(value = "主键", required = true) @PathVariable String id,
                       @RequestBody Map vo,
                       DataBaseAjaxResultContext result) {
        return edit(dsid, table, "id", id, vo, result);
    }

    @GetMapping(value = "{dsid}/{table}/{key}/{id}")
    @ApiOperation(value = "根据主键获取信息", notes = "数据")
    @ResponseBody
    public Object get(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                      @ApiParam(value = "表名", required = true) @PathVariable String table,
                      @ApiParam(value = "主键字段名", required = true) @PathVariable String key,
                      @ApiParam(value = "主键", required = true) @PathVariable String id) {
        DataBaseConnection conn = getDataBaseConnection(dsid);
        AbstractDataBase adb = DBT.getDataBase(conn.getDriverClassName());
        NamedParameterJdbcTemplate source = DataSourceUtil.npsource(conn);
        DataBaseBO dbo = DataBaseBO.init().setId(dsid).setTableName(table).setKeyName(key).setKeyValue(id).buildForGet();
        return adb.get(source, dbo);
    }

    @GetMapping(value = "{dsid}/{table}/{id}")
    @ApiOperation(value = "根据主键获取信息", notes = "数据")
    @ResponseBody
    public Object get(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                      @ApiParam(value = "表名", required = true) @PathVariable String table,
                      @ApiParam(value = "主键", required = true) @PathVariable String id) {
        return get(dsid, table, "id", id);
    }


    @RequestMapping(value = "{dsid}/{table}/list", method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(value = "根据数据源id、表名获取记录列表", notes = "数据")
    @ResponseBody
    public Object list(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                       @ApiParam(value = "表名", required = true) @PathVariable String table,
                       DataBaseGenericPage input,
                       @RequestBody(required = false) Map body) {
        HttpServletRequest request = DBT.getRequest();
        Map params = DBT.getParamMap();
        DBT.merge(input, params);
        if ("POST".equalsIgnoreCase(request.getMethod())) {
            DBT.merge(body, params);
            input.setTree(Optional.ofNullable((Boolean) body.get("tree")).orElse(false));
            input.setPage(Optional.ofNullable((Boolean) body.get("page")).orElse(true));
        }
        DataBaseConnection conn = getDataBaseConnection(dsid);
        AbstractDataBase adb = DBT.getDataBase(conn.getDriverClassName());
        NamedParameterJdbcTemplate source = DataSourceUtil.npsource(conn);
        DataBaseBO dbo = DataBaseBO.init().setId(dsid).setTableName(table).setVo(params).buildForSelect();
        input.setData(adb.select(source, dbo));
        input.setTotal(adb.count(source, dbo));
        input.setRecordsFiltered(input.getTotal());
        return input;
    }

    @RequestMapping(value = "{dsid}/execute", method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(value = "根据数据源id、表名获取记录列表", notes = "数据")
    @ResponseBody
    public Object execute(@ApiParam(value = "数据源id", required = true) @PathVariable String dsid,
                          DataBaseGenericPage input,
                          @RequestBody(required = false) Map body,
                          DataBaseAjaxResultContext result) {
        HttpServletRequest request = DBT.getRequest();
        Map params = DataBaseTools.getParamStringMap(input, request);
        DBT.merge(input, params);
        if ("POST".equalsIgnoreCase(request.getMethod())) {
            DBT.merge(body, params);
        }
        DataBaseConnection conn = getDataBaseConnection(dsid);
        JdbcTemplate source = DataSourceUtil.source(conn);
        String sql = Optional.ofNullable(params.get("sql")).orElse(params.get("test"));
        List>> list = null;
        try {
            if (DBT.isNotNull(sql)) {
                list = source.execute(sql, (PreparedStatementCallback>>>) ps -> {
                    boolean resultsAvailable = ps.execute();
                    List>> listResult = new ArrayList<>();
                    //遍历结果集
                    while (resultsAvailable) {
                        ResultSet resultSet = ps.getResultSet();
                        List> subList = new ArrayList<>();
                        while (resultSet.next()) {
                            ResultSetMetaData meta = resultSet.getMetaData();
                            int colcount = meta.getColumnCount();
                            LinkedHashMap map = new LinkedHashMap<>();
                            for (int i = 1; i <= colcount; i++) {
                                String name = meta.getColumnLabel(i);
                                map.put(name, resultSet.getObject(i));
                            }
                            subList.add(map);
                        }
                        listResult.add(subList);
                        resultsAvailable = ps.getMoreResults();
                    }
                    return listResult;
                });
            } else {
                result.setSuccess(false);
            }
        } catch (Exception e) {
            if (conn != null && conn.getId() != null) {
                logger.error("[" + conn.getDriverClassName() + "] does not support:" + e.getMessage());
            } else {
                logger.debug("connection is not exist");
            }
            result.setResult(e.getMessage());
            result.setSuccess(false);
        }
        if (DBT.isNotNull(sql) && result.getSuccess()) {
            result.setResult(list);
        }
        return result;
    }

    /*--------------------------------------------------------------------------------------------------*/

    @GetMapping("db/{id}/list")
    @ApiOperation(value = "根据数据源id获取所有库信息", notes = "数据")
    @ResponseBody
    public Object dblist(@ApiParam(value = "数据源id", required = true) @PathVariable String id) {
        DataBaseConnection conn = getDataBaseConnection(id);
        return DBT.getDataBase(conn.getDriverClassName()).listDb(DataSourceUtil.npsource(conn));
    }

    @GetMapping("table/{id}/{db}/list")
    @ApiOperation(value = "根据数据源id、数据库名获取所有表信息", notes = "数据")
    @ResponseBody
    public Object tablelist(@ApiParam(value = "数据源id", required = true) @PathVariable String id,
                            @ApiParam(value = "数据库名") @PathVariable String db) {
        DataBaseConnection conn = getDataBaseConnection(id);
        return DBT.getDataBase(conn.getDriverClassName()).listTable(DataSourceUtil.npsource(conn), db);
    }

    @GetMapping("column/{id}/{db}/{table}/list")
    @ApiOperation(value = "根据数据源id、数据库名、表名获取所有字段信息", notes = "数据")
    @ResponseBody
    public Object columnlist(@ApiParam(value = "数据源id", required = true) @PathVariable String id,
                             @ApiParam(value = "数据库名") @PathVariable String db,
                             @ApiParam(value = "表名", required = true) @PathVariable String table) {
        DataBaseConnection conn = getDataBaseConnection(id);
        return DBT.getDataBase(conn.getDriverClassName()).listColumns(DataSourceUtil.npsource(conn), db, table);
    }

    @ApiOperation(value = "根据数据源id获取数据源信息", notes = "数据")
    public abstract DataBaseConnection getDataBaseConnection(String id);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy