JDBC significa Java Database Connectivity, que é uma API Java padrão para conectividade independente de banco de dados entre a linguagem de programação Java e uma ampla variedade de bancos de dados.
A arquitetura JDBC geral consiste em duas camadas da API JDBC (fornece a conexão do aplicativo para o gerenciador JDBC) e da API do driver JDBC (oferece suporte para a conexão do gerenciador para o driver JDBC).
A API JDBC consiste nas seguintes interfaces e classes: DriverManager, Driver, Conexão, Instrução, ResultSet, SQLException.
JDBC DriverManager é uma classe que gerencia uma lista de drivers de banco de dados. Ele combina as solicitações de conexão do aplicativo java com o driver de banco de dados apropriado usando o subprotocolo de comunicação.
O driver JDBC é uma interface que permite a um aplicativo Java interagir com um banco de dados. Para se conectar a bancos de dados individuais, o JDBC requer drivers para cada banco de dados. O driver JDBC fornece a conexão com o banco de dados e implementa o protocolo para transferir a consulta e o resultado entre o cliente e o banco de dados.
A interface de conexão consiste em métodos para contatar um banco de dados. O objeto de conexão representa o contexto de comunicação.
Instrução encapsula uma instrução SQL que é passada para o banco de dados para ser analisada, compilada, planejada e executada.
Esses objetos contêm dados recuperados de um banco de dados depois que você executa uma consulta SQL usando objetos de instrução. Ele atua como um iterador para permitir que você navegue pelos dados. A interface java.sql.ResultSet representa o conjunto de resultados de uma consulta ao banco de dados.
Existem três constantes que, quando definidas no conjunto de resultados, podem mover o cursor no conjunto de resultados para trás, para frente e também em uma linha específica.
ResultSet.TYPE_FORWARD_ONLY - O cursor só pode avançar no conjunto de resultados.
ResultSet.TYPE_SCROLL_INSENSITIVE - O cursor pode rolar para frente e para trás, e o conjunto de resultados não é sensível às alterações feitas por outras pessoas no banco de dados que ocorrem depois que o conjunto de resultados foi criado.
ResultSet.TYPE_SCROLL_SENSITIVE - O cursor pode rolar para frente e para trás, e o conjunto de resultados é sensível às alterações feitas por outras pessoas no banco de dados que ocorrem depois que o conjunto de resultados foi criado.
A seguir estão as etapas básicas para criar um aplicativo JDBC
Importe pacotes contendo as classes JDBC necessárias para programação de banco de dados.
Registre o driver JDBC, para que possa abrir um canal de comunicação com o banco de dados.
Abra uma conexão usando o método DriverManager.getConnection ().
Execute uma consulta usando um objeto do tipo Statement.
Extraia os dados do conjunto de resultados usando o método ResultSet.getXXX () apropriado.
Limpe o ambiente fechando todos os recursos do banco de dados contando com a coleta de lixo da JVM.
Existem quatro tipos de drivers JDBC
JDBC-ODBC Bridge plus ODBC driver - também chamado de Tipo 1 chama o código nativo do driver ODBC disponível localmente.
Native-API, partly Java driver- também chamado de Tipo 2, chama a biblioteca nativa do fornecedor do banco de dados no lado do cliente. Esse código então se comunica com o banco de dados pela rede.
JDBC-Net, pure Java driver - também chamado de Type 3, o driver java puro que se comunica com o middleware do lado do servidor que se comunica com o banco de dados.
Native-protocol, pure Java driver - também chamado de Tipo 4, o driver java puro que usa o protocolo nativo do banco de dados.
A seguir está uma lista de quando os quatro tipos de drivers podem ser usados
Se você estiver acessando um tipo de banco de dados, como Oracle, Sybase ou IBM, o tipo de driver preferencial é 4.
Se seu aplicativo Java estiver acessando vários tipos de bancos de dados ao mesmo tempo, o tipo 3 é o driver preferencial.
Os drivers do tipo 2 são úteis em situações em que um driver do tipo 3 ou 4 ainda não está disponível para seu banco de dados.
O driver tipo 1 não é considerado um driver de nível de implantação e normalmente é usado apenas para fins de desenvolvimento e teste.
O driver JDBC Net Java puro (Tipo 4) é o driver mais rápido porque converte as chamadas JDBC em chamadas de protocolo específicas do fornecedor e interage diretamente com o banco de dados.
Não. Você pode abrir apenas um objeto Statement por conexão quando estiver usando a ponte JDBC-ODBC.
Os níveis de isolamento padrão são
TRANSACTION_NONE
TRANSACTION_READ_COMMITTED
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
A arquitetura JDBC separa uma abstração de sua implementação. Portanto, o JDBC segue um padrão de design de ponte. A API JDBC fornece a abstração e os drivers JDBC fornecem a implementação. Novos drivers podem ser plugados à API JDBC sem alterar o código do cliente.
Tipos de afirmações são
Statement - instrução SQL regular.
PreparedStatement - mais eficiente do que instrução devido à pré-compilação de SQL.
CallableStatement - para chamar procedimentos armazenados no banco de dados.
As declarações preparadas oferecem melhor desempenho, pois são pré-compiladas. As instruções preparadas reutilizam o mesmo plano de execução para diferentes argumentos, em vez de criar um novo plano de execução todas as vezes. As instruções preparadas usam argumentos de ligação, que são enviados ao mecanismo de banco de dados. Isso permite mapear solicitações diferentes com a mesma instrução preparada, mas argumentos diferentes para executar o mesmo plano de execução. As instruções preparadas são mais seguras porque usam variáveis de ligação, que podem impedir o ataque de injeção de SQL.
Class.forName()- Este método carrega dinamicamente o arquivo de classe do driver na memória, que o registra automaticamente. Este método é preferível porque permite que você torne o registro do driver configurável e portátil.
DriverManager.registerDriver() - Este método estático é usado caso você esteja usando uma JVM não compatível com JDK, como a fornecida pela Microsoft.
Aqui estão algumas vantagens do JDBC 4.0
Carregamento automático da classe do driver JDBC. Nas versões anteriores, tínhamos que registrar e carregar manualmente os drivers usando class.forName.
Aprimoramentos de gerenciamento de conexão. Novos métodos adicionados a javax.sql.PooledConnection.
DataSet Implementação de SQL usando anotações.
Suporte a SQL XML.
O desempenho ou rapidez do driver JDBC depende de uma série de questões Qualidade do código do driver, tamanho do código do driver, servidor de banco de dados e sua carga, Topologia de rede, Número de vezes que sua solicitação é traduzida para uma API diferente.
Conte sobre sua experiência em tempo real.
Existem 3 métodos DriverManager.getConnection () sobrecarregados para criar um objeto de conexão
getConnection (String url, String user, String password) Usando um URL de banco de dados com nome de usuário e senha. Por exemplo
String URL = "[email protected]";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
getConnection(String url)Using only a database URL. For example
String URL = "jdbcoraclethinusername/[email protected]";
Connection conn = DriverManager.getConnection(URL);
getConnection(String url, Properties prop)Using a database URL and a Properties object. For example
String URL = "[email protected]";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );
Use os métodos DatabaseMetaData supportedOpenStatementsAcrossCommit () e supportedOpenStatementsAcrossRollback () para verificar.
A especificação não faz menção a qualquer limitação de tamanho para Statement.addBatch (), isso depende do driver.
Existem vários métodos na interface ResultSet que envolvem mover o cursor, como beforeFirst (), afterLast (), first (), last (), absoluto (linha interna), relativo (linha interna), anterior (), próximo () , getRow (), moveToInsertRow (), moveToCurrentRow ().
A interface ResultSet contém métodos get para cada um dos tipos de dados possíveis, e cada método get tem duas versões
Aquele que aceita um nome de coluna.
Aquele que leva em um índice de coluna.
Por exemplo getInt (String columnName), getInt (int columnIndex)
A interface ResultSet contém uma coleção de métodos de atualização para atualizar os dados de um conjunto de resultados. Cada método de atualização tem duas versões para cada tipo de dados
Aquele que aceita um nome de coluna.
Aquele que leva em um índice de coluna.
Esses métodos alteram as colunas da linha atual no objeto ResultSet, mas não no banco de dados subjacente. Para atualizar suas alterações na linha do banco de dados, você precisa invocar um dos seguintes métodos
updateRow (), deleteRow (), refreshRow (), cancelRowUpdates (), insertRow ()
O driver JDBC converte o tipo de dados Java no tipo JDBC apropriado antes de enviá-lo ao banco de dados. Ele usa um mapeamento padrão para a maioria dos tipos de dados. Por exemplo, um Java int é convertido em SQL INTEGER.
"Nenhum driver adequado" ocorre durante uma chamada para o método DriverManager.getConnection, pode ser por qualquer um dos seguintes motivos
Devido à falha ao carregar os drivers JDBC apropriados antes de chamar o método getConnection.
Pode estar especificando um URL JDBC inválido, um que não é reconhecido pelo driver JDBC.
Este erro pode ocorrer se uma ou mais bibliotecas compartilhadas necessárias para a ponte não puderem ser carregadas.
O uso de valores NULL pelo SQL e o uso de nulos pelo Java são conceitos diferentes. Existem três táticas que você pode usar
Evite usar métodos getXXX () que retornam tipos de dados primitivos.
Use classes de wrapper para tipos de dados primitivos e use o método wasNull () do objeto ResultSet para testar se a variável de classe de wrapper que recebeu o valor retornado pelo método getXXX () deve ser definida como null.
Use tipos de dados primitivos e o método wasNull () do objeto ResultSet para testar se a variável primitiva que recebeu o valor retornado pelo método getXXX () deve ser definida como um valor aceitável que você escolheu para representar um NULL.
Quando uma conexão é criada, ela está no modo de confirmação automática. Isso significa que cada instrução SQL individual é tratada como uma transação e será confirmada automaticamente assim que for executada. Ao definir auto-commit como false, nenhuma instrução SQL será confirmada até que você chame explicitamente o método commit.
A seguir estão os motivos
Para aumentar o desempenho.
Para manter a integridade dos processos de negócios.
Para usar transações distribuídas.
Um ponto de salvamento marca um ponto para o qual a transação atual pode ser revertida. Em vez de reverter todas as suas alterações, ele pode optar por reverter apenas algumas delas. Por exemplo, suponha que você
iniciar uma transação.
insira 10 linhas em uma tabela.
definir um ponto de salvamento.
insira mais 5 linhas.
rollback para o ponto de salvamento.
confirmar a transação.
Depois de fazer isso, a tabela conterá as primeiras 10 linhas inseridas. As outras 5 linhas terão sido excluídas pelo rollback. Um ponto de salvamento é apenas um marcador para o qual a transação atual pode ser revertida.
Os objetos SQLWarning são uma subclasse de SQLException que lida com avisos de acesso ao banco de dados. Os avisos não interrompem a execução de um aplicativo, como fazem as exceções. Eles simplesmente alertam o usuário que algo não aconteceu conforme planejado. Um aviso pode ser relatado em um objeto Connection, um objeto Statement (incluindo objetos PreparedStatement e CallableStatement) ou um objeto ResultSet. Cada uma dessas classes possui um método getWarnings.
O processamento em lote permite agrupar instruções SQL relacionadas em um lote e enviá-las com uma chamada para o banco de dados.
Seqüências típicas de etapas para usar o processamento em lote com declaração ou objeto PrepareStatement são
No caso de processamento em lote usando o objeto PrepareStatement, crie instruções SQL com espaços reservados.
Crie um objeto Statement ou PrepareStatement usando os métodos createStatement () ou prepareStatement (), respectivamente.
Defina a confirmação automática como false usando setAutoCommit ().
Adicione quantas instruções SQL desejar em lote usando o método addBatch () no objeto de instrução criado.
Execute todas as instruções SQL usando o método executeBatch () no objeto de instrução criado.
Finalmente, comprometa todas as mudanças usando o método commit ().
Um procedimento armazenado é um grupo de instruções SQL que formam uma unidade lógica e executam uma tarefa específica. Por exemplo, as operações em um banco de dados de funcionários (contratar, despedir, promover, pesquisar) podem ser codificadas como procedimentos armazenados executados pelo código do aplicativo. Os procedimentos armazenados podem ser chamados usando a classe CallableStatement na API JDBC. Por exemplo, o código a seguir demonstra isso
CallableStatement cs = con.prepareCall("{call MY_SAMPLE_STORED_PROC}");
ResultSet rs = cs.executeQuery();
A sintaxe de escape oferece a flexibilidade de usar recursos específicos do banco de dados indisponíveis para você usando métodos e propriedades JDBC padrão.
O formato geral da sintaxe de escape SQL é o seguinte
{keyword 'parameters'}.
JDBC define sequências de escape que contêm a sintaxe padrão para os seguintes recursos de linguagem
Literais de data, hora e carimbo de data / hora (palavras-chave d, t, ts).
Funções escalares, como funções numéricas, de string e de conversão de tipo de dados (palavra-chave fn).
Junções externas (oj palavra-chave)
Caracteres de escape para curingas usados em cláusulas LIKE (palavra-chave de escape).
Chamadas de procedimento (chamar palavra-chave).
Uma transação é uma unidade lógica de trabalho. Para concluir uma unidade lógica de trabalho, várias ações podem ser necessárias em um banco de dados. As transações são usadas para fornecer integridade de dados, semântica correta do aplicativo e uma visão consistente dos dados durante o acesso simultâneo.
Siga as etapas abaixo
//turn off the implicit commit
Connection.setAutoCommit(false);
//..your insert/update/delete goes here
Connection.Commit();
//a new transaction is implicitly started.
Quando uma solicitação de conexão é emitida, o DriverManager pergunta a cada driver carregado se ele entende a URL enviada. Quando o URL transmitido não é construído corretamente, a mensagem "Nenhum driver adequado" é retornada.
boolean execute() - Executa qualquer tipo de instrução SQL.
ResultSet executeQuery()- Isso é geralmente usado para ler o conteúdo do banco de dados. A saída será na forma de ResultSet. Geralmente a instrução SELECT é usada.
int executeUpdate()- Isso geralmente é usado para alterar os bancos de dados. Geralmente as instruções DROP TABLE ou DATABASE, INSERT into TABLE, UPDATE TABLE, DELETE from TABLE serão usadas neste. A saída terá a forma de int, que denota o número de linhas afetadas pela consulta.
Você precisa fechar o conjunto de resultados, a instrução e a conexão. Se a conexão vier de um pool, fechá-la na verdade a envia de volta ao pool para reutilização. Podemos fazer isso no bloco finally {}, de forma que se uma exceção for lançada, você ainda terá a chance de fechá-lo.
Eles são usados para armazenar uma grande quantidade de dados em bancos de dados, como imagens, filmes, etc., que são extremamente grandes.
Cada fornecedor de banco de dados fornece implementação de ResultSet e outras interfaces, por meio do driver.
Pooling de conexão é uma técnica usada para reutilização de conexões físicas e sobrecarga reduzida para seu aplicativo. A funcionalidade de pool de conexão minimiza operações caras na criação e fechamento de sessões. O fornecedor do banco de dados ajuda vários clientes a compartilhar um conjunto em cache de objetos de conexão que fornece acesso a um banco de dados. Os clientes não precisam criar uma nova conexão toda vez para interagir com o banco de dados.
Se você usar um servidor de aplicativos como WebLogic, WebSphere, jBoss, Tomcat. , então seu servidor de aplicativos fornece os recursos para configurar o pool de conexão. Se você não estiver usando um servidor de aplicativos, componentes como o Apache Commons DBCP Component podem ser usados.
java.sql.Blob tem melhor desempenho, pois não extrai nenhum dado do banco de dados até que você peça explicitamente.
java.sql.Clob tem melhor desempenho, pois não extrai nenhum dado do banco de dados até que você peça explicitamente.
Use o método Statement.setFetchSize para indicar o tamanho de cada busca de banco de dados.
Class.forName ("MyClass")
Carrega a classe MyClass.
Execute qualquer código de bloco estático de MyClass.
Retorna uma instância de MyClass.
Não, não importa. Uma instrução de importação informa ao compilador qual classe procurar. Class.forName () instrui o Classclass a encontrar um carregador de classes e carregar esse objeto de classe particular na memória usada pela JVM.
A simultaneidade ResultSet determina se o ResultSet pode ser atualizado ou apenas lido. Um ResultSet pode ter um de dois níveis de simultaneidade
ResultSet.CONCUR_READ_ONLY - significa que o ResultSet só pode ser lido.
ResultSet.CONCUR_UPDATABLE - significa que o ResultSet pode ser lido e atualizado.
A diferença entre setFetchSize (int) e setMaxRow (int) são
setFetchSize (int) define o número de linhas que serão lidas do banco de dados quando o ResultSet precisar de mais linhas. setFetchSize (int) afeta como o banco de dados retorna os dados ResultSet.
O método setMaxRows (int) do ResultSet especifica quantas linhas um ResultSet pode conter por vez. setMaxRows (int) afeta o objeto JDBC do lado do cliente.
Um objeto JDBC RowSet contém dados tabulares de uma forma que os torna mais flexíveis e fáceis de usar do que um conjunto de resultados. Os objetos RowSet são componentes JavaBeans.
Existem dois tipos de RowSet
ConnectedUm objeto RowSet conectado é de natureza permanente. Ele não termina até que o aplicativo seja encerrado.
DisconnectedUm objeto RowSet desconectado é ad-hoc por natureza. Sempre que requer a recuperação de dados do banco de dados, ele estabelece a conexão e a fecha ao finalizar a tarefa solicitada. Os dados modificados durante o estado desconectado são atualizados depois que a conexão é restabelecida.
Em transações típicas de banco de dados, digamos que uma transação leia e altere o valor, enquanto a segunda transação lê o valor antes de confirmar ou reverter pela primeira transação. Este processo de leitura é denominado 'leitura suja'. Porque sempre há uma chance de que a primeira transação possa reverter a alteração que faz com que a segunda transação leia um valor inválido.
TRANSACTION_READ_COMMITTED evita leituras sujas.
A API JDBC tem duas interfaces de metadados DatabaseMetaData & ResultSetMetaData. Os metadados fornecem informações abrangentes sobre o banco de dados como um todo. A implementação dessas interfaces é implementada por fornecedores de drivers de banco de dados para permitir que os usuários conheçam os recursos de um banco de dados.
Siga os passos abaixo
Primeiro configure a nova fonte de dados ODBC. Vá para Ferramentas Administrativas -> Fontes de Dados (ODBC) -> Guia DSN do Sistema -> Adicionar -> Driver do Microsoft Excel (*. Xls) -> Concluir. Agora forneça o nome da fonte de dados (SampleExcel) e a descrição. Em seguida, clique em Selecionar pasta de trabalho e aponte para sua planilha do Excel.
No código, faça as seguintes adições de código
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbcodbcSampleExcel","","");
stmt = conn.createStatement();
sql = "select * from [Sheet1$]";
rs=stmt.executeQuery(sql);
Onde Plan1 é o nome da planilha do excel.
O Hibernate é uma ferramenta de Mapeamento Objeto-Relacional. Ele mapeia objetos para dados relacionais.
O Java Naming and Directory Interface (JNDI) é uma API para acessar diferentes serviços de nomenclatura e diretório. Use-o para acessar algo armazenado em um diretório ou serviço de nomenclatura sem precisar codificar especificamente para esse serviço de nomenclatura ou diretório.
A API Java DataBase Connectivity (JDBC) é uma API para acessar diferentes bancos de dados relacionais. Você o usa para acessar bancos de dados relacionais sem incorporar uma dependência de um tipo de banco de dados específico em seu código.