Search a table in MySQL with Java

1

I'm having trouble trying to fetch something from the table, I'm a newbie so I did it the way I know.

Button code:

livros.setPesquisarLivro(txtLivro.getText());
    try {
        modelo.setNumRows(0);

        for (ObjetoLivro c : livroDAO.pesquisarLivro(livros)) {
            modelo.addRow(new Object[]{
                c.getNomeLivro(),
                c.getAutor(),
                c.getGenero()});
                c.getAlunoLivro();
        }

    } catch (Exception e) {
    }

Search Code:

public ArrayList<ObjetoLivro> pesquisarLivro(ObjetoLivro pesquisar) throws SQLException {
    ResultSet rs = ConnectionFactory.getStatement().executeQuery("SELECT IDLIVRO,NOMELIVRO,AUTOR,GENERO,NOMEALUNO FROM LIVRO WHERE NOMELIVRO LIKE  '%"+pesquisar+"%'");
    ArrayList<ObjetoLivro> livros = new ArrayList<ObjetoLivro>();
    while (rs.next()) {
        ObjetoLivro livros2 = new ObjetoLivro();
        livros2.setIdLivro(rs.getInt(1));
        livros2.setNomeLivro(rs.getString(2));
        livros2.setAutor(rs.getString(3));
        livros2.setGenero(rs.getString(4));
        livros2.setAlunoLivro(rs.getString(5));
        livros.add(livros2);
    }
    return livros;
}

Code of ConnectionFactory :

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConnectionFactory {

private static Connection connection = null;
private static Statement statement;

static {
    try {
        Class.forName("com.mysql.jdbc.Driver");

        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/biblioteca",
                 "root", "");
        statement = connection.createStatement();

    } catch (Exception ex) {
        Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static Statement getStatement() {
    return statement;
}
}

Code of ObjetoLivro :

package Model;
public class ObjetoLivro {
private String nomeLivro,autor,genero,alunoLivro,pesquisarLivro;
private int idLivro;
public String getPesquisarLivro() {
    return pesquisarLivro;
}

public void setPesquisarLivro(String pesquisarLivro) {
    this.pesquisarLivro = pesquisarLivro;
}

public String getNomeLivro() {
    return nomeLivro;
}

public void setNomeLivro(String nomeLivro) {
    this.nomeLivro = nomeLivro;
}

public String getAutor() {
    return autor;
}

public void setAutor(String autor) {
    this.autor = autor;
}

public String getGenero() {
    return genero;
}

public void setGenero(String genero) {
    this.genero = genero;
}

public int getIdLivro() {
    return idLivro;
}

public void setIdLivro(int idLivro) {
    this.idLivro = idLivro;
}

public String getAlunoLivro() {
    return alunoLivro;
}

public void setAlunoLivro(String alunoLivro) {
    this.alunoLivro = alunoLivro;
} 
}

The return of the search code is:

  

[]

And my table does not show anything after clicking the search button.

    
asked by anonymous 16.01.2017 / 14:23

2 answers

1

The problem is that, in the following section, you are concatenating the instance of the ObjetoLivro class instead of the book name:

WHERE NOMELIVRO LIKE '%"+pesquisar+"%'");
//Deveria ser
WHERE NOMELIVRO LIKE '%"+pesquisar.getNomeLivro()+"%'");

Furthermore, ideally you would use PreparedStatement instead of Statement , since the former has vantages over the second as you can see here .

With a PreparedStatement your code would look like this:

ConnectionFactory:

public class ConnectionFactory {
    //O resto do código

    public static PreparedStatement createPreparedStatement(String sql) throws SQLException {
        connection.prepareStatement(sql);
    }
}

Search Code:

public ArrayList<ObjetoLivro> pesquisarLivro(ObjetoLivro pesquisar) throws SQLException {
    PreparedStatement ps = ConnectionFactory.createPreparedStatement("SELECT IDLIVRO,NOMELIVRO,AUTOR,GENERO,NOMEALUNO FROM LIVRO WHERE NOMELIVRO LIKE ?");
    ps.setString(1, "%" + pesquisar.getNomeLivro() + "%");

    ResultSet rs = ps.executeQuery();

    ArrayList<ObjetoLivro> livros = new ArrayList<ObjetoLivro>();
    while (rs.next()) {
        ObjetoLivro livro = new ObjetoLivro();
        livro.setIdLivro(rs.getInt(1));
        livro.setNomeLivro(rs.getString(2));
        livro.setAutor(rs.getString(3));
        livro.setGenero(rs.getString(4));
        livro.setAlunoLivro(rs.getString(5));
        livros.add(livro);
    }
    return livros;
}
    
16.01.2017 / 14:59
0

The first problem with your code, as others have pointed out, is this:

'%"+pesquisar+"%'"

What you wanted was this:

'%"+pesquisar.getNomeLivro()+"%'"

Another possibility is to change this:

public ArrayList<ObjetoLivro> pesquisarLivro(ObjetoLivro pesquisar) throws SQLException {

So:

public List<ObjetoLivro> pesquisarLivro(String pesquisar) throws SQLException {

This is because I believe you want a method that:

  

" from a title or part of a book title to search, return all books that have that title ".

This is a bit different from a method that:

  

" From a book that has some title, return all books containing the title of the book provided within your own titles .

However your code still has other problems:

To solve these problems, here's how your ConnectionFactory is and your search method:

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

    public static Connection connect() throws SQLException {
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/biblioteca", "root", "");
    }
}
public List<ObjetoLivro> pesquisarLivro(String nomeLivro) throws SQLException {
    List<ObjetoLivro> livros = new ArrayList<>();
    String sql = "SELECT IDLIVRO, NOMELIVRO, AUTOR, GENERO, NOMEALUNO FROM LIVRO WHERE NOMELIVRO LIKE ?";
    try (
        Connection conn = ConnectionFactory.connect();
        PreparedStatement ps = conn.prepareStatement(sql);
    ) {
        ps.setString(1, "%" + nomeLivro + "%");
        try (ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                ObjetoLivro livros2 = new ObjetoLivro();
                livros2.setIdLivro(rs.getInt(1));
                livros2.setNomeLivro(rs.getString(2));
                livros2.setAutor(rs.getString(3));
                livros2.setGenero(rs.getString(4));
                livros2.setAlunoLivro(rs.getString(5));
                livros.add(livros2);
            }
        }
    }
    return livros;
}
    
16.01.2017 / 15:32