Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Programação Orientada a ObjetosObjetos Banco de Dados – II Consulta SQL • Um comando de consulta SQL para uma matricula específica é dado na forma abaixo. SELECT * FROM TBAlunos WHERE matricula = 2010234 • Dentro do programa o comando SQL não poderá ter um número de matricula constante. Precisará ser uma variável para que várias matrículas possam servariável para que várias matrículas possam ser consultadas. O comando fica na forma abaixo. SELECT * FROM TBAlunos WHERE matricula = ? • No formato acima o ? é uma variável que em tempo de execução será substituida por valor específico para a matricula a ser consultado. • Cada variável recebe um número a partir de 1, da esquerda para a direita. Classes JDBC envolvidas Connection • Connection – esta classe é responsável em estabelecer e manter uma conexão com o banco de dados. • No projeto de implementação a instanciação do objeto da classe Connection é realizada pelaobjeto da classe Connection é realizada pela classe FabricaConexao. • O uso da classe FabricaConexao foi dado em módulo anterior. Classes JDBC envolvidas PreparedStatement • PreparedStatement (PS) – esta classe é responsável em preparar um comando SQL a ser enviado ao banco de dados/tabela. • Um comando SQL com variável precisa ser preparado, ou seja, complementado de forma que possa ser enviado ao BD. • Para instanciar um objeto da classe PreparedStatement utilizaremos um objeto da classe Connection. • O método prepareStatement é chamado a partir do objeto da classe Connection para criar o objeto de PS. • O método prepareStatement recebe como parâmetro a String contendo o comando SQL e retorna um objeto da classe PreparedStatement. Veja slide seguinte. Consulta SQL • Instanciação do objeto da classe PreparedStatement. public Aluno consultarAluno(long matrAluno)throws Exception { String consulta = “SELECT * FROM TBAlunos WHERE matricula = ?”; Connection conexao = FabricaConexao.abreConexaoBD(); PreparedStatement comando = conexao.prepareStatement(consulta); comando.setLong(1, matrAluno); ...... } Classes JDBC envolvidas PreparedStatement • Preparar o comando SQL consiste em substituir a variável do comando SQL por um valor específico. • A substituição das variáveis por valores é realizada por meio de métodos específicos de acordo com o tipo de dado da variável a ser substituída. • Métodos: – setString – para atribuir uma valor para uma variável de– setString – para atribuir uma valor para uma variável de tipo string. – setInt – para tipo int. – setLong – para tipo long. – setDate – para um tipo da classe Date. – Outros; • Exemplo: comando.setLong(1, matrAluno); Classes JDBC envolvidas PreparedStatement • A classe PS disponibiliza o método executeQuery() para o envio do comando SQL de consulta para execução no servidor de banco de dados. • A execução do método retorna um objeto que terá o resultado da consulta feita ao banco de dados.resultado da consulta feita ao banco de dados. • O objeto retornado é da classe ResultSet. A estrutura de código é dada no slide seguinte. Consulta SQL • Preparação e execução do comando SELECT. public Aluno consultarAluno(long matrAluno)throws Exception { String consulta = “SELECT * FROM TBAlunos WHERE matricula = ?”; Connection conexao = FabricaConexao.abreConexaoBD(); PreparedStatement comando = conexao.prepareStatement(consulta); comando.setLong(1, matrAluno); ResultSet retorno = comando.executeQuery(); 20102040 ResultSet retorno = comando.executeQuery(); } SELECT * FROM TBAlunos WHERE matricula = 20102040”; • Instrução SQL após preparação • Envio da instrução ao SGBD ResultSet retorno = comando.executeQuery(); Consulta SQL SELECT * FROM TBAlunos WHERE matricula = 20102040”; • Instrução SQL após preparação • Envio da instrução ao SGBD e retorno do SELECT ResultSet retorno = comando.executeQuery();ResultSet retorno = comando.executeQuery(); SGBD matricula nome email 201107123456 José Manoel jm@com Classes JDBC envolvidas ResultSet • Representa o resultado de consulta (cursor) • Permite percorrer o cursor (unidirecional e seqüencial) • Possibilita obter o valor das colunas, retornadas na consulta • Possibilita obter informações da tabela/visão em tempo de execução (nome, tipo e propriedades das colunas, nome da tabela, etc.) Classes JDBC envolvidas ResultSet • verificar se existem mais registros para serem lidos, com o método next() • Dado um objeto (obj) da classe ResultSet, chamar o método next() significa obter a próxima linha de dados retornados na consulta. boolean obj.next();boolean obj.next(); • No exemplo, o método irá retornar true se houver dados a processar, false se não houver mais dados • pode-se consultar os campos através de métodos específicos, que mapeam o tipo SQL para o tipo Java. Por exemplo, getString(campo) obtém um campo do tipo string. Classes JDBC envolvidas ResultSet matricula nome email 200010 Beth Cruz bc@com 20012040 José Manoel jm@com 200330 Eliz San es@com • Dada a tabela abaixo - TBAlunos • Admitindo que a consulta abaixo foi preparada e executada, obtendo-se um objeto da classe ResultSet. SELECT * FROM TBAlunos WHERE matricula = 200120 • Assumimos que o objeto criado seja o seguinte: ResultSet retorno = comando.executeQuery(); • A consulta retornada será uma tabela com a estrutura abaixo. Observe o cursor retorno, apontando para o inicio da tabela. Classes JDBC envolvidas ResultSet matricula nome email 20012040 José Manoel jm@com retorno • Uma chamada de execução ao método next(), ocasionará um deslocamento no cursor para o primeiro conjunto dos dados retornados. retorno.next(); (irá retornar true) matricula nome email 20012040 José Manoel jm@com retorno Classes JDBC envolvidas ResultSet • Uma outra chamada de execução ao método next(), ocasionará um deslocamento no cursor para posição após dados. retorno.next(); (irá retornar false) matricula nome email 20012040 José Manoel jm@comretorno Final da consulta • Para obter os dados obtidos na consulta para uso dentro do programa, a classe ResultSet disponibiliza alguns métodos: – getString – para obter um dado de uma coluna do tipo string – getInt – para obter um dado de uma coluna do tipo int – getLong – para obter um dado do tipo long Classes JDBC envolvidas ResultSet – getLong – para obter um dado do tipo long • Os dados podem ser obtidos de acordo com o número da coluna, iniciando em 1, ou por meio do nome da coluna. matricula nome email 20012040 José Manoel jm@com nome da coluna número da coluna conteúdo da coluna 321 Classes JDBC envolvidas ResultSet • Com o objeto retorno a obtenção dos dados da consulta para variáveis (objetos) dentro do programa se dá nas formas abaixo. • Os dados obtidos são aqueles para onde o cursor está apontando. long numMatr = retorno.getLong(1); String strNome = retorno.getString(“nome”); String strEmail = retorno.getString(3); matricula nome email 20012040 José Manoel jm@comretorno Consulta SQL • Processamento retorno do SELECT public Aluno consultarAluno(long matrAluno)throws Exception { ... ResultSet retorno = comando.executeQuery(); objAluno matricula=20102040 nome=“Jose Manuel” email=“jj@com” objeto retornado if (retorno.next()) { String vNome = retorno.getString(“nome”); String vEmail = retorno.getString(“email”); Aluno objAluno = new Aluno(matrAluno, vNome, vEmail); return objAluno; else throw new Exception(“Matricula não localizada”); } } Dados retornados pelo SELECT Inclusão SQL • Um comando de inclusão de dados de um aluno é dado na forma abaixo. INSERT INTO TBAlunos VALUES (2010234, ‘Jose Manuel’, ‘jj@com’) • Dentro do programa o comando SQL não poderá ter valores constantes. Precisará ter variáveis para serem preenchidas com os dados a serem gravados.preenchidas com os dados a serem gravados. INSERT INTO TBAlunos VALUES (?, ?, ?) • No formato acima temos 3 variáveis, a primeira da esquerda é a 1, a do meio 2, e a última 3 . • Cada variável deverá receber umvalor para que o comando INSERT possa ser enviado ao banco de dados. Inclusão SQL public void incluirAluno (AlunoBean objAluno) throws Exception { String insere = “INSERT INTO TBAlunos VALUES (?, ?, ?)”; Connection conexao = FabricaConexao.abreConexaoBD(); PreparedStatement comando = conexao.prepareStatement(insere); objAluno matricula=20102040 nome=“Jose Manuel” email=“jj@com” comando.setLong(1, objAluno.getMatricula()); comando.setString(2, objAluno.getNome()); comando.setString(3, objAluno.getEmail()); comando.execute(); }
Compartilhar