Erro ao instanciar uma classe com main(String args[]){}

14 respostas Resolvido
java
victor.guiraldelli

Bom dia galera tudo beleza?

Estou tendo um problema que parece simples mas não estou conseguindo resolver.

Encontrei uma classe na internet que cria a base de dados para a aplicação rodando um arquivo.sql.

A classe funciona perfeitamente rodando ela diretamente, o problema ocorre quando tento instanciar ela em alguma outra classe.

Eu tentei isto pois pretendo utilizar um método que verifica se a base de dados já existe, e caso não, instanciar esta classe para criar a base de dados.

A classe: https://github.com/apache/ranger/blob/master/jisql/src/main/java/org/apache/util/sql/MySQLPLRunner.java

Quando tento instanciar em qualquer outra classe utilizando MySQLPLRunner criarbd = new MySQLPLRunner(); a execução falha:

Executing C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\dist\run1114622334\OdinSWLM.jar using platform C:\Program Files\Java\jdk1.8.0_66\jre/bin/java
Exception in Application start method

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)

at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)

Caused by: java.lang.RuntimeException: Exception in Application start method

at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)

at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)

at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.UnsupportedOperationException: Not supported yet.

at odinswlmanager.MySQLPLRunner.(MySQLPLRunner.java:52)

at odinswlmanager.OdinSwLManager.start(OdinSwLManager.java:22)

at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)

at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)

at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)

at java.security.AccessController.doPrivileged(Native Method)

at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)

at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)

at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)

 1 more

Exception running application odinswlmanager.OdinSwLManager

Java Result: 1

Alguém saberia o porque isto está ocorrendo?

Obrigado :).

14 Respostas

G

@victor.guiraldelli verifiquei que o construtor da sua classe existem alguns parâmetros, sendo assim ao instanciar um objeto dessa classe será necessário passar esses parâmetros (Connection, boolean, boolean, boolean).
Abaixo segue o construtor da sua classe para que você possa entender melhor o comentário acima.

public MySQLPLRunner(Connection connection, boolean autoCommit,

boolean stopOnError,boolean printDebug) {

this.connection = connection;

this.autoCommit = autoCommit;

this.stopOnError = stopOnError;

this.printDebug=printDebug;

}

Abraço.

staroski

A classe no link https://github.com/apache/ranger/blob/master/jisql/src/main/java/org/apache/util/sql/MySQLPLRunner.java não possui construtor sem parâmetros.

O fonte que você postou no link deve estar diferente do seu, pois o fonte do link apenas possui comentários na linha 52, mas o código que você está executando está lançando uma UnsupportedOperationException nessa linha.
Além do mais, o fonte do link faz parte do pacote org.apache.util.sql e o fonte que você está executando é do pacote odinswlmanager.

Posta o seu código que fica fácil de achar o erro.

victor.guiraldelli

Opa, obrigado pela resposta. Percebi o seguinte agora:

Quando coloquei o MySQLPLRunner criarbd = new MySQLPLRunner(); pela primeira vez, pediu para criar o construtor e eu coloquei para criar, ficou um construtor novo na classe do MySQLPLRunner.

Apaguei o construtor novo, mas ainda não sei o que precisa adicionar no MySQLPLRunner criarbd = new MySQLPLRunner(); para utilizar este construtor?

As conexões estão setadas na própria classe do MySQLPLRunner, fiquei confuso agora para estes parâmetros: (Connection connection, boolean autoCommit, boolean stopOnError,boolean printDebug) vindo de outra classe. :S

victor.guiraldelli

É que meu código é grande demais.

Mas sobre o que você disse, a classe MySQLPLRunner.java estava no pacote odinswlmanager, mas mudei para o pacote modelos, quanto a isto está ok. Importei com import modelo.MySQLPLRunner;

A classe onde estou tentando chamar a MySQLPLRunner esta no pacote odinswlmanager:

Resumão aqui:

public class LoginController implements Initializable {

// ---- muita coisa aqui...

@Override
    public void initialize(URL url, ResourceBundle rb) {
       txtfLogUser.requestFocus(); 

       conectar = new Conectar();
    
       MySQLPLRunner criarbd = new MySQLPLRunner();

}...

Agora só não sei como acertar esta instância.

staroski

O que tem na linha 52 da classe MySQLPLRunner?

O que tem na linha 22 da classe OdinSwLManager?

victor.guiraldelli

Então, estes erros tem que desconsiderar, pq eles ocorriam pq eu tinha clicado pra criar um construtor automático lá no MySQLPLRunner.

Na linha 52 estava o construtor vazio, que já excluí.

O erro que aparece se eu compilar agora é:

Updating property file: C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\build\built-jar.properties
Compiling 1 source file to C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\build\classes
C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\src\odinswlmanager\LoginController.java:346: error: constructor MySQLPLRunner in class MySQLPLRunner cannot be applied to given types;
       MySQLPLRunner criarbd = new MySQLPLRunner();
  required: Connection,boolean,boolean,boolean
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error
C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\nbproject\build-impl.xml:924: The following error occurred while executing this line:
C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\nbproject\build-impl.xml:264: Compile failed; see the compiler error output for details.
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

Porque não estou sabendo o que complementar no código da instância na classe odinswlmanager.LoginController.java onde marquei com —aqui—:

@Override
public void initialize(URL url, ResourceBundle rb) {
   txtfLogUser.requestFocus(); 
 
   conectar = new Conectar();

   MySQLPLRunner criarbd = new MySQLPLRunner(---aqui---);

    inserirAdmin = new InserirAdmin();
    
    try {
        inserirAdmin.VerificarAdmin();
    } catch (SQLException ex) {
        Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
    }
  
}

private Object getChildren() {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

para lidar com o construtor original da classe MySQLPLRunner.java:

public MySQLPLRunner(Connection connection, boolean autoCommit,
            boolean stopOnError,boolean printDebug) {
        this.connection = connection;
        this.autoCommit = autoCommit;
        this.stopOnError = stopOnError;
        this.printDebug=printDebug;
    }

Preciso que funcione esta criação do BD invocando a classe dentro de outra para poder implementar no método que verifica se existe ou não, e caso não, criar antes de dar continuidade na aplicação. Lembrando que se eu for em “Executar Arquivo” no MySQLPLRunner.java, funciona perfeitamente.

O método que vai verificar está na odinswlmanager.LoginController.java:

public boolean verificarSeBDexiste() throws ClassNotFoundException, SQLException {
        List<String> list = new ArrayList<String>();
        Scanner input = new Scanner(System.in);
        String database = "odinswlmanager";
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql:/xxxxx:3306", "xxxxx", "xxxxx");
        Statement st = con.createStatement();
        DatabaseMetaData meta = con.getMetaData();
        ResultSet rs = meta.getCatalogs();
        while (rs.next()) {
            String listofDatabases = rs.getString("TABLE_CAT");
            list.add(listofDatabases);
        }
        if (list.contains(database)) {
            return true;
        } else {
            return false;
        }  
    }

Dependendo deste retorno, eu instanciaria o:

MySQLPLRunner criarbd = new MySQLPLRunner();

Acho que assim fica mais fácil para entenderem hehe.

G

@victor.guiraldelli para resolver esse seu problema aconselho utilizar um padrão de projeto chamado singleton, assim vc garantirá que apenas uma classe será responsável por estabelecer a conexão com banco de dados.
Sendo assim, seu projeto precisará de algumas modificações para deixar o código mais coeso e com baixo acoplamento.
Abaixo encontra-se um exemplo de como seria uma classe utilizando os conceitos desse padrão de projeto.

public class ConnectionManager {

private PGPoolingDataSource dataSource;

public Connection getConnection() throws Exception {
    Connection conn = dataSource.getConnection();
    conn.setAutoCommit(false);
    return conn;
}
//Inicio Singleton

private ConnectionManager() {
    dataSource = new PGPoolingDataSource();
    dataSource.setDataSourceName("teste");
    dataSource.setServerName("127.0.0.1");
    dataSource.setPortNumber(5432);
    dataSource.setDatabaseName("nomeBancoDados");
    dataSource.setUser("usuarioBancoDados");
    dataSource.setPassword("senhaUsuario");
    dataSource.setMaxConnections(30);
    dataSource.setInitialConnections(10);
}
private static ConnectionManager instance;

public static ConnectionManager getInstance() {
    if (instance == null) {
        instance = new ConnectionManager();
    }
    return instance;
}

Por fim, estou deixando um link para que possa entender melhor sobre Singleton.

victor.guiraldelli

Opa, eu tenho uma classe parecida, é que eu estava tentando fazer funcionar daquela forma primeiro para poder modificar para adequar ao padrão da conexão.

package modelo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author e001307
 */
public class Conectar {

//  Modo Non-Static  
    private Connection connection;
    private String url = "jdbc:mysql://xxxxxxxx/odinswlmanager";
    private String usuario = "xxxxxx";
    private String senha = "xxxxx";
    
    public Connection getConnection()                { return this.connection; }
    public void setConnection(Connection connection) {  this.connection = connection;   }    
    
    public int conectarOdin() {
        try {   Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager.getConnection(url, usuario, senha);
                System.out.println("-   Connection to OdinSwlManager Server established.");
        return 1;                                                            
    } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex); }
        return 0;   }
    
    public void conectarDB() {
        try {   Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager.getConnection(url, usuario, senha);
                System.out.println("-   Connection to MySql Server established.");
    } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex); }}
    
    public void desconectarDB() {        
        try {   connection.close();
                System.out.println("-   Connection close.");
    } catch (SQLException ex) {
            Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex); }
    }
}

Os métodos desta classe estão conectando na tabela já criada na base de dados, e para verificar se a tabela já existe ou não, eu tenho que conectar apenas a base de dados sem a tabela, pois até onde entendi, aquele método lista todas as tabelas existentes e compara com a que estiver na variável.

Talvez eu possa colocar o método de verificação da base de dados dentro desta classe “Conectar.java”, mas acho que o problema continuaria o mesmo na hora de instanciar a classe que cria a tabela na base de dados. xD

staroski

Olha como foi implementado o método main da classe MySQLPLRunner, lá a classe é instanciada com os parâmetros que ela espera.

victor.guiraldelli

Então, da pra ver aqui: https://github.com/apache/ranger/blob/master/jisql/src/main/java/org/apache/util/sql/MySQLPLRunner.java

Única coisa que está diferente no meu são os parâmetros de conexão.

Só precisava saber se tinha como rodar esta classe via instância.

O construtor dela é:

public MySQLPLRunner(Connection connection, boolean autoCommit,
            boolean stopOnError,boolean printDebug) {
        this.connection = connection;
        this.autoCommit = autoCommit;
        this.stopOnError = stopOnError;
        this.printDebug=printDebug;
}

O Main:

public static void main(String args[]){
	// Creating object of ScriptRunner class
	  Connection con = null;
	  String driverName = "com.mysql.jdbc.Driver";
	  Properties props = null;
	  try {
          Class.forName(driverName).newInstance();
          props = new Properties();

          props.put("user", "xxxxxxxxxxxxxxxxxx");

          props.put("password", "xxxxxxxxxxxxxx");
          String connectString = "jdbc:mysql://xxxxxxxxxxxxxxx:3306";
          con = DriverManager.getConnection(connectString, props);


	MySQLPLRunner scriptRunner = new MySQLPLRunner(con, false, true,true);
 	//String aSQLScriptFilePath = "/disk1/zero/jisql-2.0.11/xa_core_db.sql";
    String aSQLScriptFilePath = "PLRUnner.sql";
	
	
	// Executing SQL Script
 	FileReader reader = new FileReader(aSQLScriptFilePath);
 	
 	try {
 		scriptRunner.runScript(reader);
 	}
 	finally {
 		if (reader != null) {
 			try {
 			reader.close();
 			}
 			catch(IOException ioe) {
 				// Ignore IOException when reader is getting closed
 			}
 		}
 	}

	
	  }
      catch (SQLException sqle) {
    	  sqle.printStackTrace();
      }
      catch (ClassNotFoundException cnfe) {
          System.err.println("Cannot find the driver class \"" + driverName + "\" in the current classpath.");
      }
      catch (InstantiationException ie) {
          System.err.println("Cannot instantiate the driver class \"" + driverName + "\"");
          ie.printStackTrace(System.err);
      }
      catch (IllegalAccessException iae) {
          System.err.println("Cannot instantiate the driver class \"" + driverName + "\" because of an IllegalAccessException");
          iae.printStackTrace(System.err);
      }catch (Exception sqle) {
    	  sqle.printStackTrace();
      }
      finally {
          if (con != null) {
              try {
            	  con.close();
              }
              catch (SQLException ignore) {
                  /* ignored */
              }
          }
      }
}

Por causa do construtor, na instância pede Connection,boolean,boolean.

Tentei fazer assim: MySQLPLRunner criarbd = new MySQLPLRunner(connection,true,true,true);

Mas só instanciar não é o suficiente, não executa o código todo como quando eu clico em MySQLPLRunner.java com botão direito e vou em executar arquivo.

Ai pensei em colocar:

MySQLPLRunner criarbd = new MySQLPLRunner(connection,true,true,true);
criarbd.runScript();

Mas aí no criarbd.runScript(); pede o parâmetro Reader:

public void runScript(Reader reader) throws IOException, SQLException {
        try {
            boolean originalAutoCommit = connection.getAutoCommit();
            try {
                if (originalAutoCommit != this.autoCommit) {
                    connection.setAutoCommit(this.autoCommit);
                }
                runScript(connection, reader);
            } finally {
                connection.setAutoCommit(originalAutoCommit);
            }
        } catch (IOException e) {
            throw e;
        } catch (SQLException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException("Error running script.  Cause: " + e, e);
        }
    }

Não sei o que colocar nesse parâmetro Reader, na verdade não sei nem se é possível realmente.

staroski

Claro que é possível, isso já é feito no método main da classe MySQLPLRunner.
Se você olhar o código que tem lá, ele conecta com o banco, cria uma instância da classe MySQLPLRunner chamado de scripRunner, ele passa como parâmetro para o construtor o objeto Connection, false, true e true.
Depois ele invoca o método runScript passando um objeto Reader que contém o script SQL a ser executado.

victor.guiraldelli

Isso significa que só instanciar deveria funcionar, sem rodar nenhum método da MySQLPLRunner?
Pq não está ocorrendo.

Tentei assim no LoginController.java que é onde preciso chamar a MySQLPLRunner:

@Override
public void initialize(URL url, ResourceBundle rb) {
   
   MySQLPLRunner criarbd = new MySQLPLRunner(connection,false,true,true);
   String aSQLScriptFilePath = "PLRUnner.sql";
   
   FileReader reader = null;

try {
 		criarbd.runScript(reader);
 	}
catch (IOException ex) {
    Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
    Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
    
}     	finally {
 		if (reader != null) {
 			try {
 			reader.close();
 			}
 			catch(IOException ioe) {
 				// Ignore IOException when reader is getting closed
 			}
 		}
}
 	
}

Deu erro:

Executing C:\Users\e001307\Documents\NetBeansProjects\OdinSWLM\dist\run175595151\OdinSWLM.jar using platform C:\Program Files\Java\jdk1.8.0_66\jre/bin/java
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
	at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
	at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: 
file:/C:/Users/e001307/Documents/NetBeansProjects/OdinSWLM/dist/run175595151/OdinSWLM.jar!/odinswlmanager/Login.fxml

	at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
	at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
	at odinswlmanager.OdinSwLManager.start(OdinSwLManager.java:22)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
	at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
	... 1 more
Caused by: java.lang.RuntimeException: Error running script.  Cause: java.lang.NullPointerException
	at modelo.MySQLPLRunner.runScript(MySQLPLRunner.java:98)
	at odinswlmanager.LoginController.initialize(LoginController.java:351)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
	... 17 more
Caused by: java.lang.NullPointerException
	at modelo.MySQLPLRunner.runScript(MySQLPLRunner.java:84)
	... 19 more
Exception running application odinswlmanager.OdinSwLManager
Java Result: 1
staroski
Solucao aceita

Acho que faltou você interpretar o que acontece no método main da classe MySQLPLRunner.

Vê se assim fica mais claro:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Properties propriedades = new Properties();
propriedades.put("user", <aqui vai o nome do usuario>);
propriedades.put("password", <aqui vai a senha do usuario>);
String urlConexao = "jdbc:mysql://<aqui vai o endereço do banco>:<a aqui vai a porta>";
Connection conexao = DriverManager.getConnection(urlConexao, propriedades);
Reader scriptSql = <aqui tem que inicializar um Reader que forneça o script a ser executado>;

MySQLPLRunner scriptRunner = new MySQLPLRunner(conexao, false, true, true);
scriptRunner.runScript(scriptSql);
victor.guiraldelli

Agora sim funcionou hah :smiley: Muito obrigado.

Mas para eu entender melhor, vou questionar, desculpe o incômodo pela falta de conhecimento, estou num nível iniciante “curioso”. kkk

Eu não entendi o porque tenho que colocar todos os parâmetros de conexão aqui na classe LoginController.java novamente, se eles estão já na MySQLPLRunner.java? E também porque eu tenho que passar o reader denovo, se ele já está acertado na MySQLPLRunner.java também?

Ficou desta forma no LoginController.java:

@Override
    public void initialize(URL url, ResourceBundle rb) {
       txtfLogUser.requestFocus(); 

       Connection con = null;
    	  String driverName = "com.mysql.jdbc.Driver";
    	  Properties props = null;
          FileReader reader = null;
          
        try {
            Class.forName(driverName).newInstance();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
              props = new Properties();

              props.put("user", "Odin");

              props.put("password", "xxxxxxx");
              String connectString = "jdbc:mysql://xxxxxxxxx:3306";
              
        try {
            con = DriverManager.getConnection(connectString, props);
        } catch (SQLException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }

        String aSQLScriptFilePath = "PLRUnner.sql";
        
        try {
            reader = new FileReader(aSQLScriptFilePath);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
              
    	MySQLPLRunner scriptRunner = new MySQLPLRunner(con, false, true,true);
     	//String aSQLScriptFilePath = "/disk1/zero/jisql-2.0.11/xa_core_db.sql";
        try {
            scriptRunner.runScript(reader);
            
            // Executing SQL Script
        } catch (IOException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
     	

     	
    }

É bem parecido com o que está na MySQLPRunner.java, achei que daria para aproveitar o de lá:

public static void main(String args[]){
    	// Creating object of ScriptRunner class
    	  Connection con = null;
    	  String driverName = "com.mysql.jdbc.Driver";
    	  Properties props = null;
    	  try {
              Class.forName(driverName).newInstance();
              props = new Properties();

              props.put("user", "Odin");

              props.put("password", "xxxxxxx");
              String connectString = "jdbc:mysql://xxxxxxx:3306";
              con = DriverManager.getConnection(connectString, props);


    	MySQLPLRunner scriptRunner = new MySQLPLRunner(con, false, true,true);
     	//String aSQLScriptFilePath = "/disk1/zero/jisql-2.0.11/xa_core_db.sql";
        String aSQLScriptFilePath = "PLRUnner.sql";
    	
    	
    	// Executing SQL Script
     	FileReader reader = new FileReader(aSQLScriptFilePath);
     	
     	try {
     		scriptRunner.runScript(reader);
     	}
     	finally {
     		if (reader != null) {
     			try {
     			reader.close();
     			}
     			catch(IOException ioe) {
     				// Ignore IOException when reader is getting closed
     			}
     		}
     	}

    	
    	  }
          catch (SQLException sqle) {
        	  sqle.printStackTrace();
          }
          catch (ClassNotFoundException cnfe) {
              System.err.println("Cannot find the driver class \"" + driverName + "\" in the current classpath.");
          }
          catch (InstantiationException ie) {
              System.err.println("Cannot instantiate the driver class \"" + driverName + "\"");
              ie.printStackTrace(System.err);
          }
          catch (IllegalAccessException iae) {
              System.err.println("Cannot instantiate the driver class \"" + driverName + "\" because of an IllegalAccessException");
              iae.printStackTrace(System.err);
          }catch (Exception sqle) {
        	  sqle.printStackTrace();
          }
          finally {
              if (con != null) {
                  try {
                	  con.close();
                  }
                  catch (SQLException ignore) {
                      /* ignored */
                  }
              }
          }
    }

Mas bom, tentei modificar um pouco pra ficar mais limpo, aprova?

Acrescentei na minha classe modelo.Conectar:

public void conectarDB2() {
        try {   Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager.getConnection(url2, usuario, senha);
                System.out.println("-   Connection to MySql Server established.");
    } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex); }
    }

E então na LoginController.java:

@Override
    public void initialize(URL url, ResourceBundle rb) {
       txtfLogUser.requestFocus(); 
    
    conectar = new Conectar();

        conectar.conectarDB2();
        FileReader reader = null;            

        String aSQLScriptFilePath = "PLRUnner.sql";
        
        try {
            reader = new FileReader(aSQLScriptFilePath);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
              
    	MySQLPLRunner scriptRunner = new MySQLPLRunner(conectar.getConnection(), false, true,true);
     	
        try {
            scriptRunner.runScript(reader);
            
        } catch (IOException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
     	
    }

Funcionou, só não sei avaliar se está “BOM”. :S

Mas enfim, muito obrigado pela atenção aí até agora, ajudou demais. :smiley:

Criado 28 de novembro de 2017
Ultima resposta 30 de nov. de 2017
Respostas 14
Participantes 3