Import txt para o BD[RESOLVIDO]

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.

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!!!

Opa, snowblacksoul!
Beleza?

Cara, você pode fazer o algo parecido:

[code]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();
}

}[/code]

Espero que ajude!

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!?

Ele deve ter errado. Na verdade seria arrayDados.

[quote=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!?
[/quote]

É 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?

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

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!

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

[quote=snowblacksoul]

[code]

 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]);
    }

[/code][/quote]

Faltou adicionar o usuário criado na lista!

[code]List listLivros = new ArrayList();
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);
    }[/code]

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)

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

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!!

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

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?!

[quote=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?![/quote]

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;
    }
}
  1. Criar uma classe de persistência de livros:

[code]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();
}

}[/code]

  1. Criar uma classe de persistência de texto:

[code]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;
}

}[/code]

  1. Uma classe de serviços de livros:

[code]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();
}

}[/code]

  1. 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!

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!!