springboot动态建立表修改表结构删除表工具

Posted 洛阳泰山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot动态建立表修改表结构删除表工具相关的知识,希望对你有一定的参考价值。

代码如下(以postgressql为列子)

基于JdbcTemplate 实现


import lombok.AllArgsConstructor;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.gis.common.constant.AppConst;
import org.springblade.gis.modules.feature.attribute.entity.AttributeItemEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.*;

@Service
@AllArgsConstructor
public class DbStructureService 

    private final JdbcTemplate jdbcTemplate;



    public boolean createTable(Long id, List<AttributeItemEntity> columns)
            return createTable(AppConst.TABLE_PREFIX+id,columns);
    

    @Transactional(rollbackFor = Throwable.class)
    public boolean dropTables(List<Long> ids)
        List<String> tableNames=new ArrayList<>();
        ids.forEach(id->
            tableNames.add(AppConst.TABLE_PREFIX+id);
        );
        return dropTable(tableNames);
    

    public  boolean addColumns(Long id,List<AttributeItemEntity> columns)
        return addColumns(AppConst.TABLE_PREFIX+id,columns);
    

    public  boolean updateColumns(Long id,List<AttributeItemEntity> columns,Map<Long,String> oldColumnMap)
        return updateColumns(AppConst.TABLE_PREFIX+id,columns,oldColumnMap);
    

    public  boolean dropColumns(Long id,List<AttributeItemEntity> columns)
        return dropColumns(AppConst.TABLE_PREFIX+id,columns);
    

    private String columnType(String type,Integer length)
        if("varchar".equals(type))
            if(Objects.isNull(length)||length==0)
                length=255;
            
            return type+"("+length+")";
        
        return type;
    

    private   boolean createTable(String tableName,List<AttributeItemEntity> columns)
        StringBuffer sb = new StringBuffer();
        sb.append("CREATE TABLE IF NOT EXISTS \\"public\\".\\""+tableName+"\\" (\\n");
        sb.append("\\"id\\" int8 NOT NULL,\\n");
        columns.forEach(e->
            sb.append("\\""+e.getName() + "\\" "+columnType(e.getType(),e.getLength())+" "+isNullSql(e.getEnableNull())+" "+isDefaultSql(e.getDefaultValue())+",\\n");
        );
        sb.append("\\"create_time\\" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP\\n");
        sb.append(");\\n");
        sb.append("COMMENT ON COLUMN \\"public\\".\\""+tableName+"\\".\\"id\\" IS '主键';\\n");
        columns.forEach(e->
            sb.append("COMMENT ON COLUMN \\"public\\".\\""+tableName+"\\".\\""+e.getName()+"\\" IS '"+e.getAlias()+"';\\n");
        );
        sb.append("COMMENT ON COLUMN \\"public\\".\\""+tableName+"\\".\\"create_time\\" IS '创建时间';\\n");
        sb.append("ALTER TABLE \\"public\\".\\""+tableName+"\\" ADD CONSTRAINT \\""+tableName+"_pkey\\" PRIMARY KEY (\\"id\\");");
        return  execute(sb);
    

    private  boolean addColumns(String tableName,List<AttributeItemEntity> columns)
        StringBuffer sb = new StringBuffer();
            columns.forEach(e->
                sb.append("ALTER TABLE \\"public\\".\\""+tableName+"\\"  ADD COLUMN \\""+e.getName() + "\\" "+columnType(e.getType(),e.getLength())+" "+isNullSql(e.getEnableNull())+" "+isDefaultSql(e.getDefaultValue())+";\\n");
                sb.append("COMMENT ON COLUMN \\"public\\".\\""+tableName+"\\".\\""+e.getName()+"\\" IS '"+e.getAlias()+"';\\n");
            );
            return execute(sb);
    

    private  boolean updateColumns(String tableName,List<AttributeItemEntity> columns,Map<Long,String> oldColumnMap)
        StringBuffer sb = new StringBuffer();
        columns.forEach(e->
            String oldName=oldColumnMap.get(e.getId());
            if(oldName!=null&&!oldName.equals(e.getName()))
             sb.append("ALTER TABLE \\"public\\".\\""+tableName+"\\"  RENAME COLUMN \\""+oldName + "\\" TO \\""+e.getName()+"\\";\\n");
            
            sb.append("COMMENT ON COLUMN \\"public\\".\\""+tableName+"\\".\\""+e.getName()+"\\" IS '"+e.getAlias()+"';\\n");
        );
        return execute(sb);
    

    private  boolean dropColumns(String tableName,List<AttributeItemEntity> columns)
        StringBuffer sb = new StringBuffer();
        columns.forEach(e->
            sb.append("ALTER TABLE \\"public\\".\\""+tableName+"\\"  DROP COLUMN \\""+e.getName()+"\\";\\n");
        );
        return execute(sb);
    


    private  boolean dropTable(List<String> tableNames)
        StringBuffer sb = new StringBuffer();
        tableNames.forEach(tableName->
            sb.append("DROP TABLE IF EXISTS \\"public\\".\\""+tableName+"\\";");
        );
        return  execute(sb);
    

    //获取所有表名称
    public List<String> tableNames() 
        List<String> tableNames= new ArrayList<>();
        try 
            Connection getConnection=jdbcTemplate.getDataSource().getConnection();
            DatabaseMetaData metaData = getConnection.getMetaData();
            ResultSet rs = metaData.getTables(getConnection.getCatalog(), null, null, new String[]  "TABLE" );
            while (rs.next()) 
                String tableName=rs.getString("TABLE_NAME");
                tableNames.add(tableName);
            
         catch (Exception e) 
            e.printStackTrace();
        
        return tableNames;
    


    private  boolean execute(StringBuffer sb)
        try 
            jdbcTemplate.execute(sb.toString());
            return true;
         catch (Exception e) 
            e.printStackTrace();
            return false;
        
    

    private String isNullSql(Boolean boo)
        if(boo)
            return "NOT NULL";
        
        return "";
    

    private String isDefaultSql(Object obj)
        if(Objects.nonNull(obj))
            if(obj instanceof String)
                if(StringUtil.isEmpty(obj))
                    return "";
                
                return "DEFAULT '"+obj+"'";
            
            return "DEFAULT "+obj;
        
        return "";
    




2021/11/14更新代码,修改优化。

以上是关于springboot动态建立表修改表结构删除表工具的主要内容,如果未能解决你的问题,请参考以下文章

计算机考试 表一旦建立,表结构就不能修改了?

sqlalchemy怎么修改表结构

spring+hibernate集成动态修改表结构,网上要对LocalSessionFactory进行小小的修改

cdm的命令表

SQL介绍

mysql如何修改表结构