Como fazer com que o java crie o banco do sistema automaticamente, através de um método

Olá a todos
estou na desenvolvendo a parte prática do meu TCC, estou quase concluído então optei por tentar fazer um instalador do programa, onde instale o banco do programa junto , para isso escolhi o inno setup.
lendo na internet e vendo alguns vídeos também, descobri que não é o instalador que importa o banco para o mysql, e sim é um código incluso dentro do meu programa, que vai pegar o arquivo exportado pelo banco, e vai executa-lo no banco.
mais agora estou com algumas duvidas em relação a como fazer isso.
elaborei um exercício simples para tentar fazer.

Esse é meu método main

[code]public static void main(String[] args) {

try{
	verificarPrimeiraAcesso();
	JfrmPrincipal frame = new JfrmPrincipal();
	frame.setVisible(true);
} catch (Exception e) {
	e.printStackTrace();
}

}[/code]

Se a o passar pelo connection for gerado o erro SQLExcepion, significa que o banco não existe no mysql e deverá cria-lo, se já tiver o banco continua o método main normal.

[code]private static void verificarPrimeiraAcesso() {

try(Connection con = Conexao.conectar()){
		
} catch (SQLException e) {
	Conexao.criarDB();
	verificarPrimeiraAcesso();
}

}[/code]

Esse é meu método de conexão com o banco, que retorna a conexão.

[code]public static Connection conectar() throws SQLException{

return DriverManager.
getConnection(“jdbc:mysql://localhost/Instalador”,“root”,");

}[/code]

Esse é o método que estou com mais dificuldade, a criação do banco.

[code]public static void criarDB(){
/*
*Aqui é um ponto que me gera duvida, para poder fazer a conexão com o banco, sem fazer referência a nenhuma tabela
* é possível?, porque como a tabela ainda não foi criada, como posso referenciar uma ?
* apenas quero que seja executado a criação do banco, que está no Instalador.sql
*/
try(Connection con = DriverManager.getConnection(“jdbc:mysql://localhost/”,“root”,"")) {

		BufferedReader leitor = new BufferedReader(new FileReader(new File(Conexao.class.getResource
		("/Banco/Instalador.sql") + "").getAbsolutePath()));
		
		Statement stt = con.createStatement();
		
		String linhaSQL;
		
		while((linhaSQL = leitor.readLine()) != null){
			
			stt.executeUpdate(linhaSQL);
		}
		
		stt.close();
		
	} catch (IOException | SQLException e) {
		e.printStackTrace();
	}

}[/code]

Espero que alguém possa me ajudar pois estou precisando bastante, e se alguém souber como fazer o inno setup instalar o mysql caso não haja no pc, por favor preciso disso também.

Muito obrigado a todos, também deixei aqui no tópico a o projeto com o banco, caso alguém queira ver melhor. Obrigado a todos desde já.

Você não precisa de nada disto.
Você precisa criar um arquivo .bat (Windows e .so se Linux) e, a partir dele, invocar a execução do script DDL de criação do banco de dados e das tabelas (caso vá trabalhar com JDBC puro).
Esse arquivo pode ser executado pelo inno setup, se não me engano.

Colega, sei que não vai responder tua dúvida, mas considere o seguinte: a instalação do seu aplicativo vai precisar instalar o banco primeiro (me refiro ao SGBD MySQL), subí-lo, para então depois você passar pela etapa de criar o banco do seu aplicativo. Considerou a hipótese de usar um banco embarcado, tipo h2 ou hsqldb ? Talvez ficasse mais simples…

[quote=ADEMILTON]Colega, sei que não vai responder tua dúvida, mas considere o seguinte: a instalação do seu aplicativo vai precisar instalar o banco primeiro (me refiro ao SGBD MySQL), subí-lo, para então depois você passar pela etapa de criar o banco do seu aplicativo. Considerou a hipótese de usar um banco embarcado, tipo h2 ou hsqldb ? Talvez ficasse mais simples…

[/quote]
+1

Basta você conectar ao banco mysql, que é criado quando se instala o banco de dados.

[quote]public static void criarDB(){
/*
*Aqui é um ponto que me gera duvida, para poder fazer a conexão com o banco, sem fazer referência a nenhuma tabela
* é possível?, porque como a tabela ainda não foi criada, como posso referenciar uma ?
* apenas quero que seja executado a criação do banco, que está no Instalador.sql
*/
try(Connection con = DriverManager.getConnection(“jdbc:mysql://localhost/”,“root”,"")) {

        BufferedReader leitor = new BufferedReader(new FileReader(new File(Conexao.class.getResource  
        ("/Banco/Instalador.sql") + "").getAbsolutePath()));  
          
        Statement stt = con.createStatement();  
          
        String linhaSQL;  
          
        while((linhaSQL = leitor.readLine()) != null){  
              
            stt.executeUpdate(linhaSQL);  
        }  
          
        stt.close();  
          
    } catch (IOException | SQLException e) {  
        e.printStackTrace();  
    }  

}
[/quote]
Pelo que entendi vc esta executando um arquivo que contem o script de criação do banco de dados.
O seu arquivo deve coneçar assim:

create database nome_banco;
use nome_banco;
create table......

Você tambem pode colocar isso dentro do código-fonte ao inves de chamar um arquivo(fica mais facil).

String sql = "create database nome_banco;"+
"use nome_banco;"+
"create table......";
PreparedStatement ps = conexao.prepareStatement(sql);
ps.execute();

Opa,

se estiver usando Hibernate/JPA, você sempre pode habilitar a opção hbm2ddl com o valor auto.
Assim quando a aplicação for iniciada todas as tabelas serão criadas automaticamente para você.

Tente isto :arrow: http://guj.com.br/java/262896-resolvido-como-criar-um-instalador-a-partir-de-um-arquivo-jar-no-netbeans

:thumbup:

Está bem difícil, minha aplicação é desktop
na teoria o que eu quero fazer é o seguinte
crie um banco de dados mysql apenas com tabelas, vazio. E usando o msql workbench eu exportei esse meu banco.
a teoria é o seguinte, supondo que o cliente já tenha o mysql instalado, quando o cliente executar o instalador do meu programa, no primeiro uso do programa ele vai no banco e importa pro mysql o arquivo backup que o workbench gerou.

isso na prática está me dando um dor de cabeça imensa, pois preciso entregar o TCC na terça-feira.

não tem algo mais simples, que só pegue esse backup que o workbench fez do meu banco e exporte ele no primeiro uso meu programa.
porque quem estalar não terá o meu banco, só o mysql.
não há uma forma mais simples de fazer isso? Mesmo que não seja do jeito que fiz acima.

Cronograma mal planejado :!: :?:

Boa sorte :wink:

:thumbup:

Na verdade foi muito bem planejado, pois o fazer o instalador não é uma obrigação, apenas o software em funcionamento é pedido, terminei a parte pratica a um bom tempo.
Eu queria fazer o instalador, porque seria algo inédito na escola, mais essa ideia eu só tive quando percebi que iria terminar a parte prática antes do prazo, então apenas quero incrementar, pois fazendo algo de c inédito, com certeza valerá mais para a banca.

Apenas queria entender como isso é feito!
Porque na teoria parece simples: fazer com que o java leia o arquivo backup gerado pelo workbench e execute o no banco, assim gerando o banco do sistema para o usuário.

mais na prática parece algo tão complicado de se fazer.
peço uma coisa
se alguém tiver qualquer coisa que possa me ajudar a entender como isso pode ser feito de forma clara, eu ficaria muito grato.

Se for uma aplicação open source, você pode embarcar o MySQL.

http://dev.mysql.com/tech-resources/articles/mysql-network-and-you.html

Como fazer?

http://jroller.com/mmatthews/entry/yes_it_really_is_this

Cara, tenho esse código aqui:

você pode coloca-lo dentro do ActionPerformed de um JButton para chamar os procedimentos:

//Passo 1: criar o banco!
//verifica se existe o arquivo:

        final String DIRETORIO_BACKUP = "D:/Meus Documentos/backupSistema.sql";

        File arq = new File(DIRETORIO_BACKUP);

//Verifica se o arquivo existe
        if (arq.exists()) { 

// se arquivo existir
//http://www.guj.com.br/java/72547-criar-bd-em-tempo-de-execucao--resolvido-

            try {
//Carrega driver do MySQL
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(JFrameLogin.class.getName()).log(Level.SEVERE, null, ex);
            }
//testando se o banxo existe
            Connection conn;
            try {
                conn = DriverManager.getConnection("jdbc:mysql://localhost/sistema", "root", "xxxxxxxxxxx");

//se existe o database sistema não faz nada!

                JOptionPane.showMessageDialog(null, "Contate o Administrador para primeiro deletar o banco!");

            } catch (SQLException ex) {

//se não existe o database sistema ele cria
                try {
                    conn = DriverManager.getConnection("jdbc:mysql://localhost?user=root&password=xxxxxxxxxxx");

//Crio um Statement
                    Statement stmt = conn.createStatement();
                    System.out.println("Começo");

//Toda operação que não for consulta, use executeUpdate, só assim
//você poderá alterar algo no banco de dados

                    int i = stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS sistema");
                    JOptionPane.showMessageDialog(null, "Banco Criado com sucesso!");// Se criar uma nova base de dados, o retorno será 1
                    System.out.println("Final");
                } catch (SQLException ex1) {
                    JOptionPane.showMessageDialog(null, "Não foi possível criar o banco de dados!");
                    Logger.getLogger(JFrameLogin.class.getName()).log(Level.SEVERE, null, ex1);
                }

                try {
//chamando um aquivo .bat com o código de restauração

                    Runtime.getRuntime().exec("cmd.exe /c start restoreBackup.bat ");
                 
                } catch (IOException ex2) {
                    JOptionPane.showMessageDialog(null, "Não foi possível restaurar o banco... Tente novammente!");
                }

                System.exit(0);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Procedimento não realizado! Arquivo de backup inexistente!");

        }

crie um arquivo .bat salvando-o com o nome: restoreBackup.bat no diretório do seu projeto e dentro deste arquivo ponha este código:

@echo off

mysql --host=localhost --user=root --password=xxxxxxxxxxx --database=sistema < "D:/Meus Documentos/backupSistema.sql"

exit.

você disse:

[quote]
public static void criarDB(){
/*
*Aqui é um ponto que me gera duvida, para poder fazer a conexão com o banco, sem fazer referência a nenhuma tabela
* é possível?, porque como a tabela ainda não foi criada, como posso referenciar uma ?
* apenas quero que seja executado a criação do banco, que está no Instalador.sql
*/ [/quote]

você resolve isso com o código que te passei:

//se não existe o database sistema ele cria try { conn = DriverManager.getConnection("jdbc:mysql://localhost?user=root&password=xxxxxxxxxxx");

boa sorte!