Criar base de dados, quando rodar sistema pela primeira vez

Boa tarde alguém teria alguma solução quando para quando executa-se o sistema pela primeira vez criasse também a base de dados, ou seja, as tabelas do banco. Pensei em um .bat, mas creio eu que há outras maneiras também, caso alguém me ajude será de grande valia.

Estou utilizando o Postgres como SGBD

Por ex.

boolean primeiraVez = true;

if(primeiraVez){
  // cria base de dados
 primeiraVez = false;
} else {
  // chama tela Login
}

Leandro, boa tarde.

Estou desenvolvendo o meu TCC em Java Swing, e na minha classe de conexão com o banco de dados eu tenho uma função onde faço a verificação.

   public static boolean existeBanco(){

        boolean existe = false;

        Connection con = Conexao.getConnetionCreation();
        PreparedStatement pstm = null;
        ResultSet rs = null;

        String sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'tigerencial';";

        try 
        {
            pstm = con.prepareStatement(sql);
            rs = pstm.executeQuery();
            rs.next();

            if(rs.isFirst())
                existe = true;

        } catch (SQLException ErroSql) {
            JOptionPane.showMessageDialog(null, "ERRO NA VERIFICAÇÃO DE EXISTENCIA DO BANCO.", "ERRO", JOptionPane.ERROR_MESSAGE);
        }
        finally
        {
            Conexao.closeConnection(con, pstm, rs);
        }

        return existe;
    }

desta forma eu utilizo um evento chamado WindowsOpened para verificar a existência do banco de dados.

 private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    if(Conexao.existeBanco()){
        carregaBoxLoguin();
        carregaBoxAdministradores();
        carregaTabelaLoguin();
        this.btCriaBanco.setEnabled(false);
        desabilitarCamposAdm();
    } 
    else{
        this.btCriaBanco.setEnabled(true);
    }
}             

Em seguida eu tenho um botão que fará a criação das tabelas no meu banco de dados e a inserção automática de alguns dados.

1 curtida

Valeu @Marcio_Tostes ajudou muito, se não for pedir muito vce poderia por gentileza me falar como está o trecho de código deste botão para a criação das tabelas do seu banco?

Dentro do Jbutton tenho um evento ActionPerformed com o seguinte código.

    Connection con = Conexao.getConnetionCreation();
    PreparedStatement pstmCreation = null;
    
    String sql = "CREATE SCHEMA IF NOT EXISTS `tigerencial` DEFAULT CHARACTER SET utf8;";
    
    String sql1 = "USE `tigerencial`;";
    
    String sql2 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`pais` (\n" +
                    "  `idPais` INT(11) NOT NULL AUTO_INCREMENT,\n" +
                    "  `nome` VARCHAR(60) NOT NULL,\n" +
                    "  `sigla` VARCHAR(10) NOT NULL,\n" +
                    "  PRIMARY KEY (`idPais`))\n" +
                    "ENGINE = InnoDB\n" +
                    "AUTO_INCREMENT = 2\n" +
                    "DEFAULT CHARACTER SET = latin1;";
    
    String sql3 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`estado` (\n" +
                    "  `idEstado` INT(11) NOT NULL AUTO_INCREMENT,\n" +
                    "  `nome` VARCHAR(75) NOT NULL,\n" +
                    "  `uf` VARCHAR(5) NOT NULL,\n" +
                    "  `paisIdPais` INT(11) NOT NULL,\n" +
                    "  PRIMARY KEY (`idEstado`),\n" +
                    "  INDEX `fk_estado_pais_idx` (`paisIdPais` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "AUTO_INCREMENT = 29\n" +
                    "DEFAULT CHARACTER SET = latin1;";
    
    String sql4 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`cidade` (\n" +
                    "  `idCidade` INT(11) NOT NULL AUTO_INCREMENT,\n" +
                    "  `nome` VARCHAR(120) NOT NULL,\n" +
                    "  `cep` VARCHAR(9) NULL DEFAULT NULL,\n" +
                    "  `estadoIdEstado` INT(11) NOT NULL,\n" +
                    "  PRIMARY KEY (`idCidade`),\n" +
                    "  INDEX `fk_cidade_estado1_idx` (`estadoIdEstado` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "AUTO_INCREMENT = 13193\n" +
                    "DEFAULT CHARACTER SET = latin1;";
    
    String sql5 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`bairro` (\n" +
                    "  `idBairro` INT(11) NOT NULL AUTO_INCREMENT,\n" +
                    "  `nome` VARCHAR(45) NOT NULL,\n" +
                    "  `cidadeIdCidade` INT(11) NOT NULL,\n" +
                    "  PRIMARY KEY (`idBairro`, `cidadeIdCidade`),\n" +
                    "  INDEX `fk_bairro_cidade1_idx` (`cidadeIdCidade` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "AUTO_INCREMENT = 60\n" +
                    "DEFAULT CHARACTER SET = utf8;";
    
    String sql6 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`cliente` (\n" +
                    "  `idCliente` INT(11) NOT NULL AUTO_INCREMENT,\n" +
                    "  `nome` VARCHAR(60) NOT NULL,\n" +
                    "  `rg` VARCHAR(20) NOT NULL,\n" +
                    "  `cpf` VARCHAR(16) NOT NULL,\n" +
                    "  `telFixo` VARCHAR(15) NULL DEFAULT NULL,\n" +
                    "  `celPrimeiro` VARCHAR(15) NULL DEFAULT NULL,\n" +
                    "  `celSegundo` VARCHAR(15) NULL DEFAULT NULL,\n" +
                    "  `email` VARCHAR(100) NULL DEFAULT NULL,\n" +
                    "  `dataNascimento` DATE NULL DEFAULT NULL,\n" +
                    "  `dataCadastro` DATE NOT NULL,\n" +
                    "  `foto` VARCHAR(200) NULL DEFAULT NULL,\n" +
                    "  `rua` VARCHAR(70) NULL,\n" +
                    "  `numero` VARCHAR(5) NULL,\n" +
                    "  `complemento` VARCHAR(45) NULL,\n" +
                    "  `cidadeIdCidade` INT(11) NOT NULL,\n" +
                    "  `bairro` VARCHAR(45) NULL,\n" +
                    "  `cepRua` VARCHAR(9) NULL,\n" +
                    "  PRIMARY KEY (`idCliente`, `cidadeIdCidade`),\n" +
                    "  INDEX `fk_cliente_cidade1_idx` (`cidadeIdCidade` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "DEFAULT CHARACTER SET = utf8;";
    
    String sql7 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`endereco` (\n" +
                    "  `idEndereco` INT NOT NULL AUTO_INCREMENT,\n" +
                    "  `cepRua` VARCHAR(9) NULL DEFAULT NULL,\n" +
                    "  `nome` VARCHAR(100) NOT NULL,\n" +
                    "  `tipoEndereco` VARCHAR(25) NULL DEFAULT NULL,\n" +
                    "  `observacao` VARCHAR(45) NULL DEFAULT NULL,\n" +
                    "  `complemento` VARCHAR(75) NULL DEFAULT NULL,\n" +
                    "  `bairroIdBairro` INT(11) NOT NULL,\n" +
                    "  `bairroCidadeIdCidade` INT(11) NOT NULL,\n" +
                    "  PRIMARY KEY (`idEndereco`),\n" +
                    "  INDEX `fk_endereco_bairro1_idx` (`bairroIdBairro` ASC, `bairroCidadeIdCidade` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "AUTO_INCREMENT = 1034\n" +
                    "DEFAULT CHARACTER SET = utf8;";
    
    String sql8 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`look` (\n" +
                    "  `idLook` INT(11) NOT NULL,\n" +
                    "  `url` VARCHAR(55) NULL DEFAULT NULL,\n" +
                    "  PRIMARY KEY (`idLook`))\n" +
                    "ENGINE = InnoDB\n" +
                    "DEFAULT CHARACTER SET = utf8;";
    
    String sql9 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`funcionario` (\n" +
                    "  `idFuncionario` INT(11) NOT NULL,\n" +
                    "  `nome` VARCHAR(60) NOT NULL,\n" +
                    "  `rg` VARCHAR(20) NOT NULL,\n" +
                    "  `cpf` VARCHAR(16) NOT NULL,\n" +
                    "  `telFixo` VARCHAR(11) NULL DEFAULT NULL,\n" +
                    "  `celPrimeiro` VARCHAR(15) NULL DEFAULT NULL,\n" +
                    "  `celSegundo` VARCHAR(15) NULL DEFAULT NULL,\n" +
                    "  `email` VARCHAR(100) NULL DEFAULT NULL,\n" +
                    "  `dataNascimento` DATE NULL DEFAULT NULL,\n" +
                    "  `dataAdmissao` DATE NOT NULL,\n" +
                    "  `dataDemissao` VARCHAR(45) NULL,\n" +
                    "  `foto` VARCHAR(200) NULL DEFAULT NULL,\n" +
                    "  `rua` VARCHAR(70) NULL,\n" +
                    "  `numero` VARCHAR(5) NULL,\n" +
                    "  `complemento` VARCHAR(45) NULL,\n" +
                    "  `cidadeIdCidade` INT(11) NOT NULL,\n" +
                    "  `bairro` VARCHAR(45) NULL,\n" +
                    "  `cepRua` VARCHAR(9) NULL,\n" +
                    "  `salario` DOUBLE NOT NULL,\n" +
                    "  `cargo` VARCHAR(45) NULL,\n" +
                    "  PRIMARY KEY (`idFuncionario`, `cidadeIdCidade`),\n" +
                    "  INDEX `fk_cliente_cidade1_idx` (`cidadeIdCidade` ASC))\n" +
                    "ENGINE = InnoDB\n" +
                    "DEFAULT CHARACTER SET = utf8;";
    
    String sql10 = "CREATE TABLE IF NOT EXISTS `tigerencial`.`loguin` (\n" +
                    "  `idLoguin` INT NOT NULL AUTO_INCREMENT,\n" +
                    "  `usuario` VARCHAR(45) NOT NULL,\n" +
                    "  `senha` VARCHAR(11) NOT NULL,\n" +
                    "  `dataCadastro` DATETIME NOT NULL,\n" +
                    "  `ativado` VARCHAR(3) NOT NULL,\n" +
                    "  `acesso` VARCHAR(3) NOT NULL,\n" +
                    "  PRIMARY KEY (`idLoguin`),\n" +
                    "  UNIQUE INDEX `usuario_UNIQUE` (`usuario` ASC))\n" +
                    "ENGINE = InnoDB;";
    
    String insertLoguin   = "INSERT INTO `loguin` (`idLoguin`, `usuario`, `senha`, `dataCadastro`, `ativado`, `acesso`) VALUES ('1', 'ADMINISTRADOR', '46792755', '2017-08-18', 'SIM', 'SIM');";
    String insertPais     = "INSERT INTO `pais` VALUES (1,'BRASIL','BR');";
    String insertEstado   = "INSERT INTO `estado` VALUES (1,'ACRE','AC',1),(2,'ALAGOAS','AL',1),(3,'AMAZONAS','AM',1),(4,'AMAPÁ','AP',1),(5,'BAHIA','BA',1),(6,'CEARÁ','CE',1),(7,'DISTRITO FEDERAL','DF',1),(8,'ESPÍRITO SANTO','ES',1),(9,'GOIÁS','GO',1),(10,'MARANHÃO','MA',1),(11,'MINAS GERAIS','MG',1),(12,'MATO GROSSO DO SUL','MS',1),(13,'MATO GROSSO','MT',1),(14,'PARÁ','PA',1),(15,'PARAÍBA','PB',1),(16,'PERNAMBUCO','PE',1),(17,'PIAUÍ','PI',1),(18,'PARANÁ','PR',1),(19,'RIO DE JANEIRO','RJ',1),(20,'RIO GRANDE DO NORTE','RN',1),(21,'RONDÔNIA','RO',1),(22,'RORAIMA','RR',1),(23,'RIO GRANDE DO SUL','RS',1),(24,'SANTA CATARINA','SC',1),(25,'SERGIPE','SE',1),(26,'SÃO PAULO','SP',1),(27,'TOCANTINS','TO',1);";
    String insertCidade   = "INSERT INTO `cidade` (`idCidade`,`nome`,`cep`,`estadoIdEstado`) VALUES (3460,'MURIAÉ','00000-000',11);";
    String insertBairro   = "INSERT INTO `bairro` VALUES (1,'Aeroporto',3460)";
    
       try
       {
            pstmCreation = Conexao.getConnetionCreation().prepareStatement(sql);
            pstmCreation.execute();
            pstmCreation.addBatch(sql1);
            pstmCreation.addBatch(sql2);
            pstmCreation.addBatch(sql3);
            pstmCreation.addBatch(sql4);
            pstmCreation.addBatch(sql5);
            pstmCreation.addBatch(sql6);
            pstmCreation.addBatch(sql7);
            pstmCreation.addBatch(sql8);
            pstmCreation.addBatch(sql9);
            pstmCreation.addBatch(sql10);
            pstmCreation.addBatch(insertLoguin);
            pstmCreation.addBatch(insertPais);
            pstmCreation.addBatch(insertEstado);
            pstmCreation.addBatch(insertCidade);
            pstmCreation.addBatch(insertBairro);
            pstmCreation.addBatch(insertEndereco);
            pstmCreation.executeBatch();
            pstmCreation.clearBatch();
            pstmCreation.close();
            
            JOptionPane.showMessageDialog(null, "AVISO: O Banco de dados foi iniciado corretamente.", "AVISO", JOptionPane.INFORMATION_MESSAGE);
            this.dispose();
            
            LookDao dao = new LookDao();
            TelaLoguin loguin = new TelaLoguin();
            
            dao.adicionaLook();
            loguin.setVisible(true);
            
       }
       catch(SQLException ErroSql)
       {
           JOptionPane.showMessageDialog(null, "ERRO AO CRIAR TABELAS NO BANCO: "+ ErroSql, "ERRO", JOptionPane.ERROR_MESSAGE);
       }
       finally
       {
           Conexao.closeConnection(con, pstmCreation);
       }    

Desculpe a quantidade de informação, está desta forma minha aplicação.

Tem algumas ferramentas que te ajudam nisso, inclusive para adicionar novas tabelas ou mudar colunas, conforme o tempo passa e o seu sistema muda.

Você pode procurar por db migrations. Uma que eu uso é o Flyway

Não sabia da existência dessas ferramentas, obrigado por compartilhar conhecimento.