Java对数据表的操作(以MySql为例)

1.创建表(DataTable 为表信息,包括数据库信息(DataBaseInfor ),字段信息(dataTable.getTableFieldInforList()))仅供参考

private static void createMySqlDataTable(DataTable dataTable) {

    DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
    // 数据库连接URL,用户名和密码
    String url = "jdbc:mysql://"+dataBaseInfor.getLinkAddress()+"/"+dataBaseInfor.getName();
    String user = dataBaseInfor.getUserName();
    String password = dataBaseInfor.getPassword();

    try {
        // 加载数据库驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 建立数据库连接
        Connection conn = DriverManager.getConnection(url, user, password);

        // 创建Statement对象来执行SQL语句
        Statement stmt = conn.createStatement();

        // 要执行的SQL语句,创建新表

        String sql = "CREATE TABLE IF NOT EXISTS `"+dataTable.getEnName()+"`(";
        String majorKey = "";
        List<DataTableFieldInfor> tableFieldInforList = dataTable.getTableFieldInforList();
        if (ObjectUtils.isNotEmpty(tableFieldInforList)){
            for (DataTableFieldInfor dataTableFieldInfor : tableFieldInforList){
                sql = sql+"`"+dataTableFieldInfor.getFieldEnName()+"` ";
                if (dataTableFieldInfor.getFieldType() != null || dataTableFieldInfor.getFieldType() != ""){
                    if (dataTableFieldInfor.getFieldType().equals("varchar")||dataTableFieldInfor.getFieldType().equals("char")){
                        sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+") ";
                    }else if (dataTableFieldInfor.getFieldType().equals("float") || dataTableFieldInfor.getFieldType().equals("double")){
                        sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+","+dataTableFieldInfor.getFieldAccuracy()+") ";
                    }
                    else {
                        sql = sql+dataTableFieldInfor.getFieldType() + " ";
                    }
                }
                if (dataTableFieldInfor.getRequiredFlag() == 1){
                    sql = sql + "NOT NULL ";
                }
                if (dataTableFieldInfor.getIncrementalFlag() ==2){
                    if (StringUtils.isNotEmpty(dataTableFieldInfor.getDefaultValue())){
                        sql = sql+"DEFAULT'"+ dataTableFieldInfor.getDefaultValue() + "'";
                    }else {
                        sql = sql+"DEFAULT NULL ";
                    }
                }else {
                    sql = sql + "AUTO_INCREMENT ";
                }
                sql = sql + "COMMENT '"+dataTableFieldInfor.getFieldCnName()+"',";
                if (dataTableFieldInfor.getMajorKeyFlag() == 1){
                    majorKey = majorKey+dataTableFieldInfor.getFieldEnName();
                }
            }
        }
        sql = sql +"PRIMARY KEY ("+majorKey+")";
        sql = sql+")";
        sql = sql +"ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='"+dataTable.getCnName()+"'";

        System.out.println("执行sql:"+sql);
        // 执行SQL语句
        stmt.executeUpdate(sql);

        // 关闭Statement和Connection
        stmt.close();
        conn.close();

        System.out.println("Table created successfully");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.删除表

private static void  deleteMySqlTable(DataTable dataTable) {

    DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
    // 数据库连接URL,用户名和密码
    String url = "jdbc:mysql://"+dataBaseInfor.getLinkAddress()+"/"+dataBaseInfor.getName();
    String user = dataBaseInfor.getUserName();
    String password = dataBaseInfor.getPassword();

    // 表名
    String tableName = dataTable.getEnName();

    Connection conn = null;
    Statement stmt = null;
    try {
        // 注册JDBC驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 打开连接
        conn = DriverManager.getConnection(url, user, password);

        // 执行SQL语句
        stmt = conn.createStatement();
        String sql = "DROP TABLE IF EXISTS " + tableName;
        stmt.executeUpdate(sql);

        System.out.println("Table dropped successfully");
    } catch (ClassNotFoundException e) {
        System.out.println("JDBC driver not found");
        e.printStackTrace();
    } catch (SQLException e) {
        System.out.println("SQLException: " + e.getMessage());
        e.printStackTrace();
    } finally {
        try {
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

3.修改表

主要根据字段的修改分为新增字段,删除字段,修改字段,写的比较乱。仅供参考


private void updateMySqlTable(DataTable dataTable) {

    DataTable oldDataTable = dataTable.getOldDataTable();
    if (!oldDataTable.getEnName().equals(dataTable.getEnName())){
        String sql =  "ALTER TABLE " +oldDataTable.getEnName()+" RENAME TO "+dataTable.getEnName();
        sql(dataTable,sql);
    }
    if (!oldDataTable.getCnName().equals(dataTable.getCnName())){
        DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
        String sql = "ALTER TABLE `"+dataBaseInfor.getName()+"`.`"+dataTable.getEnName()+ "` COMMENT = '"+dataTable.getCnName()+"`";
        sql(dataTable,sql);
    }
    List<DataTableFieldInfor> list = dataTable.getUpdateTableFieldList();
    Map<Integer,List<DataTableFieldInfor>> map=list.stream().collect(Collectors.groupingBy(DataTableFieldInfor::getSystemType));
    if (ObjectUtils.isNotEmpty(map.get(3))){
        deleteField(map.get(3),dataTable);
    }
    if (ObjectUtils.isNotEmpty(map.get(2))){
        editField(map.get(2),dataTable);
    }
    if (ObjectUtils.isNotEmpty(map.get(1))){
        addField(map.get(1),dataTable);;
    }
}

private void updateOracleTable(DataTable dataTable) {

}

private void  deleteField(List<DataTableFieldInfor> dataTableFieldInfors,DataTable dataTable) {
    DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
    String sql = "ALTER TABLE `"+dataBaseInfor.getName()+"`.`"+dataTable.getEnName()+ "`";
    for (DataTableFieldInfor dataTableFieldInfor : dataTableFieldInfors){
        sql = sql + " DROP COLUMN `" + dataTableFieldInfor.getFieldEnName()+"`";
        if (dataTableFieldInfor.getId() != dataTableFieldInfors.get(dataTableFieldInfors.size()-1).getId()){
            sql = sql + ",";
        }
    }
    System.out.println("执行sql:"+sql);
    sql(dataTable,sql);
}

private void addField(List<DataTableFieldInfor> dataTableFieldInfors,DataTable dataTable) {
    DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
    String sql = "ALTER TABLE `"+dataBaseInfor.getName()+"`.`"+dataTable.getEnName()+ "`";
    for (DataTableFieldInfor dataTableFieldInfor : dataTableFieldInfors){
        sql = sql + "ADD COLUMN `"+dataTableFieldInfor.getFieldEnName()+"` ";
        //根据字段类型拼接
        if (dataTableFieldInfor.getFieldType().equals("varchar")||dataTableFieldInfor.getFieldType().equals("char")){
            sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+") ";
        }else if (dataTableFieldInfor.getFieldType().equals("float") || dataTableFieldInfor.getFieldType().equals("double")){
            sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+","+dataTableFieldInfor.getFieldAccuracy()+") ";
        }
        else {
            sql = sql+dataTableFieldInfor.getFieldType() + " ";
        }
        //根据字段是否为空拼接
        if (dataTableFieldInfor.getRequiredFlag() == 1){
            sql = sql + "NOT NULL ";
        }else {
            sql = sql + "NULL ";
        }
        //根据字段是否默认值
        if (dataTableFieldInfor.getIncrementalFlag() ==2){
            if (StringUtils.isNotEmpty(dataTableFieldInfor.getDefaultValue())){
                sql = sql+"DEFAULT'"+ dataTableFieldInfor.getDefaultValue() + "'";
            }
        }else {
            //是否自增
            sql = sql + "AUTO_INCREMENT ";
        }
        sql = sql + "COMMENT '"+dataTableFieldInfor.getFieldCnName()+"' ";
        /*DataTableFieldInfor fieldInfor = new DataTableFieldInfor();
        fieldInfor.setTableId(dataTableFieldInfor.getTableId());*/
        List<DataTableFieldInfor> list = dataTable.getTableFieldInforList();
        if (dataTableFieldInfor.getSort() == 1){
            sql = sql + "FIRST";
        }else {
            sql = sql + "AFTER `"+list.get(dataTableFieldInfor.getSort()-2).getFieldEnName()+"`";
        }
        if (dataTableFieldInfors.stream().anyMatch(company -> company.getMajorKeyFlag() == 1)){
            sql = sql + ",";
        }else if (dataTableFieldInfor.getSort() < dataTableFieldInfors.size()+1){
            sql = sql + ",";
        }else {
            sql = sql+";";
        }
    }
    //是否新增主键
    if (dataTableFieldInfors.stream().anyMatch(company -> company.getMajorKeyFlag() == 1)){
        sql = sql + "DROP PRIMARY KEY";

        DataTableFieldInfor fieldInfor = new DataTableFieldInfor();
        fieldInfor.setTableId(dataTableFieldInfors.get(0).getTableId());
        List<DataTableFieldInfor> list = dataTable.getTableFieldInforList();
        sql = sql + "ADD PRIMARY KEY (";
        List<DataTableFieldInfor> fieldInforList = new ArrayList<>();
        for (DataTableFieldInfor dataTableFieldInfor : list){
            if (dataTableFieldInfor.getMajorKeyFlag() ==1){
                fieldInforList.add(dataTableFieldInfor);
            }
        }
        for (DataTableFieldInfor dataTableFieldInfor : fieldInforList){
            if (dataTableFieldInfor.getId() != fieldInforList.get(fieldInforList.size()).getId()){
                sql= sql+"`"+dataTableFieldInfor.getFieldEnName()+"`,";
            }else {
                sql= sql+"`"+dataTableFieldInfor.getFieldEnName()+"`";
            }
        }
        sql = sql+") USING BTREE;";
    }

    System.out.println("执行sql:"+sql);
    sql(dataTable,sql);
}

private void editField(List<DataTableFieldInfor> dataTableFieldInfors,DataTable dataTable) {
    for (DataTableFieldInfor dataTableFieldInfor : dataTableFieldInfors){
        DataTableFieldInfor fieldInfor= dataTable.getOldTableFieldList().stream().filter(p -> p.getId().equals(dataTableFieldInfor.getId()))
                .findFirst()
                .orElse(null);
        DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
        String sql = "ALTER TABLE `"+dataBaseInfor.getName()+"`.`"+dataTable.getEnName()+ "`";
        if (!dataTableFieldInfor.getFieldEnName().equals(fieldInfor.getFieldEnName())){
            sql = sql+"CHANGE COLUMN `" + fieldInfor.getFieldEnName() +"` `"+dataTableFieldInfor.getFieldEnName()+"`";
        }else {
            sql = sql + "MODIFY COLUMN `" + dataTableFieldInfor.getFieldEnName()+"`";
        }
        //根据字段类型拼接
        if (dataTableFieldInfor.getFieldType().equals("varchar")||dataTableFieldInfor.getFieldType().equals("char")){
            sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+") ";
        }else if (dataTableFieldInfor.getFieldType().equals("float") || dataTableFieldInfor.getFieldType().equals("double")){
            sql = sql+dataTableFieldInfor.getFieldType()+"("+dataTableFieldInfor.getFieldLength()+","+dataTableFieldInfor.getFieldAccuracy()+") ";
        }
        else {
            sql = sql+dataTableFieldInfor.getFieldType() + " ";
        }
        //根据字段是否为空拼接
        if (dataTableFieldInfor.getRequiredFlag() == 1){
            sql = sql + "NOT NULL ";
        }else {
            sql = sql + "NULL ";
        }
        //根据字段是否默认值
        if (dataTableFieldInfor.getIncrementalFlag() ==2){
            if (StringUtils.isNotEmpty(dataTableFieldInfor.getDefaultValue())){
                sql = sql+"DEFAULT'"+ dataTableFieldInfor.getDefaultValue() + "'";
            }
        }else {
            //是否自增
            sql = sql + "AUTO_INCREMENT ";
        }
        sql = sql + "COMMENT '"+dataTableFieldInfor.getFieldCnName()+"' ";
        List<DataTableFieldInfor> list = dataTable.getTableFieldInforList();
        if (dataTableFieldInfor.getSort() == 1){
            sql = sql + "FIRST;";
        }else {
            sql = sql + "AFTER `"+list.get(dataTableFieldInfor.getSort()-2).getFieldEnName()+"`;";
        }
        System.out.println("执行第"+dataTableFieldInfors.indexOf(dataTableFieldInfor)+1+"条sql:"+sql);
        sql(dataTable,sql);
    }
}

private void sql(DataTable dataTable,String sql){
    DataBaseInfor dataBaseInfor = dataTable.getDataBaseInfor();
    // 数据库连接URL,用户名和密码
    String url = "jdbc:mysql://"+dataBaseInfor.getLinkAddress()+"/"+dataBaseInfor.getName();
    String user = dataBaseInfor.getUserName();
    String password = dataBaseInfor.getPassword();

    try {
        // 加载数据库驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 建立数据库连接
        Connection conn = DriverManager.getConnection(url, user, password);
        // 创建Statement对象来执行SQL语句
        Statement stmt = conn.createStatement();
        // 执行SQL语句
        stmt.executeUpdate(sql);
        // 关闭Statement和Connection
        stmt.close();
        conn.close();
        System.out.println("Table created successfully");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值