Import txt para o BD[RESOLVIDO]

16 respostas
snowblacksoul

Pessoa, sei que tem alguns post com esse assuntu, mas não conseguir nenhum que me ajudasse a resolver esse problema, já peço desculpas a todos.
Seguinte tenho uma classe que conecta ao banco e insere a informação que eu coloco na query, mas eu quero algo diferente
que ele pegue a informação de um arquivo txt que está com delimitador “;” e importe ao banco de dados como fazer isso?!
Estou pedindo ajuda porque estou começando agora em java e já fiz alguma coisa aqui no trampo e precisa disso! se alguém puder me ajudar agradeço d+!
vou colocar até onde fiz o código!!!

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;
 
public class ImportTxtBd{
    public static void main(String[] args) throws Exception{
        
        try{
         Class.forName("oracle.jdbc.OracleDriver");
         Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
         System.out.println("Conectado");
       
            Statement stmt = con.createStatement();
 
            
            String sql = "INSERT INTO users (name, address)"+"VALUES ('Foo Bar', 'Some Street')";
 
            
            stmt.execute(sql);
 
        } catch (ClassNotFoundException e)
        {
            System.err.println("Could not load database driver!");
        } catch (SQLException e)
        {
            e.printStackTrace();
        } finally
        {
            if (connection != null)
            {
                connection.close();
            }
        }
    }
}

gratos a todos.

16 Respostas

snowblacksoul

Desculpem amigos, na verdade é esse o código:

public class txtBanco {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
       File file = new File("c:/data/teste.txt");
        StringBuffer contents = new StringBuffer();
        BufferedReader reader = null;

        try {
            reader = new BufferedReader(new FileReader(file));
            String text = null;

            // repeat until all lines is read
            while ((text = reader.readLine()) != null) {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // show file contents here
        System.out.println(contents.toString());
        Class.forName("oracle.jdbc.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
        System.out.println("Conectado");

        PreparedStatement ps = con.prepareStatement("insert into system.livros values (?,?,?,?,?");

    }




}

Daí não sei como pegar as informações e fazer um insert no banco!!!

Nicolas_Fernandes

Opa, snowblacksoul!
Beleza?

Cara, você pode fazer o algo parecido:

public class Importacoes {

    public void ImportarArquivoTextoParaDB(String caminho) throws ClassNotFoundException, IOException, SQLException {

        // Seus campos do BD.
        String nome, endereco;



        File file = new File(caminho); // o path do arquivo, ex.: "C:\Importacao.txt"
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

      
        Connection connection = GerenciamentoConexoes.getConnection();
        connection.setAutoCommit(false);

        // Enquanto tiver informação a ser lida...

        //________________________________________________________________________________________________
        // Pode ser assim:
        while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            nome = arrayDados [0];
            endereco = arrayDados [1];

            String sentenca = String.format("INSERT INTO USERS (NAME, ADDRESS) VALUES ('%s', '%s')", nome, endereco);
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            statementInsert.execute();
        }
        connection.commit();

        //________________________________________________________________________________________________
        // Ou, se preferir:
        while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            nome = dado[0];
            endereco = dado[1];

            String sentenca = "INSERT INTO USERS (NAME, ADDRESS) VALUES (?, ?)";
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            for (int I = 0; I < arrayDados.lenght(); ++I) {

                statementInsert.setString( (I + 1), arrayDados[I] );
            }
            statementInsert.execute();
        }
        connection.commit();

        //________________________________________________________________________________________________
        // Ou, melhor ainda, com objetos!
        // Suponhamos que você possua uma classe Usuário, que contenha os atributos Nome e Endereço:

        List<Usuario> listUsuarios = new ArrayList<Usuario>();
        while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Usuario usuario = new Usuario();
            usuario.setNome(arrayDados[0]);
            usuario.setEndereco(arrayDados[1]);
            listUsuarios.add(usuario);
        }

        for (Usuario usuario : listUsuarios) {

            String sentenca = "INSERT INTO USERS (NAME, ADDRESS) VALUES (?, ?)";
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            statementInsert.setString(1, usuario.getNome());
            statementInsert.setString(2, usuario.getEndereco());
            statementInsert.execute();
        }
        connection.commit();
    }
}

Espero que ajude!

snowblacksoul

E ae Nicolas blz, isso vai ajudar e muito!!
Mas Cara nao entendi o porque colocou dados[0]?!

Usuario usuario = new Usuario();  
            usuario.setNome(dados[0]);  
            usuario.setEndereco(dados[1]);  
            listUsuarios.add(usuario);  
        }

estou tentando e nao esta funcionando!?

Kura

Ele deve ter errado. Na verdade seria arrayDados.

Nicolas_Fernandes

snowblacksoul:
E ae Nicolas blz, isso vai ajudar e muito!!
Mas Cara nao entendi o porque colocou dados[0]?!

Usuario usuario = new Usuario();  
            usuario.setNome(dados[0]);  
            usuario.setEndereco(dados[1]);  
            listUsuarios.add(usuario);  
        }

estou tentando e nao esta funcionando!?

É um exemplo que eu quis dar para o arquivo.
Suponhamos que você tenha o arquivo no seguinte formato:

nome;endereco
nome;endereco
nome;endereco

Para cada linha que você ler, você “splita”, ou divide, ela de acordo com o separador (no caso, “;”).
Dividindo a linha modelo com o uso do split…

String linha = bufferedReader.readLine(); String[] arrayDados = linha.split(";");

você simplesmente divide os valores daquela linha em um array, sendo que o valor para o nome vai para a posição 0 e o valor endereço para a posição 1. Se existissem mais campos, então seriam as outras posições.

Quando eu uso arrDados[0], eu quero pegar o valor que tá na posição 0, ou seja, o valor para o nome encontrado no arquivo. Sacou?

Nicolas_Fernandes

Hahaha, é verdade! Agora que me toquei disso… hahaha, foi mal… rs

snowblacksoul

Fala Nicolas!!!
Cara teste aqui, só que nao gravou no banco, e não deu nenhum erro!?
o que pode estar errado!?
olha o código!

public class Importacoes {

    public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException {



   // public void ImportarArquivoTextoParaDB(String caminho) throws ClassNotFoundException, IOException, SQLException {

        // Seus campos do BD.
        String nome, endereco,dados;



        File file = new File("c:/data/teste.txt"); // o path do arquivo, ex.: "C:\Importacao.txt"
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);


        //Connection connection = GerenciamentoConexoes.getConnection();
        //connection.setAutoCommit(false);

         Class.forName("oracle.jdbc.OracleDriver");
         Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
         System.out.println("Conectado");

            Statement stmt = connection.createStatement();


        // Enquanto tiver informação a ser lida...

        //________________________________________________________________________________________________
        // Pode ser assim:
     List<Livros> listUsuarios = new ArrayList<Livros>();
        while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Livros usuario = new Livros();
            //usuario.setNome(dados[0]);
            usuario.setIsbn(arrayDados[0]);
            usuario.setTitulo(arrayDados[1]);
            usuario.setEdicao_num(arrayDados[2]);
            usuario.setAno_publicacao(arrayDados[3]);
            usuario.setDescricao(arrayDados[4]);

        }

        for (Livros usuario : listUsuarios) {

            String sentenca = "insert into system.livros(isbn,titulo,edicao_num,ano_publicacao,descricao) values (?,?,?,?,?)";
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            statementInsert.setString(1, usuario.getIsbn());
            statementInsert.setString(2, usuario.getTitulo());
            statementInsert.setString(3, usuario.getEdicao_num());
            statementInsert.setString(4, usuario.getAno_publicacao());
            statementInsert.setString(4, usuario.getDescricao());

            statementInsert.execute();
        }
        connection.commit();
    }
}

valeu pela ajuda cara!

snowblacksoul

Pessoal ainda nao deu certo, alguém poderia ajudar!?

Nicolas_Fernandes
snowblacksoul:
List<Livros> listLivros = new ArrayList<Livros>();
        while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Livros livro = new Livros();
            livro.setIsbn(arrayDados[0]);
            livro.setTitulo(arrayDados[1]);
            livro.setEdicao_num(arrayDados[2]);
            livro.setAno_publicacao(arrayDados[3]);
            livro.setDescricao(arrayDados[4]);
        }
Faltou adicionar o usuário criado na lista!
List<Livros> listLivros = new ArrayList<Livros>();
while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Livros livro = new Livros();
            livro.setIsbn(arrayDados[0]);
            livro.setTitulo(arrayDados[1]);
            livro.setEdicao_num(arrayDados[2]);
            livro.setAno_publicacao(arrayDados[3]);
            livro.setDescricao(arrayDados[4]);

            listLivros.add(livro);
        }
snowblacksoul

Fala Nicolas, cara agora deu erro, mas acho que falta pouco, vou colocar o codigo primeiro depois o erro!

public class Importacoes {

    public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException {

       File file = new File("c:/data/teste.txt"); // o path do arquivo, ex.: "C:\Importacao.txt"
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);


         Class.forName("oracle.jdbc.OracleDriver");
         Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
         System.out.println("Conectado");

            Statement stmt = connection.createStatement();

     List<Livros> listLivros = new ArrayList<Livros>();
            while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Livros livro = new Livros();
            livro.setIsbn(arrayDados[0]);
            livro.setTitulo(arrayDados[1]);
            livro.setEdicao_num(arrayDados[2]);
            livro.setAno_publicacao(arrayDados[3]);
            livro.setDescricao(arrayDados[4]);

            listLivros.add(livro);
        }
System.out.println("------------------------------------");

        for (Livros livro : listLivros) {

            String sentenca = "insert into system.livros(isbn,titulo,edicao_num,ano_publicacao,descricao) values (?,?,?,?,?)";
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            statementInsert.setString(0, livro.getIsbn());
            statementInsert.setString(1, livro.getTitulo());
            statementInsert.setString(2, livro.getEdicao_num());
            statementInsert.setString(3, livro.getAno_publicacao());
            statementInsert.setString(4, livro.getDescricao());

            statementInsert.execute();
           // statementInsert.executeUpdate();
            //stmt.executeUpdate(sentenca);
        }
        connection.commit();
        System.out.println(listLivros);

    }
}

Erro:

Conectado
------------------------------------
Exception in thread "main" java.sql.SQLException: Índice de coluna inválido
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 4 segundos)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
Nicolas_Fernandes

Os índices, no PreparedStatement, devem começar por 1, e não por 0!

snowblacksoul

Nicolas, valeu mesmo grande, deu certinho agora!!!
grande abraço!
vou deixar o código aqui, para que as pessoas podem utilizar!!!

Classe Livros,javabean:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author daniel
 */
public class Livros {

    private String isbn;
    private String titulo;
    private String edicao_num;
    private String ano_publicacao;
    private String descricao;

    public String getAno_publicacao() {
        return ano_publicacao;
    }

    public void setAno_publicacao(String ano_publicacao) {
        this.ano_publicacao = ano_publicacao;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getEdicao_num() {
        return edicao_num;
    }

    public void setEdicao_num(String edicao_num) {
        this.edicao_num = edicao_num;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

}

Classe de importação, principal:

public class Importacoes {

    public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException {

       File file = new File("c:/data/teste.txt"); // o path do arquivo, ex.: "C:\Importacao.txt"
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);


         Class.forName("oracle.jdbc.OracleDriver");
         Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
         System.out.println("Conectado");

            Statement stmt = connection.createStatement();

     List<Livros> listLivros = new ArrayList<Livros>();
            while (bufferedReader.ready()) {

            String linha = bufferedReader.readLine(); // lê uma linha...
            String[] arrayDados = linha.split(";");  // separa os dados por seu delimitador...

            Livros livro = new Livros();
            livro.setIsbn(arrayDados[0]);
            livro.setTitulo(arrayDados[1]);
            livro.setEdicao_num(arrayDados[2]);
            livro.setAno_publicacao(arrayDados[3]);
            livro.setDescricao(arrayDados[4]);

            listLivros.add(livro);
        }
System.out.println("------------------------------------");

        for (Livros livro : listLivros) {

            String sentenca = "insert into system.livros(isbn,titulo,edicao_num,ano_publicacao,descricao) values (?,?,?,?,?)";
            PreparedStatement statementInsert = connection.prepareStatement(sentenca);
            statementInsert.setString(1, livro.getIsbn());
            statementInsert.setString(2, livro.getTitulo());
            statementInsert.setString(3, livro.getEdicao_num());
            statementInsert.setString(4, livro.getAno_publicacao());
            statementInsert.setString(5, livro.getDescricao());

            statementInsert.execute();
           // statementInsert.executeUpdate();
            //stmt.executeUpdate(sentenca);
        }
        connection.commit();
        System.out.println(listLivros);

    }
}

Valeu galera!! brigadão!!

Nicolas_Fernandes

Já pensou em adequar esse código em um padrão, tipo o MVC? Ia ficar bem mais legível e você estudaria um pouco de arquitetura de projetos! rs

snowblacksoul

Fala Nicolas blz, cara como fazer no modo MVC?!

Você fala em tirar a classe do banco de dados e criar uma connectionfactory isso?!

acho que só faltou isso!! ou tem mais?!

Nicolas_Fernandes
snowblacksoul:
Fala Nicolas blz, cara como fazer no modo MVC?!

Você fala em tirar a classe do banco de dados e criar uma connectionfactory isso?!

acho que só faltou isso!! ou tem mais?!

Quase, snow!
Criar uma ConnectionFactory também, mas digo separar as coisas em camadas:

- Criar a camada de persistência:

1. Criar a classe de gerenciamento de conexões:
public class GerenciadorConexoes {
   
    private GerenciadorConexoes instancia = new GerenciadorConexoes();
    private Connection connection;

    private GerenciadorConexoes() {
        connection = null;
    }
    
    public static GerenciadorConexoes getInstance() {
   
        return instancia;
    }
    public Connection recuperarConnection() {
        
        if (connection == null) { 
            Class.forName("oracle.jdbc.OracleDriver"); 
            connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g"); 
            connection.setAutoCommit(false);
        }
        return connection;
    }

    public void concluirOperacoes() {

        connection.commit();
        connection = null;
    }

    public void cancelarOperacoes() {

        connection.rollback();
        connection = null;
    }
}
2. Criar uma classe de persistência de livros:
public class PersistenciaLivro {

    public void adicionar(Livro livro) throws SQLException {

        String sentenca = "insert into system.livros(isbn,titulo,edicao_num,ano_publicacao,descricao) values (?,?,?,?,?)";  
       
        Connection connection = GerenciadorConexoes.getInstance().recuperarConnection();
        PreparedStatement statementInsert = connection.prepareStatement(sentenca);  
        statementInsert.setString(1, livro.getIsbn());  
        statementInsert.setString(2, livro.getTitulo());  
        statementInsert.setString(3, livro.getEdicao_num());  
        statementInsert.setString(4, livro.getAno_publicacao());  
        statementInsert.setString(5, livro.getDescricao());  
      
        statementInsert.execute();  
        statementInsert.close();
    }
}
3. Criar uma classe de persistência de texto:
public class PersistenciaTexto {

    public List<String> recuperarLinhasArquivo(String caminho) throws IOException {

        File file = new File(caminho); 
        FileReader fileReader = new FileReader(file);  
        BufferedReader bufferedReader = new BufferedReader(fileReader);  
        
        List<String> linhasRecuperadas = new ArrayList<String>();
        while (bufferedReader.ready()) {  
        
            linhasRecuperadas.add(bufferedReader.readLine());
        }  
        return linhasRecuperadas;
    }
}
4. Uma classe de serviços de livros:
public class ServicosLivro {

    public List<Livro> converterStringsEmObjetos(List<String> linhas) {
    
        List<Livro> livros = new ArrayList<Livro>();
        for (String linha : linhas) {

            String[] array= linha.split(";");  // separa os dados por seu delimitador...  
  
            Livro livro = new Livro();  
            livro.setIsbn(arrayLinha[0]);  
            livro.setTitulo(arrayLinha[1]);  
            livro.setEdicao_num(arrayLinha[2]);  
            livro.setAno_publicacao(arrayLinha[3]);  
            livro.setDescricao(arrayLinha[4]);  
            livros.add(livro);
        }
        return livros;
    }

    //FINALMENTE, O MÉTODO QUE FAZ CHAMARÁ OS OUTROS!
    public void importarArquivoLivros(String caminho) throws IOException, SQLException {

        PersistenciaLivro persistenciaLivro = new PersistenciaLivro();
        PersistenciaTexto persistenciaTexto = new PersistenciaTexto();

        List<String> linhasRecuperadas = persistenciaTexto.recuperarLinhasArquivo(caminho);
        List<Livro> livros = this.converterStringsEmObjetos(linhasRecuperadas);

        for (Livro livro : livros) {
            persistenciaLivro.adicionar(livro);
        }
    }

    public void concluirOperacoes() {
        GerenciadorConexoes.getInstance().concluirOperacoes();
    }
    public void cancelarOperacoes() {
        GerenciadorConexoes.getInstance().cancelarOperacoes();
    }
}
6. E não pode faltar o Main:
public class Main {

    public static void main(String[] args) {

        ServicosLivro servicosLivro = new ServicosLivro();
        try {

            servicosLivro.importarArquivoLivros("C:\ArquivoImportacao.txt");
            servicosLivro.concluirOperacoes();
        }
        catch (IOEception errIO) {
            errIO.printStackTrace();
            servicosLivro.cancelarOperacoes();
        }
        catch (SQLException errSQL) {
            errSQL.printStackTrace();
            servicosLivro.cancelarOperacoes();
        }
    }
}

Muitas classes, a primeira vista, não?
Mas, na hora de dar manutenção, de passar o código para outros, de adequar à padrões de arquitetura, será assim mesmo!
O que acha dessa ideia? Não fica tudo mais claro e separadinho?

Abraços!

snowblacksoul

Caracas Nicolas um dia chego nessa fase, valeu mesmo!
Puxa brigadão cara! Estou estudando pra isso, se Deus quiser logo estarei programando certinho!!
Valeu Abraços!!

Criado 21 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 16
Participantes 3