stringtranslate.com

Conectividad de base de datos Java

Java Database Connectivity ( JDBC ) es una interfaz de programación de aplicaciones (API) para el lenguaje de programación Java que define cómo un cliente puede acceder a una base de datos . Es una tecnología de acceso a datos basada en Java que se utiliza para la conectividad de bases de datos Java. Forma parte de la plataforma Java Standard Edition , de Oracle Corporation . Proporciona métodos para consultar y actualizar datos en una base de datos y está orientada a bases de datos relacionales . Un puente JDBC a ODBC permite conexiones a cualquier fuente de datos accesible mediante ODBC en el entorno de host de la máquina virtual Java (JVM).

Historia e implementación

Sun Microsystems lanzó JDBC como parte de Java Development Kit (JDK) 1.1 el 19 de febrero de 1997. [1] Desde entonces ha sido parte de la Plataforma Java, Edición Estándar (Java SE).

Las clases JDBC están contenidas en el paquete Java java.sql y javax.sql.

A partir de la versión 3.1, JDBC se ha desarrollado bajo el proceso de la comunidad Java . JSR 54 especifica JDBC 3.0 (incluido en J2SE 1.4), JSR 114 especifica las adiciones de JDBC Rowset y JSR 221 es la especificación de JDBC 4.0 (incluido en Java SE 6). [2]

JDBC 4.1, está especificado por una versión de mantenimiento 1 de JSR 221 [3] y está incluido en Java SE 7. [4]

JDBC 4.2, está especificado por una versión de mantenimiento 2 de JSR 221 [5] y está incluido en Java SE 8. [6]

La última versión, JDBC 4.3, está especificada por una versión de mantenimiento 3 de JSR 221 [7] y está incluida en Java SE 9. [8]

Funcionalidad

Dado que JDBC ('Java Database Connectivity') es principalmente una colección de definiciones y especificaciones de interfaz, permite que existan múltiples implementaciones de estas interfaces y que la misma aplicación las utilice en tiempo de ejecución. La API proporciona un mecanismo para cargar dinámicamente los paquetes Java correctos y registrarlos con el Administrador de controladores JDBC ( DriverManager). DriverManagerse utiliza como una Connection fábrica para crear conexiones JDBC.

Las conexiones JDBC admiten la creación y ejecución de sentencias. Las conexiones JDBC admiten sentencias de actualización como CREATE , INSERT , UPDATE y DELETE de SQL , o sentencias de consulta como SELECT . Además, se pueden invocar procedimientos almacenados a través de una conexión JDBC. JDBC representa sentencias utilizando una de las siguientes clases:

PreparedStatementpermite que la consulta dinámica varíe dependiendo del parámetro de consulta. [11]

Las instrucciones de actualización como INSERT, UPDATE y DELETE devuelven un recuento de actualizaciones que indica la cantidad de filas afectadas en la base de datos como un entero. [13] Estas instrucciones no devuelven ninguna otra información.

Las instrucciones de consulta devuelven un conjunto de resultados de filas JDBC. El conjunto de resultados de filas se utiliza para recorrer el conjunto de resultados . Las columnas individuales de una fila se recuperan por nombre o por número de columna. Puede haber cualquier cantidad de filas en el conjunto de resultados. El conjunto de resultados de filas tiene metadatos que describen los nombres de las columnas y sus tipos.

Hay una extensión de la API JDBC básica en javax.sql.

Las conexiones JDBC a menudo se gestionan a través de un grupo de conexiones en lugar de obtenerse directamente del controlador. [14]

Ejemplos

Cuando una aplicación Java necesita una conexión a una base de datos, DriverManager.getConnection()se utiliza uno de los métodos para crear un JDBC Connection. La URL utilizada depende de la base de datos en particular y del controlador JDBC. Siempre comenzará con el protocolo "jdbc:", pero el resto depende del proveedor en particular.

Conexión conn = DriverManager.getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , " myLogin" , "myPassword" ); try { / * utilizas la conexión aquí */ } finally { //Es importante cerrar la conexión cuando hayas terminado con ella try { conn.close ( ); } catch ( Throwable e ) { /* Propagar la excepción original en lugar de esta  que quieres que se registre */ logger.warn ( " No se pudo cerrar la conexión JDBC" , e ) ; } }                         

A partir de Java SE 7, puede utilizar la declaración try-with-resources de Java para simplificar el código anterior:

try ( Connection conn = DriverManager . getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { /* utilizas la conexión aquí */ } // la VM se encargará de cerrar la conexión          

Una vez establecida una conexión, Statementse puede crear una.

try ( Statement stmt = conn . createStatement ()) { stmt . acquireUpdate ( "INSERT INTO MyTable(name) VALUES ('mi nombre')" ); }      

Tenga en cuenta que Connections, Statements y ResultSets a menudo ocupan recursos del sistema operativo , como sockets o descriptores de archivos . En el caso de Connections a servidores de bases de datos remotos, se ocupan más recursos en el servidor, por ejemplo, cursores para s abiertos actualmente ResultSet. Es vital para close()cualquier objeto JDBC tan pronto como haya cumplido su parte; no se debe confiar en la recolección de basura . La construcción try-with-resources anterior es un patrón de código que evita esto.

Los datos se recuperan de la base de datos mediante un mecanismo de consulta de base de datos. El siguiente ejemplo muestra la creación de una declaración y la ejecución de una consulta.

try ( Instruction stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery ( " SELECT * FROM MyTable" ) ) { while ( rs.next ( ) ) { int numColumns = rs.getMetaData (). getColumnCount (); for(int i = 1 ; i < = numColumns ; i ++ ) { // Los números de columna comienzan en 1. // Además , hay muchos métodos en el conjunto de resultados para devolver // la columna como un tipo particular . Consulte la documentación de Sun // para obtener la lista de conversiones válidas. System.out.println ( "COLUMN " + i + " = " + rs.getObject ( i )) ; } } }                                        

El siguiente código es un ejemplo de una PreparedStatementconsulta que utiliza connuna clase del primer ejemplo:

try ( PreparedStatement ps = conn . prepareStatement ( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // En la declaración SQL que se está preparando, cada signo de interrogación es un marcador de posición // que debe reemplazarse con un valor que usted proporcione a través de una invocación del método "set". // Las siguientes dos llamadas al método reemplazan los dos marcadores de posición; el primero se reemplaza por un valor de cadena y el segundo por un valor entero. ps . setString ( 1 , "Pobre Yorick" ); ps . setInt ( 2 , 8008 );              // El ResultSet, rs, transmite el resultado de ejecutar la sentencia SQL. // Cada vez que llama a rs.next(), un puntero de fila interno, o cursor, // avanza a la siguiente fila del resultado. El cursor se coloca inicialmente // antes de la primera fila. try ( ResultSet rs = ps.executeQuery ()) { while ( rs.next ()) { int numColumns = rs.getMetaData (). getColumnCount ( ) ; for ( int i = 1 ; i <= numColumns ; i ++ ) { // Los números de columna comienzan en 1. // Además, hay muchos métodos en el conjunto de resultados para devolver // la columna como un tipo particular. Consulte la documentación de Sun // para obtener la lista de conversiones válidas. System.out.println ( " COLUMN " + i + " = " + rs.getObject ( i )); } // for } // while } // try } // try                                            

Si falla una operación de base de datos, JDBC genera un SQLExceptionerror . Normalmente, no se puede hacer mucho para recuperarse de un error de este tipo, aparte de registrarlo con el mayor detalle posible. Se recomienda que se SQLExceptiontraduzca en una excepción de dominio de aplicación (no verificada) que, en última instancia, dé como resultado una reversión de la transacción y una notificación al usuario.

El siguiente código es un ejemplo de una transacción de base de datos :

booleano autoCommitDefault = conn.getAutoCommit ( ) ; intentar { conn.setAutoCommit ( false ) ;      /* Ejecutas sentencias contra conn aquí transaccionalmente */ conn.commit (); } catch ( Throwable e ) { try { conn.rollback (); } catch ( Throwable e ) { logger.warn ( " No se pudo revertir la transacción" , e ) ; } throw e ; } finally { try { conn.setAutoCommit ( autoCommitDefault ) ; } catch ( Throwable e ) { logger.warn ( " No se pudo restaurar la configuración de AutoCommit " , e ) ; } }                             

Para ver un ejemplo de CallableStatement(para llamar a procedimientos almacenados en la base de datos), consulte la documentación de la Guía de API de JDBC.

importar java.sql.Connection ; importar java.sql.DriverManager ; importar java.sql.Statement ;   clase pública Mydb1 { estática String URL = "jdbc:mysql://localhost/mydb" ;         public static void main ( String [] args ) { try { Clase . forName ( "com.mysql.jdbc.Driver" );         Conexión conn = DriverManager . getConnection ( URL , "root" , "root" ); Declaración stmt = conn . createStatement (); String sql = "INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt .executeUpdate ( sql ); System . out . println ( "Se insertaron registros en la tabla..." ); } catch ( Exception e ) { e . printStackTrace ( ); } } }                         

Controladores JDBC

Los controladores JDBC son adaptadores del lado del cliente (instalados en la máquina cliente, no en el servidor) que convierten las solicitudes de los programas Java a un protocolo que el DBMS puede entender.

Tipos

Los controladores comerciales y gratuitos proporcionan conectividad a la mayoría de los servidores de bases de datos relacionales. Estos controladores pertenecen a uno de los siguientes tipos:

Tenga en cuenta también un tipo llamado controlador JDBC interno: un controlador integrado con JRE en bases de datos SQL habilitadas para Java. Se utiliza para procedimientos almacenados de Java . Esto no encaja en el esquema de clasificación anterior, aunque probablemente se parecería a un controlador de tipo 2 o tipo 4 (dependiendo de si la base de datos en sí está implementada en Java o no). Un ejemplo de esto es el controlador KPRB (Kernel Program Bundled) [16] suministrado con Oracle RDBMS . "jdbc:default:connection" ofrece una forma relativamente estándar de realizar dicha conexión (al menos la base de datos Oracle y Apache Derby lo admiten). Sin embargo, en el caso de un controlador JDBC interno, el cliente JDBC en realidad se ejecuta como parte de la base de datos a la que se accede, y por lo tanto puede acceder a los datos directamente en lugar de a través de protocolos de red.

Fuentes

Véase también

Citas

  1. ^ ab "Sun lanza JDK 1.1 -- Javabeans incluidos". www.sun.com . Sun Microsystems . 19 de febrero de 1997. Archivado desde el original el 10 de febrero de 2008 . Consultado el 15 de febrero de 2010 . 19 de febrero de 1997 - El JDK 1.1 [...] ya está disponible [...]. Esta versión del JDK incluye: [...] Nuevas funciones sólidas, incluido JDBC para la conectividad de bases de datos
  2. ^ Especificación de API JDBC Versión: 4.0.
  3. ^ "El programa Java Community Process(SM) - communityprocess - mrel". jcp.org . Consultado el 22 de marzo de 2018 .
  4. ^ "JDBC 4.1". docs.oracle.com . Consultado el 22 de marzo de 2018 .
  5. ^ "El programa Java Community Process(SM) - communityprocess - mrel". jcp.org . Consultado el 22 de marzo de 2018 .
  6. ^ "JDBC 4.2". docs.oracle.com . Consultado el 22 de marzo de 2018 .
  7. ^ "El programa Java Community Process(SM) - communityprocess - mrel". jcp.org . Consultado el 22 de marzo de 2018 .
  8. ^ "java.sql (Java SE 9 & JDK 9)". docs.oracle.com . Consultado el 22 de marzo de 2018 .
  9. ^ abcd Bai 2022, pág. 74.
  10. ^ Bai 2022, págs. 122–124, §4.2.3.5 Más sobre los métodos de ejecución.
  11. ^ abc Bai 2022, págs. 72–74, §3.2 Componentes y arquitectura de JDBC.
  12. ^ Horstmann 2022, §5.5.3 Escapes SQL.
  13. ^ ab Bai 2022, págs. 122–124, §4.2.3.5 Componentes y arquitectura de JDBC.
  14. ^ Bai 2022, pág. 83, §3.5.1 Fuente de datos JDBC.
  15. ^ "Java JDBC API". docs.oracle.com . Consultado el 22 de marzo de 2018 .
  16. ^ Greenwald, Rick; Stackowiak, Robert; Stern, Jonathan (1999). Oracle Essentials: Oracle Database 10g. Essentials Series (3.ª edición). Sebastopol, California: O'Reilly Media, Inc. (publicado en 2004). pág. 318. ISBN 9780596005856. Recuperado el 3 de noviembre de 2016. El controlador JDBC en base de datos (JDBC KPRB) [:] El código Java utiliza la versión JDBC KPRB (Kernel Program Bundled) para acceder a SQL en el mismo servidor.
  17. ^ "Controladores JDBC - Software CData". Software CData . Consultado el 22 de marzo de 2018 .
  18. ^ "Controladores JDBC - CData Software". CData Software . Archivado desde el original el 22 de diciembre de 2015. Consultado el 22 de marzo de 2018 .
  19. ^ "Nuevo controlador JDBC tipo 5: DataDirect Connect".
  20. ^ "Acceso a bases de datos externas desde RPG con JDBCR4 Meat of the Matter". 28 de junio de 2012. Consultado el 12 de abril de 2016 .
  21. ^ Sualeh Fatehi. "SchemaCrawler". GitHub .

Referencias

Enlaces externos