Java代码中实现创建MySQL数据库表

Java代码中实现创建数据库表

近期闲来无事,就想起来使用代码去实现创建数据库表,废话不多说,直接上代码


/**
 * @Author Li
 * @data 2022/1/6 14:50
 * @description 创建数据库表工具类
 */
@Slf4j
@Component
public class CreateTable {

    @Autowired
    private ISysMeterService sysMeterService;

    private static CreateTable createTable;

    /**
     * 初始化注入的 service
     */
    @PostConstruct
    public void init() {
        createTable= this;
        createTable.sysMeterService = this.sysMeterService;
    }

    private static String driverClassName;
    private static String url;
    private static String username;
    private static String password;



    /**
     *
     */
    @Value("${spring.datasource.driverClassName}")
    public void setDriverClassName(String driverClassName) {
        CreateTable.driverClassName = driverClassName;
    }

    @Value("${spring.datasource.druid.master.url}")
    public void setUrl(String url) {
        CreateTable.url = url;
    }

    @Value("${spring.datasource.druid.master.username}")
    public void setUsername(String username) {
        CreateTable.username = username;
    }

    @Value("${spring.datasource.druid.master.password}")
    public void setPassword(String password) {
        CreateTable.password = password;
    }

    /*String*/
    public static final String TYPE_STRING = "String";

    /*Integer*/
    public static final String TYPE_INTEGER = "Integer";

    /*Double*/
    public static final String TYPE_DOUBLE = "Double";

    /*Date*/
    public static final String TYPE_Date = "Date";

    /*BigDecimal*/
    public static final String TYPE_BigDecimal = "BigDecimal";

    /*text*/
    public static final String TYPE_text = "text";

    /**
     * 连接MySQL数据库
     */
    public static  Map<String, Object> connectMySQL(){
        Connection connection = null;
        Statement statement = null;
        Map<String, Object> map = new HashMap<>();
        try {
            // 连接数据库
            Class.forName(driverClassName);
            // 获取数据库连接
            connection = DriverManager.getConnection(url, username, password);
            // 根据连接获取可执行Statement
            statement = connection.createStatement();

            map.put("connection",connection);
            map.put("statement",statement);
            return map;
        }catch (Exception e){
            e.printStackTrace();
            log.error("CreateTable 类中,连接数据库错误!");
        }
        return null;
    }


    /**
     * 执行SQL语句
     * @param sysMeter
     * @return
     */
    public static String executeSQL(SysMeter sysMeter) throws SQLException {
        Connection conn = null;
        Statement state = null;
        try {
            Map<String, Object> map = connectMySQL();
            if (!StringUtils.isNotNull(map)){
                return "获取数据库连接失败...";
            }
            // 获取数据库连接
            conn = (Connection)map.get("connection");
            // 获取SQL执行环境
            state = (Statement)map.get("statement");
            // 获取数据库表名
            ResultSet tables = conn.getMetaData().getTables(null, null, sysMeter.getMeterName(), null);
            // 是否存在表
            if (tables.next()){
                // 存在不创建-存在删除表(强制同步)
                String sqlDropTable = createSQLDropTable(sysMeter.getMeterName());
                System.out.println("--------------删除表sql开始---------------");
                System.out.println(sqlDropTable);
                System.out.println("--------------删除表sql结束---------------");
                // 删除表
                state.executeUpdate(sqlDropTable);
            }
            String sql = createSQL(sysMeter);
            System.out.println("--------------创建表sql开始---------------");
            System.out.println(sql);
            System.out.println("--------------创建表sql结束---------------");
            // 创建表
            state.executeUpdate(sql);

            // 修改为已同步
            SysMeter meter = new SysMeter();
            meter.setId(sysMeter.getId());
            meter.setSynState("1");
            createTable.sysMeterService.updateById(meter);

        }catch (Exception e){
            e.printStackTrace();
            return "表"+ sysMeter.getMeterName() +"同步失败!";
        }finally {
            // 释放资源
            state.close();
            conn.close();
        }
        return "表"+ sysMeter.getMeterName() +"同步成功";
    }

    /**
     * 数据库是否存在表名
     * @param tableName
     * @return true 存在 & 错误
     * @return false 不存在
     */
    public static boolean existsTable(String tableName) throws SQLException {
        Connection conn = null;
        Statement state = null;
        // 获取数据库连接和SQL执行环境
        try {
            Map<String, Object> map = connectMySQL();
            if (!StringUtils.isNotNull(map)){
                return true;
            }
            // 获取数据库连接
            conn = (Connection)map.get("connection");
            // 获取SQL执行环境
            state = (Statement)map.get("statement");
            // 获取数据库表名
            ResultSet tables = conn.getMetaData().getTables(null, null,tableName, null);
            if (tables.next()){
                return true;
            }
        }catch (Exception e){
            e.printStackTrace();
            log.error("验证数据库表名是否能存在错误!");
            return true;
        }finally {
            state.close();
            conn.close();
        }
        return false;
    }


    /**
     * 创建生成表的SQL
     * @param sysMeter
     * @return
     */
    public static String createSQL(SysMeter sysMeter){
        // 创建主键集合
        List<String>  priKeyList = new ArrayList<String>();
        // 创建 StringBuffer 拼接sql
        StringBuffer sb = new StringBuffer();
        sb.append("CREATE TABLE `"+ sysMeter.getMeterName() +"` (\n");
        List<SysMeterAttached> meterInfo = sysMeter.getMeterInfo();
        for (int i = 0; i < meterInfo.size(); i++) {
            // 当前条数据
            SysMeterAttached sma = meterInfo.get(i);
            // 判断数据类型
            String fieldType = judgeDataType(sma.getFieldType());
            sb.append(""+ sma.getFieldName() +"");
            if ("double".equals(fieldType)){
                // 特殊处理 `age` double(23,0) DEFAULT NULL COMMENT '年龄',
                // 追加列
                sb.append(" "+fieldType+"("+sma.getFieldLength()+","+ sma.getDecimalPoint() +") ");
            }else if ("decimal".equals(fieldType)){
                // 追加列
                sb.append(" "+fieldType+"("+sma.getFieldLength()+","+ sma.getDecimalPoint() +") ");
            }else {
                // 追加列
                sb.append(" "+fieldType+"("+sma.getFieldLength()+") ");
            }

            // 判断是否为主键 - 等于1是主键
            if ("1".equals(sma.getPrimaryKey())){
                // 字段名称放进去
                priKeyList.add(sma.getFieldName());
                // 判断是否允许为空 等于1是允许为空; 只有不为空的时候,需要设置
                if (!"1".equals(sma.getIsNull())){
                    sb.append("NOT NULL COMMENT '"+sma.getFieldRemark()+"',\n");
                }
                // 如果到了最后一条,并且只有一个主键时
                if (i >= meterInfo.size()-1 && priKeyList.size() == 1){
                    sb.append("PRIMARY KEY (`"+ priKeyList.get(0) +"`)");
                    sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");

                }else if (i >= meterInfo.size() -1 && priKeyList.size() > 1){
                    // 最后一条,并且存在多个主键时
                    sb.append("PRIMARY KEY (");
                    // 遍历主键集合
                    for (int j = 0; j < priKeyList.size(); j++) {
                         // 最后一个时
                        if (j == priKeyList.size() -1){
                            sb.append("`"+ priKeyList.get(j) +"`) USING BTREE \n");
                        }else {
                            sb.append("`"+ priKeyList.get(j) +"`,");
                        }
                    }
                    sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                }
            // 非主键,直接判断是否允许为空
            }else {
                // 存在主键,并且为最后一个了
                if (priKeyList.size() > 0 && i >= meterInfo.size() -1 ){
                    // 判断是否为空 if是可以为空
                    if ("1".equals(sma.getIsNull())){
                        sb.append("DEFAULT NULL COMMENT '"+ sma.getFieldRemark() +"',\n");
                    }else {
                        sb.append("NOT NULL COMMENT '"+ sma.getFieldRemark() +"',\n");
                    }
                    // 表示只有一个主键
                    if (priKeyList.size() == 1){
                        sb.append("PRIMARY KEY (`"+ priKeyList.get(0) +"`)\n");
                        sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                    }else {
                        // 最后一条,并且存在多个主键时
                        sb.append("PRIMARY KEY (");
                        // 遍历主键集合
                        for (int j = 0; j < priKeyList.size(); j++) {
                            // 最后一个时
                            if (j == priKeyList.size() -1){
                                sb.append("`"+ priKeyList.get(j) +"`) USING BTREE \n");
                            }else {
                                sb.append("`"+ priKeyList.get(j) +"`,");
                            }
                        }
                        sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                    }
                }else {
                    // 没有就追加 判断是否为空
                    if ("1".equals(sma.getIsNull())){
                        sb.append("DEFAULT NULL COMMENT '"+ sma.getFieldRemark() +"',\n");
                    }else {
                        sb.append("NOT NULL COMMENT '"+ sma.getFieldRemark() +"',\n");
                    }
                }
            }
        }
        return sb.toString();
    }

    /**
     * 删除表SQL
     * @param tableName
     * @return
     */
    public static String createSQLDropTable(String tableName){
        return "DROP TABLE "+ tableName +"";
    }

    /**
     * 判断类型
     * varchar
     * int
     * double
     * datetime
     * decimal
     * text
     *
     * @param type
     * @return
     */
    private static String judgeDataType(String type){
        switch (type){
            case TYPE_STRING:
                return "varchar";
            case TYPE_INTEGER:
                return "int";
            case TYPE_DOUBLE:
                return "double";
            case TYPE_Date:
                return "datetime";
            case TYPE_BigDecimal:
                return "decimal";
            case TYPE_text:
                return "text";
            default :
                return "varchar";
        }
    };


}

### 回答1: MySQL Workbench是一个用于管理MySQL数据库的工具,可以通过它来创建。具体步骤如下: 1. 打开MySQL Workbench,连接到你的MySQL数据库。 2. 在左侧的“SCHEMAS”面板选择你要创建数据库。 3. 在顶部菜单栏选择“Database” -> “Create a new Table”。 4. 在弹出的“Create Table”对话框,输入名和列名,并选择数据类型和约束条件。 5. 点击“Apply”按钮保存结构。 6. 在左侧的“SCHEMAS”面板选择你创建,可以查看结构和数据。 以上就是使用MySQL Workbench创建的简单步骤。 ### 回答2: MySQL Workbench是一款非常流行的数据库管理工具,它支持图形交互方式创建以及运行SQL语句,使得数据库管理变得轻松简单。下面就介绍一下使用MySQL Workbench创建的具体步骤: 1. 打开MySQL Workbench软件,进入“SQL开发者”选项卡,从左侧选择你要创建数据库。 2. 在SQL Workspace区域输入代码创建代码的格式如下: CREATE TABLE table_name ( column1 datatype constraints, column2 datatype constraints, column3 datatype constraints, .... ); 其,table_name为要创建名,column1,column2,column3等为的列名,datatype为列的数据类型,constraints为列所需的约束条件。 3. 在输入完代码后,点击工具栏的 “执行” 或 “应用更改” 按钮。这将执行代码,并将新创建在选定的数据库。 4. 可以在左侧的对象资源管理器查看创建是否被正确添加。 在实际开发,根据不同的需求,我们还可以为添加主键、外键、索引等约束条件,以及为列定义默认值、唯一性、非空等约束。 以上就是使用MySQL Workbench创建的基本步骤,通过使用MySQL Workbench,我们可以非常方便地创建和管理数据库,从而更快地实现数据库开发工作。 ### 回答3: MySQL Workbench是一个强大的工具,它可以方便地创建和管理MySQL数据库创建一张的第一步是要选一个数据库,可以在MySQL Workbench的“Navigator”面板选择“Schema”,然后选择要使用的数据库。 接下来,点击“Tables”选项卡,然后点击“Create Table”来开始创建。在“Columns”面板,可以定义需要的列和数据类型。例如,可以定义一个名为“ID”的列,类型为INT,第一个列可以设置为PK (Primary Key),以确保每个记录都具有唯一的标识符。 然后在“Columns”面板添加更多列,为每个列指定数据类型和限制,例如VARCHAR(字符)、INT(整数)、DECIMAL(小数)等类型。可以使用其他选项,例如“Not Null”、“Unsigned”和“Auto Increment”等,来控制列的值的要求。 在“Indexes”面板,还可以为添加索引。索引是一种查询优化功能,使用索引可以加速查询操作的速度。可以通过选择一个或多个列来创建索引。MySQL Workbench还允许你为每个索引指定名称和类型,例如普通索引、全文索引、唯一索引等。 完成创建后,可以通过在“SQL”选项卡查看生成的SQL代码来复制和粘贴代码到一个SQL文件。也可以直接通过MySQL Workbench执行生成的代码,以便将添加到数据库。 综上所述,MySQL Workbench是一个方便的工具,使创建和管理MySQL数据库变得容易。通过选择的列、数据类型和限制等选项,可以在工作台上创建高度定制的,并快速地生成SQL代码,以便将该添加到现有数据库
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值