1. Primero explique qué es JDBC
Antes de ver este sustantivo a primera vista, sentí que era necesario saber cuál era su nombre en inglés completo. Conectividad de la base de datos Java, que se traduce literalmente a una base de datos Java conectable. Para decirlo sin rodeos, quiero proporcionar un conjunto de enlaces intermedios para conectar el código Java y la base de datos para que pueda controlar la base de datos directamente operando el código Java.
2. La esencia de JDBC
Es una solución Java para acceder a las bases de datos. Espera acceder a diferentes bases de datos de la misma manera para lograr una interfaz de operación Java que no esté relacionada con la base de datos específica.
JDBC es esencialmente un conjunto de interfaces estandarizadas. Diferentes fabricantes de bases de datos implementan esta interfaz de acuerdo con las características de sus propias bases de datos, y no necesitamos preocuparnos por los métodos específicos de implementación.
Las principales interfaces implementadas por los fabricantes de bases de datos en JDBC son las siguientes:
DRIVERMANAGER: Gestión del conductor
Conexión,
DataBASEMETADATA: conéctese a la interfaz
Declaración,
Estatación preparada
CallableStatement: interfaz de objeto de declaración de instrucción
Resultado de resultados,
ResultSetMetadata: Interfaz de resultados de resultados
3. Cómo funciona JDBC
El programador llama a la pieza implementada por el fabricante de la base de datos subyacente.
Es decir: 1) Implemente el primer paso de conexión a través de la interfaz de conexión
2) Transfiera las declaraciones SQL a través de los resultados de la declaración
3) El principal proceso de guardar los resultados de retorno de la base de datos a la interfaz de conjunto de resultados de resultados se puede resumir como:
1) Cargue el controlador y cree la conexión
2) Crear un objeto de declaración
3) Ejecutar declaraciones SQL
4) Enviar el conjunto de resultados
5) Cierre la conexión
A continuación, tomaré la base de datos Oracle que aprendí y cooperaré con los eclips como ejemplo para explicar cómo implementar JDBC
1) Carga del controlador
El método utilizado es: class.forname ("controlador");
Lo que sé sobre cómo obtener este controlador es: expandir el paquete JDBC JAR, si uso ojdbc6.jar, busca oracle.jdbc.driver, busca oracledriver, luego hace clic con el botón derecho en la calidad de la calidad y lo pego en citas, como: class.forname ("oracle.jdbc.driver.oracledriver");
2) Crear una conexión
El método utilizado es: Conn = Drivermanager.getConnection ("JDBC: Oracle: Thin: @IP Dirección: 1521: ORCL", "Cuenta de la base de datos", "Contraseña de base de datos");
Por ejemplo: Conn = Drivermanager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601");
3) Crear un objeto de declaración
El método utilizado es: instrucción stmt = conn.createStatement ();
Cabe señalar que la conexión creada en el segundo paso se usa para llamar al método
Llame al método ExecuteUpdate y pase la instrucción SQL para ejecutar la instrucción SQL escrita. Cabe señalar aquí que los tipos de SQL que puede ejecutar el método EjecutarUpdate son insertar, actualizar, eliminar
Por ejemplo: Declaración stmt = conn.createStatement ();
Cadena sql = "insertar en emp_jiawenzhe (empno, ename, sal, deptno) valores (1000, 'jia wenzhe', 1500,10)";
int i = stmt.executeupdate (sql);
El valor de retorno I aquí es el número de filas afectadas. Podemos juzgar si la operación es exitosa en función del número de filas afectadas.
4) El conjunto de resultados devuelto se refiere principalmente a la operación de selección (no se menciona aquí)
5) Finalmente cierre la conexión
Por ejemplo: conn.close ();
Enumere un código completo, incluidos los comentarios:
paquete jdbc_day01; import java.sql.*;/*** Demuestre los pasos de operación de JDBC* 1. Cargue el controlador* 2. Cree la conexión* 3. Cree el objeto de la declaración* 4. Enviar la declaración SQL* 5. Si el envío de una declaración de selección, procesa el conjunto de resultados* 6. Cierre la conexión* @Author Jiawenzhe**/public class JDBCDOME1 Main (String [] args) lanza SQLException {// Requisitos: Crear un empleado, número de empleado, nombre del empleado, salario, número de departamento // 1, conexión conn = null; intente {class.forname ("oracle.jdbc.driver.oracledriver"); System.out.println ("Carga del controlador correctamente"); // 2. Conn = Drivermanager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601"); System.out.println (conn.getClass (). GetName ()); // 3. // Objeto de declaración de estado de estado. Enviar y ejecutar la instrucción SQL/ * * int outockupdate (string sql); * Enviar inserción, actualizar, eliminar la instrucción* El valor de retorno int representa el número de filas que afectan la tabla de la base de datos*/ instrucción stmt = conn.createStatement (); String sql = "insertar en emp_jiawenzhe (empno, ename, sal, deptno)" + "valores (1000, 'wang xiaoer', 1500,10)"; int i = stmt.executeupdate (sql); if (i> 0) {System.out.println ("¡Guarde con éxito!"); }} Catch (ClassNotFoundException e) {E.PrintStackTrace (); // 1. Registre el registro // 2. Notifique a la persona que llama que arroje nueva runtimeException ("Error del controlador de carga", e); } Finalmente {// cierre la conexión if (conn! = null) {try {conn.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }}}}}}} Nota: El paquete JAR que se puede usar en la base de datos Oracle: OJDBC14.JAR/OJDBC6.JAR (Oracle12c usa esto)
El paquete JAR que puede ser utilizado por la base de datos MySQL: MySQL-Connector-Java-5.0.4-Bin.Jar
Carga de la clase del controlador:
Class.forname ("com.mysql.jdbc.driver"); 1. Introducción del método de embalaje
Lo que más me conmovió es que cuando escribo una determinada serie de códigos, si hay una reutilización de código, definitivamente elegiré un método para encapsular el código hasta cierto punto, desde encapsular un método hasta encapsular una clase. El uso mencionado anteriormente de JDBC para operaciones de base de datos (adición, eliminación y modificación, porque la consulta implica el funcionamiento del conjunto de resultados y se declara por separado) se divide en cuatro procesos:
1) Carga del controlador
2) Crear una conexión
3) Crear objeto de declaración y enviar SQL
4) Cierre la conexión
En otras palabras, cuando realizamos cualquier operación de base de datos, tenemos que realizar los pasos anteriores, lo que conduce a la redundancia del código. Por lo tanto, propusimos encapsular estos pasos comunes en una clase para que pueda convertirse en una clase de herramientas para mi uso.
2. Tres versiones de encapsulación
Versión 1
Cuando estaba aprendiendo, gradualmente encapsulé estas clases de manera gradual y las mejoré gradualmente, porque si la versión final de la encapsulación se propone directamente, es difícil para principiantes aceptar. Explicaré el primero, es decir, el método más simple de encapsulación:
Anteriormente descubrirá que no importa cómo desee operar la base de datos, cargar el controlador es esencial, y el controlador de carga incluye principalmente declaraciones, nombre del controlador, dirección IP, número de puerto, nombre de la cuenta de la base de datos, contraseña, etc., y la esencia de estas cadenas, por lo que defino estas cadenas por separado, como se muestra a continuación::
String static static privado controlador = "oracle.jdbc.driver.oracledriver"; Cadena estática privada url = "jdbc: oracle: delgada: losthost: 1521: orcl"; String static privado user = "Sistema"; Password de cadena estática privada = "123";
De esta manera, al crear la conexión, puedo obtener directamente el nombre de la variable para reemplazar la cadena larga. Al cargar el controlador, el método class.forname se declara en un bloque estático porque mientras carga los datos, el controlador está cargado.
Como se muestra a continuación:
static {try {class.forname (DriverClass); } catch (ClassNotFoundException e) {E.PrintStackTrace (); tirar nueva runtimeException ("Error de controlador de carga", e); }}Para crear una conexión, llamamos al método GetConnection de Drivermanager y ponemos el nombre de usuario y la contraseña correspondientes en él. Pusimos este método directamente en el método que definí, y luego llamamos directamente a mi método para crear la conexión. Cabe señalar que el valor de retorno del método es el objeto de conexión, que es fácil de entender, porque queremos obtener este objeto de tipo de conexión, como se muestra a continuación:
Public Static Connection getConnection () lanza SQLException {Connection Conn = Drivermanager.getConnection (url, usuario, contraseña); devolver Conn; }Luego cree un objeto de declaración y envíe SQL. Por supuesto, SQL es el único lugar especial aquí, porque lo que SQL necesita hacer es muy diferente, por lo que este paso no necesita ser encapsulado.
Finalmente, cierre la conexión, que se llama método Close (), como se muestra a continuación
public static void Close (Connection Conn) {if (Conn! = Null) {try {conn.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); tirar nueva runtimeException ("error de conexión de cierre", e); }}}}La primera versión general del paquete es la siguiente:
paquete jbbc_day01; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception;/** * Se utiliza para administrar conexiones * @author jiawenzhe * */public Cadena estática privada url = "jdbc: oracle: delgada: losthost: 1521: orcl"; String static privado user = "Sistema"; Password de cadena estática privada = "123"; // 1. Cargando el controlador estático {try {class.forname (DriverClass); } catch (ClassNotFoundException e) {E.PrintStackTrace (); tirar nueva RuntimeException ("Error de carga del controlador", E); }}} // 2. Cree una conexión/** Cómo definir un método que pueda crear una conexión* Tipo de valor de retorno: Si hay un resultado de operación, si existe, el tipo de resultado es la lista de parámetros de valor de valor de retorno*:* Si hay datos inciertos en la función del método participa en la operación, si existe, es un parámetro*/ público de conexión estática getConnection () lanza SqlExceptualception {Connection Conn. devolver Conn; } // 3. Cierre la conexión public static void Close (Connection Conn) {if (conn! = Null) {try {conn.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); tirar nueva runtimeException ("error de conexión de cierre", e); }}}}}Simplemente encapsule de esta manera y luego llame a la clase de encapsulación directamente al realizar operaciones SQL. Todo lo que necesita escribir es crear su objeto de declaración y enviar su declaración SQL
Versión 2
De hecho, la versión 2 es muy similar a la versión 1, para compensar una de las deficiencias de la versión 1, es decir, cuando cambia la base de datos, las contraseñas de la cuenta de diferentes bases de datos son diferentes, por lo que debe modificar la contraseña de la cuenta y la dirección IP. Anteriormente los he encapsulado en la clase de herramientas en forma de una cadena, lo que significa que debemos modificar la clase de herramientas cada vez que cambiamos la base de datos, lo cual es muy inapropiado. Por lo tanto, propusimos un método de mejora para poner estos datos de conexión en un archivo de configuración, y la clase de herramientas lee este archivo de configuración. Podemos modificar directamente el archivo de configuración al modificarlo.
Antes de introducir esta versión, introduje una nueva clase, Propiedades, que es un archivo que puede leer y leer el contenido del archivo de configuración en forma de transmisión y luego devolverla a la clase de herramientas.
Primero, daré un ejemplo del archivo de configuración. De hecho, no es necesario explicarlo. Está claro de un vistazo, como se muestra a continuación:
jdbc.driverclass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc: oracle: delgado: localhost: orcljdbc.user = systemjdbc.password = 123
El frente es la clave, la siguiente es el valor, y el valor de clave anterior está definido por nosotros mismos, al igual que definir el nombre de la variable, el valor posterior es la situación real de nuestra base de datos. Lo que debemos prestar especial atención aquí es que el nombre del sufijo de este archivo de configuración debe terminar con .properties, porque de esta manera, la clase de propiedades se puede leer.
Los ejemplos de esta sección son los siguientes:
static {try {// Cargue las propiedades de datos del archivo de propiedades pop = new Properties (); Pop.Load (dButil2.class.getClassLoader (). GetResourceasstream ("db.properties")); url = pop.getProperty ("jdbc.url"); DriverClass = pop.getProperty ("jdbc.driverclass"); user = pop.getProperty ("jdbc.user"); contraseña = pop.getProperty ("jdbc.password"); Class.forname (DriverClass); } catch (ClassNotFoundException e) {E.PrintStackTrace (); tirar nueva runtimeException ("Error de controlador de carga", e); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); }}El método de carga () es leerlo o se puede considerar que está cargando el archivo de configuración. Solo recuerda toda esta oración sin profundizar en su significado. GetProperty () obtiene el valor correspondiente a través de la clave, que es muy similar a la forma de obtener un valor para el conjunto de pares de valor clave.
El código general es el siguiente:
paquete jbbc_day01; import java.io.fileInputStream; import java.io.ioException; import java.io.inputStream; import java.sql.connection; import java.sql.DrivermanAger; import java.sql.sqlexception; import java.util.properties;/*** ... soluciona las conexiones de los datos* solucionados para administrar a los datos* solucionados. Guardado en el archivo de propiedades * @author jiawenzhe * */public class dButil2 {private static string controlador de controladores; URL de cadena estática privada; Usuario privado de cadena estática; contraseña de cadena estática privada; // 1. Cargar controlador static {try {// Cargue las propiedades de datos del archivo de propiedades pop = new Properties (); Pop.Load (dButil2.class.getClassLoader (). GetResourceasstream ("db.properties")); url = pop.getProperty ("jdbc.url"); DriverClass = pop.getProperty ("jdbc.driverclass"); user = pop.getProperty ("jdbc.user"); contraseña = pop.getProperty ("jdbc.password"); Class.forname (DriverClass); } catch (ClassNotFoundException e) {E.PrintStackTrace (); tirar nueva runtimeException ("Error de controlador de carga", e); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); }} // 2. Cree una conexión/** Cómo definir un método que pueda crear una conexión* Tipo de valor de retorno: Si hay un resultado de operación, si existe, el tipo de resultado es la lista de parámetros de valor de valor de retorno*:* Si hay datos inciertos en la función del método participa en la operación, si existe, es un parámetro*/ público de conexión estática getConnection () lanza SqlExceptualception {Connection Conn. devolver Conn; } // 3. Cierre la conexión public static void Close (Connection Conn) {if (conn! = Null) {try {conn.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); tirar nueva runtimeException ("error de conexión de cierre", e); }}}}}