mysql 动态连接数据源创建表

1、

@Controller
@RequestMapping("api/table")
@Api(tags = "创建表")
public class CreateTableControlelr {

    //private static final Logger LOGGER	= LoggerFactory.getLogger(CreateTableControlelr.class);

    @Autowired
    private SysMysqlCreateTableManager sysMysqlCreateTableManager;

    @Autowired
    private JobDatasourceService datasourceService;


    /**
     * 创建表
     */
    @PostMapping("/create")
    @ResponseBody
    public ReturnT<String> createTable(@RequestBody TableEntity table){
        JobDatasource datasource = datasourceService.getById(table.getId());
        if(null!=table && StringUtils.isNotBlank(table.getTableName()) && table.getColumns().size()>0){
            try {
                //检查表是否存在,若不存在,则创建,若存在,则给出提示
                if(!sysMysqlCreateTableManager.TableIsExist(table.getTableName(),datasource)){
                    List<CreateTableParam> list  = table.getColumns();
                    Map<String,List<CreateTableParam>> map = new HashMap<>();
                    List<CreateTableParam> columnList = new ArrayList<>();
                    columnList.addAll(list);
                    map.put(table.getTableName(), columnList);
                    ReturnT<String> tableByMap = sysMysqlCreateTableManager.createTableByMap(map, datasource);
                    return tableByMap;
                }else{
                    return new ReturnT<>(ReturnT.FAIL_CODE, (I18nUtil.getString("table_already_exists")));
                }
            } catch (Exception e) {
                return new ReturnT<>(ReturnT.FAIL_CODE, (I18nUtil.getString("crate_table_exception"))+e.getMessage());
            }
        }else{
            return new ReturnT<>(ReturnT.FAIL_CODE, (I18nUtil.getString("table_or_column_is_null")));
        }
    }
import com.wugui.datatx.core.biz.model.ReturnT;
import com.wugui.datax.admin.entity.JobDatasource;
import com.wugui.datax.admin.entity.tables.CreateTableParam;
import com.wugui.datax.admin.mapper.BookTypeMapper;
import com.wugui.datax.admin.util.AESUtil;
import com.wugui.datax.admin.util.JdbcUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;
import java.util.Map.Entry;

@Component
public class SysMysqlCreateTableManager {
    private static final Logger LOGGER = LoggerFactory.getLogger(SysMysqlCreateTableManager.class);

    @Autowired
    private BookTypeMapper bookTypeDAO;

    /**
     * 根据map结构创建表
     *
     * @param newTableMap
     */
    public ReturnT<String> createTableByMap(Map<String, List<CreateTableParam>> newTableMap,JobDatasource datasource) {
        // 做创建表操作
        int i = 0;
        if (newTableMap.size() > 0) {
            for (Entry<String, List<CreateTableParam>> entry : newTableMap.entrySet()) {
                i++;
                Map<String, List<CreateTableParam>> map = new HashMap<String, List<CreateTableParam>>();
                map.put(entry.getKey(), entry.getValue());
                LOGGER.info("开始创建表:" + entry.getKey() + " 字段:" + entry.getValue());
                String sql = createSql(map);
                return createConnect(datasource, sql,"create");
            }
        }
        return   new ReturnT<>(ReturnT.FAIL_CODE, "创建表字段为空");
    }

    /**
     * 查看表是否存在
     *
     * @param tableName
     */
    public boolean TableIsExist(String tableName,JobDatasource datasource) {
        boolean flag = false;
        if (StringUtils.isNotBlank(tableName)) {
            String sql = "select count(1) from information_schema.tables where table_name = '"+tableName+"'";
            ReturnT<String> select = createConnect(datasource, sql, "select");
            if (select.getStatus()==500) {
                flag = true;
            }
        }
        return flag;
    }

    public ReturnT<String> createConnect(JobDatasource jobDatasource, String sql,String type) {
        String jdbcUrl = jobDatasource.getJdbcUrl();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet resultSet = null;
        try {
            Class.forName(jobDatasource.getJdbcDriverClass());
            con = DriverManager.getConnection(jdbcUrl,
                    AESUtil.decrypt(jobDatasource.getJdbcUsername()),
                    AESUtil.decrypt(jobDatasource.getJdbcPassword()));
            stmt = con.prepareStatement(sql);

            //返回false代表更新或者插入操作,返回true代表查询
            if (type.equals("create")){
                stmt.execute();
            }else {
                 resultSet = stmt.executeQuery();
                int anInt =0;
                while (resultSet.next()){
                     anInt = resultSet.getInt(1);
                }
                if (anInt==1){
                    return  new ReturnT<>(ReturnT.FAIL_CODE, "表已经存在,创建失败");
                }
            }
            return  new ReturnT<>(ReturnT.SUCCESS_CODE, "创建成功");
        } catch (Exception e) {
            LOGGER.error("create table found error :[{}]",e.getMessage());
            return  new ReturnT<>(ReturnT.FAIL_CODE, "create table fail"+e.getMessage());
        } finally {
            if (resultSet!=null){
                JdbcUtils.close(resultSet);
            }
            JdbcUtils.close(stmt);
            JdbcUtils.close(con);
        }
    }

    /**
     * @param map 拼接创建表的sql
     * @return
     */
    public String createSql(Map<String, List<CreateTableParam>> map) {
        Set<String> set = map.keySet();
        List<String> keyList = new ArrayList<>();
        keyList.addAll(set);
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("create table `").append(keyList.get(0)).append("` (");
        List<CreateTableParam> list = map.get(keyList.get(0));
        for (CreateTableParam param : list) {
            if (param.getFileTypeLength() == 0) {
                stringBuilder.append("`").append(param.getFieldName()).append("`").append(" ");
                stringBuilder.append(param.getFieldType()).append(" ");
            }
            if (param.getFieldDecimalLength() == 1) {
                stringBuilder.append("`").append(param.getFieldName()).append("`").append(" ");
                stringBuilder.append(param.getFieldType());
                stringBuilder.append("(").append(param.getFieldLength()).append(")").append(" ");
            }
            if (param.getFieldDecimalLength() == 2) {
                stringBuilder.append("`").append(param.getFieldName()).append("`").append(" ");
                stringBuilder.append(param.getFieldType());
                stringBuilder.append("(").append(param.getFieldLength()).append(",");
                stringBuilder.append(param.getFieldDecimalLength()).append(")").append(" ");
            }
            if (!param.isFieldIsNull()) {
                stringBuilder.append("NOT NULL").append(" ");
            }
            if (param.isFieldIsAutoIncrement()) {
                stringBuilder.append("AUTO_INCREMENT").append(" ");
            }
            if (!param.isFieldIsAutoIncrement() && param.getFieldDefaultValue() != null) {
                stringBuilder.append("DEFAULT ");
                stringBuilder.append(param.getFieldDefaultValue()).append(" ");
            }
            if (param.isFieldIsKey()) {
                stringBuilder.append(",PRIMARY KEY (`");
                stringBuilder.append(param.getFieldName());
                stringBuilder.append("`)").append(" ");
            }
            if (param.isFieldIsUnique()) {
                stringBuilder.append(",UNIQUE KEY (`");
                stringBuilder.append(param.getFieldName());
                stringBuilder.append("`)").append(" ");
            }
        }
        stringBuilder.append(");");
        return stringBuilder.toString();
    }

@Data
public class CreateTableParam {

		/**
		 * 字段名
		 */
		private String	fieldName;
		


		/**
		 * 字段类型
		 */
		private String	fieldType;

		/**
		 * 类型长度
		 */
		private int		fieldLength;

		/**
		 * 类型小数长度
		 */
		private int		fieldDecimalLength;

		/**
		 * 字段是否非空
		 */
		private boolean	fieldIsNull;

		/**
		 * 字段是否是主键
		 */
		private boolean	fieldIsKey;

		/**
		 * 主键是否自增
		 */
		private boolean	fieldIsAutoIncrement;

		/**
		 * 字段默认值
		 */
		private String	fieldDefaultValue;

		/**
		 * 该类型需要几个长度(例如,需要小数位数的,那么总长度和小数长度就是2个长度)一版只有0、1、2三个可选值,自动从配置的类型中获取的
		 */
		private int		fileTypeLength;

		/**
		 * 值是否唯一
		 */
		private boolean	fieldIsUnique;

		
		


		@Override
		public String toString() {
			return "CreateTableParam [fieldName=" + fieldName + ", fieldType=" + fieldType + ", fieldLength="
					+ fieldLength + ", fieldDecimalLength=" + fieldDecimalLength + ", fieldIsNull=" + fieldIsNull
					+ ", fieldIsKey=" + fieldIsKey + ", fieldIsAutoIncrement=" + fieldIsAutoIncrement
					+ ", fieldDefaultValue=" + fieldDefaultValue + ", fileTypeLength=" + fileTypeLength
					+ ", fieldIsUnique=" + fieldIsUnique + "]";
		}
@Data
public class TableEntity implements Serializable {
	
	public TableEntity() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 
	 */
	private static final long serialVersionUID = -3271257418286413963L;

	private String id;
	
	/*表名*/
	private String tableName;
	/*表字段集合*/
	private List<CreateTableParam> columns;



	@Override
	public String toString() {
		return "TableEntity [tableName=" + tableName + ", columns=" + columns + "]";
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值