1. Primeiro explique o que é JDBC
Antes de ver esse substantivo à primeira vista, senti que era necessário saber qual era seu nome completo em inglês. Conectividade do banco de dados Java, que é literalmente traduzida em um banco de dados Java conectável. Para ser franco, quero fornecer um conjunto de links intermediários para conectar o código e o banco de dados Java para que ele possa controlar o banco de dados diretamente operando o código Java.
2. A essência do JDBC
É uma solução Java para acessar bancos de dados. Ele espera acessar diferentes bancos de dados da mesma maneira para obter uma interface de operação Java que não está relacionada ao banco de dados específico.
O JDBC é essencialmente um conjunto de interfaces padronizadas. Diferentes fabricantes de banco de dados implementam essa interface de acordo com suas próprias características de banco de dados, e não precisamos nos preocupar com os métodos específicos de implementação.
As principais interfaces implementadas pelos fabricantes de banco de dados no JDBC são as seguintes:
DriverManager: Gerenciamento do Driver
Conexão,
DatabaseMetadata: conecte -se à interface
Declaração,
Preparado
CallableStatement: Declaração Interface Object
ResultSet,
ResultSetMetAdata: interface ResultSet
3. Como o JDBC funciona
O programador chama a peça implementada pelo fabricante do banco de dados subjacente.
Ou seja: 1) Implementar a primeira etapa da conexão através da interface de conexão
2) Transfira as declarações SQL através dos resultados da instrução
3) O principal processo de salvar os resultados do retorno do banco de dados no conjunto de resultados do resultado da interface pode ser resumido como:
1) Carregue o motorista e crie a conexão
2) Crie um objeto de declaração
3) Executar declarações SQL
4) Envie de volta o conjunto de resultados
5) Feche a conexão
Abaixo, vou pegar o banco de dados Oracle que aprendi e coopero com o Eclips como exemplo para explicar como implementar o JDBC
1) Carregando o motorista
O método usado é: Class.ForName ("Driver");
O que eu sei sobre como obter esse driver é: Expanda o pacote JDBC JAR, se eu usar ojdbc6.jar, encontrar oracle.jdbc.driver, encontrar oracledriver, clique com o botão direito do mouse no qualidade e cola e cola as citações, como: class.forname ("oracle.jdbc.driver.oracledriver");
2) Crie uma conexão
O método usado é: Conn = DriverManager.getConnection ("JDBC: Oracle: Thin: @IP Endereço: 1521: ORCL", "Conta do banco de dados", "Senha do banco de dados");
Por exemplo: Conn = DriverManager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601");
3) Crie um objeto de declaração
O método usado é: instrução stmt = conn.createstatement ();
Deve -se notar que a conexão criada no segundo passo é usada para chamar o método
Ligue para o método ExecuteUpdate e passe a instrução SQL para executar a instrução SQL escrita. Deve -se notar aqui que os tipos de SQL que o método executeUpdate pode executar são inseridos, atualizados, excluir
Por exemplo: instrução stmt = conn.createstatement ();
String sql = "Inserir nos valores EMP_JIAWENZHE (EMPNO, ENAME, SAL, DEPTNO) (1000, 'Jia Wenzhe', 1500,10)";
int i = stmt.executeUpdate (SQL);
O valor de retorno I aqui é o número de linhas afetadas. Podemos julgar se a operação é bem -sucedida com base no número de linhas afetadas.
4) O conjunto de resultados retornados se refere principalmente à operação de seleção (não mencionada aqui)
5) Finalmente feche a conexão
Por exemplo: Conn.Close ();
Liste um código inteiro, incluindo comentários:
pacote jdbc_day01; importar java.sql.*;/*** demonstrar as etapas de operação de jdbc* 1. Carregue o driver* 2. Crie a conexão* 3. Main (String [] args) lança SqLexception {// Requisitos: Crie um funcionário, número do funcionário, nome do funcionário, salário, número do departamento // 1, conexão conn = null; tente {Class.ForName ("oracle.jdbc.driver.oracledriver"); System.out.println ("Carregando do driver com sucesso"); // 2. Conn = DriverManager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601"); System.out.println (Conn.getClass (). GetName ()); // 3. // objeto de declaração de declaração. Enviar e executar a instrução SQL/ * * int exautupdate (string sql); * Enviar inserção, atualizar, excluir instrução* Valor de retorno int representa o número de linhas que afetam a tabela do banco de dados*/ instrução stmt = conn.createstatement (); String sql = "inserir em emp_jiawenzhe (empno, ename, sal, deptno)" + "valores (1000, 'wang xiaoer', 1500,10)"; int i = stmt.executeUpdate (SQL); if (i> 0) {System.out.println ("Salve com sucesso!"); }} catch (classNotFoundException e) {e.printStackTrace (); // 1. Registre o log // 2. Notifique o chamador para lançar a nova RuntimeException ("Carregar erro do driver", e); } finalmente {// feche a conexão se (conn! = null) {try {Conn.Close (); } catch (sqLexception e) {e.printStackTrace (); }}}}}}} Nota: O pacote JAR que pode ser usado no banco de dados Oracle: OJDBC14.JAR/OJDBC6.JAR (Oracle12C usa isso)
O pacote JAR que pode ser usado pelo banco de dados MySQL: MySQL-Connector-Java-5.0.4-bin.jar
Carregando aula de driver:
Class.ForName ("com.mysql.jdbc.driver"); 1. Introdução do método de embalagem
O que mais me tocou é que, quando estou escrevendo uma determinada série de códigos, se houver reutilização de código, definitivamente escolherei um método para encapsular o código até certo ponto, de encapsular um método para encapsular uma classe. O uso anteriormente mencionado do JDBC para operações de banco de dados (adição, exclusão e modificação, porque a consulta envolve a operação do conjunto de resultados e declarada separadamente) é dividida em quatro processos:
1) Carregando o motorista
2) Crie uma conexão
3) Crie objeto de declaração e envie SQL
4) Feche a conexão
Em outras palavras, quando realizamos qualquer operação de banco de dados, precisamos executar as etapas acima, o que leva à redundância do código. Por isso, propusemos encapsular essas etapas comuns em uma classe para que ela possa se tornar uma classe de ferramentas para meu uso.
2. Três versões de encapsulamento
Versão 1
Quando eu estava aprendendo, gradualmente encapsulei essas classes de maneira gradual e as melhorei gradualmente, porque se a versão final do encapsulamento for proposta diretamente, é difícil para iniciantes aceitarem. Vou explicar o primeiro, ou seja, o método mais simples de encapsulamento:
Você descobrirá anteriormente que, não importa como deseja operar o banco de dados, o carregamento do driver é essencial e o driver de carregamento inclui principalmente declarações, nome do driver, endereço IP, número da porta, nome da conta do banco de dados, senha etc. e a essência dessas seqüências, por isso defino essas seqüências separadamente, como mostrado abaixo:
String estática privada driverclass = "oracle.jdbc.driver.oracledriver"; String estática privada URL = "JDBC: Oracle: Thin: LOSTHOST: 1521: ORCL"; String estática privada User = "System"; senha estática privada senha = "123";
Dessa forma, ao criar a conexão, posso obter diretamente o nome da variável para substituir a string longa. Ao carregar o driver, a classe do método.FORNAME é declarada em um bloco estático porque, ao carregar os dados, o driver é carregado.
Como mostrado abaixo:
estático {try {class.ForName (DriverClass); } catch (classNotFoundException e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Carregar erro do driver", e); }}Para criar uma conexão, chamamos o método GetConnection do DriverManager e colocamos o nome de usuário e a senha correspondentes nele. Colocamos esse método diretamente no método que defini e depois chamamos meu método diretamente para criar a conexão. Deve -se notar que o valor de retorno do método é o objeto de conexão, que é fácil de entender, porque queremos obter esse objeto de tipo de conexão, como mostrado abaixo:
Public Static Connection getConnection () lança sqLexception {conexão conn = driverManager.getConnection (URL, usuário, senha); retornar Conn; }Em seguida, crie um objeto de declaração e envie SQL. Obviamente, o SQL é o único lugar especial aqui, porque o que o SQL precisa fazer é muito diferente, portanto, esta etapa não precisa ser encapsulada.
Finalmente, feche a conexão, que é chamada de Método Close (), como mostrado abaixo
public static void Close (conexão conn) {if (conn! = null) {try {Conn.Close (); } catch (sqLexception e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Erro de conexão fechada", e); }}}}A primeira versão geral do pacote é a seguinte:
pacote jbbc_day01; importar java.sql.connection; importar java.sql.driverManager; importar java.sql.sqLexception;/** * usado para gerenciar conexões * @author "orlewor.jr; String estática privada URL = "JDBC: Oracle: Thin: LOSTHOST: 1521: ORCL"; String estática privada User = "System"; senha estática privada senha = "123"; // 1. Carregando driver static {try {class.ForName (driverclass); } catch (classNotFoundException e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("carregando erro do driver", e); }}} // 2. Crie uma conexão/** Como definir um método que pode criar uma conexão* Valor de retorno Tipo: se existe um resultado de operação, se houver, o tipo do resultado é o tipo de retorno Tipo* Lista de parâmetros:* Se há dados incertos na função do método Participa da operação, se houver, é um parâmetro*/ conexão pública estática getConnection () Throws Sqxception {conexão com a conexão* Public Connection retornar Conn; } // 3. Feche a conexão public static void Close (conexão conn) {if (conn! = Null) {try {Conn.Close (); } catch (sqLexception e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Erro de conexão fechada", e); }}}}}Basta encapsular dessa maneira e depois chamar a classe de encapsulamento diretamente ao executar operações SQL. Tudo que você precisa escrever é criar seu objeto de declaração e enviar sua declaração SQL
Versão 2
De fato, a versão 2 é muito semelhante à versão 1, para compensar uma das deficiências da versão 1, ou seja, quando você altera o banco de dados, as senhas da conta de diferentes bancos de dados são diferentes; portanto, você precisa modificar a senha da conta e o endereço IP. Eu já os encapsulei na classe de ferramentas na forma de uma string, o que significa que devemos modificar a classe de ferramentas sempre que alteramos o banco de dados, o que é muito inapropriado. Por isso, propusemos um método de melhoria para colocar esses dados de conexão em um arquivo de configuração e a classe de ferramentas lê esse arquivo de configuração. Podemos modificar diretamente o arquivo de configuração ao modificá -lo.
Antes de introduzir esta versão, introduzi uma nova classe, Properties, que é um arquivo que pode ler e ler o conteúdo do arquivo de configuração na forma de um fluxo e depois retorná -lo à classe de ferramentas.
Primeiro, darei um exemplo do arquivo de configuração. De fato, não precisa ser explicado. Está claro de relance, como mostrado abaixo:
jdbc.driverclass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc: oracle: thin: localhost: orcljdbc.user = systemjdbc.password = 123
A frente é a chave, o seguinte é o valor e o valor da chave anterior é definido por nós mesmos, assim como definir o nome da variável, o valor subsequente é a situação real do nosso banco de dados. O que precisamos prestar atenção especial aqui é que o nome do sufixo desse arquivo de configuração deve terminar com .Properties, porque, dessa maneira, a classe Properties pode ser lida.
Exemplos desta seção são os seguintes:
estático {try {// Carregar propriedades de dados do arquivo de propriedade pop = new Properties (); pop.load (dbutil2.class.getclassloader (). getResourceasStream ("db.properties")); url = pop.getProperty ("jdbc.url"); driverclass = pop.getProperty ("jdbc.driverclass"); usuário = pop.getProperty ("jdbc.user"); senha = pop.getProperty ("jdbc.password"); Class.ForName (DriverClass); } catch (classNotFoundException e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Carregar erro do driver", e); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); }}O método de carga () é lê -lo ou pode ser considerado carregando o arquivo de configuração. Lembre -se de toda essa frase sem se aprofundar em seu significado. GetProperty () obtém o valor correspondente através da chave, que é muito semelhante à forma de obter um valor para o conjunto de pares de valor-chave.
O código geral é o seguinte:
pacote jbbc_day01; importar java.io.fileInputStream; importar java.io.ioException; importar java.io.inputStream; importar java.sql.Connection; import java.sql.driverManager; import java.sql.SqLexception; importa para java.ut.ut.utanager; importar; Salvo no arquivo de propriedades * @author jiawenzhe * */public class dbutil2 {private static string driverclass; URL de corda estática privada; Usuário de String estática privada; senha privada de string estática; // 1. Carregar driver estático {try {// Carregar propriedades de dados do arquivo de propriedade pop = new Properties (); pop.load (dbutil2.class.getclassloader (). getResourceasStream ("db.properties")); url = pop.getProperty ("jdbc.url"); driverclass = pop.getProperty ("jdbc.driverclass"); usuário = pop.getProperty ("jdbc.user"); senha = pop.getProperty ("jdbc.password"); Class.ForName (DriverClass); } catch (classNotFoundException e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Carregar erro do driver", e); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); }} // 2. Crie uma conexão/** Como definir um método que pode criar uma conexão* Valor de retorno Tipo: se existe um resultado de operação, se houver, o tipo do resultado é o tipo de retorno Tipo* Lista de parâmetros:* Se há dados incertos na função do método Participa da operação, se houver, é um parâmetro*/ conexão pública estática getConnection () Throws sqxception {conexão com a conexão* Public Connection getConnection () () SqLexception {conexão com a conexão* retornar Conn; } // 3. Feche a conexão public static void Close (conexão conn) {if (conn! = Null) {try {Conn.Close (); } catch (sqLexception e) {e.printStackTrace (); lançar a nova RuntimeTimeException ("Erro de conexão fechada", e); }}}}}