Articulo de referencia

Conectividad de bases de datos Java

La conectividad de bases de datos Java ( JDBC ) es una interfaz de programación de aplicaciones (API) para el lenguaje de programación Java que define cómo un cliente puede acce...

La conectividad de bases de datos Java ( 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 la conexión a cualquier fuente de datos accesible mediante ODBC en el entorno de la máquina virtual Java (JVM).

Historia e implementación

Sun Microsystems lanzó JDBC como parte del Java Development Kit (JDK) 1.1 el 19 de febrero de 1997. [ 1 ] Desde entonces ha sido parte de la Java Platform, Standard Edition (Java SE).

Las clases JDBC están contenidas en el paquete Javajava.sql y javax.sql, así como algunas otras clases en otros lugares. Todo lo relacionado con JDBC se exporta a través del módulojava.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 (para javax.sql.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 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 en el Administrador de controladores JDBC ( java.sql.DriverManager). java.sql.DriverManagerse utiliza como una java.sql.Connectionfábrica para crear conexiones JDBC.

Las conexiones JDBC admiten la creación y ejecución de sentencias. 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 las sentencias utilizando una de las siguientes clases:

  • Statement se java.sql.Statementenvía al servidor de la base de datos cada vez. En otras palabras, los java.sql.Statementmétodos se ejecutan utilizando sentencias SQL para obtener un java.sql.ResultSetobjeto que contiene los datos. [ 9 ]
  • PreparedStatementjava.sql.PreparedStatement es una subinterfaz de la java.sql.Statementinterfaz. [ 9 ] La instrucción se almacena en caché y luego la ruta de ejecución se predetermina en el servidor de base de datos, lo que permite que se ejecute varias veces de manera eficiente. [ 9 ]java.sql.PreparedStatement se utiliza para ejecutar instrucciones SQL precompiladas. [ 9 ] La ejecución de instrucciones precompiladas aumenta la eficiencia y el rendimiento de la ejecución de instrucciones. java.sql.PreparedStatementSe utiliza a menudo para instrucciones dinámicas donde se deben pasar algunos parámetros de entrada a la base de datos de destino. [ 10 ] Permite java.sql.PreparedStatementque la consulta dinámica varíe según el parámetro de consulta. [ 11 ]
  • CallableStatementjava.sql.CallableStatement es una subinterfaz de la java.sql.Statementinterfaz. [ 11 ] Se utiliza para ejecutar procedimientos almacenados en la base de datos. [ 11 ] [ 12 ] Tanto los parámetros de entrada como los de salida deben pasarse a la base de datos para los procedimientos almacenados. [ 13 ]

Las instrucciones de actualización, como y INSERT, devuelven un recuento de actualización que indica el número de filas afectadas en la base de datos como un número entero. [ 13 ] Estas instrucciones no devuelven ninguna otra información.UPDATEDELETE

Las consultas devuelven un conjunto de resultados de filas JDBC. Este conjunto se utiliza para recorrer el conjunto de resultados . Las columnas individuales de una fila se recuperan por nombre o por número de columna. El conjunto de resultados puede contener cualquier número de filas. El conjunto de resultados de filas incluye metadatos que describen los nombres de las columnas y sus tipos.

Existe una extensión a la API JDBC básica en el javax.sql.

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

Ejemplos

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

import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ;Connection conn = DriverManager . getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" );try { // usar la conexión aquí } finally { try { // cerrar la conexión después de que hayamos terminado conn . close (); } catch ( SQLException e ) { // propagar la excepción original, no la capturada aquí logger . warn ( "No se pudo cerrar la conexión JDBC" , e ); } }

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

import java.sql.Connection ; import java.sql.DriverManager ;try ( Connection conn = DriverManager . getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { // usar la conexión aquí } // conn.close() se llama automáticamente // la conexión se cerrará automáticamente después de salir del bloque try

Una vez establecida la conexión, java.sql.Statementse puede crear un.

import java.sql.Statement ;try ( Statement stmt = conn . createStatement ()) { stmt . executeUpdate ( "INSERT INTO MyTable(name) VALUES ('my name')" ); }

Tenga en cuenta que java.sql.Connectionlas solicitudes java.sql.Statementa servidores de bases de datos remotos java.sql.ResultSetsuelen consumir recursos del sistema operativo, como sockets o descriptores de archivo . En el caso de java.sql.Connectionlas solicitudes a servidores de bases de datos remotos, se consumen recursos adicionales en el servidor, como cursores para java.sql.ResultSetlas solicitudes actualmente abiertas. Es fundamental que cualquier objeto JDBC elimine la basuraclose() una vez que haya cumplido su función; no se debe confiar en ella. La estructura try-with-resources descrita anteriormente es un patrón de código que evita este problema.

Los datos se recuperan de la base de datos mediante un mecanismo de consulta. El siguiente ejemplo muestra cómo crear una instrucción y ejecutar una consulta.

import java.sql.ResultSet ; import java.sql.Statement ;try ( Statement 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 . printf ( "COLUMNA %d = %s%n" , i , rs . getObject ( i )); } } }

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

import java.sql.PreparedStatement ; import java.sql.ResultSet ;try ( PreparedStatement ps = conn . prepareStatement ( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // En la sentencia SQL que se está preparando, cada signo de interrogación es un marcador de posición // que debe reemplazarse con un valor que 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 , "Poor Yorick" ); ps . setInt ( 2 , 8008 );// El ResultSet, rs, transmite el resultado de la ejecución de la instrucción SQL. // Cada vez que se llama a rs.next(), un puntero de fila interno, o cursor, // avanza a la siguiente fila del resultado. El cursor inicialmente se // posiciona antes de la primera fila. try ( ResultSet rs = ps . executeQuery ()) { while ( rs . next ()) { for ( int i = 1 ; i <= rs . getMetaData (). getColumnCount (); 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 . printf ( "COLUMNA %d = %s%n" , i , rs . getObject ( i )); } } } }

Si una operación de base de datos falla, JDBC genera una excepción SQLException. Por lo general, hay muy poco que se pueda hacer para recuperarse de dicho error, aparte de registrarlo con el mayor detalle posible. Se recomienda que la excepción java.sql.SQLExceptionse traduzca en una excepción de dominio de aplicación (una excepción no verificada) que finalmente 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 :

import java.sql.SQLException ;boolean autoCommitDefault = conn.getAutoCommit ( ) ; try { conn.setAutoCommit ( false ) ;// Ejecutar instrucciones en conn aquí de forma transaccionalconn.commit (); } catch ( SQLException 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 java.sql.CallableStatementcómo llamar a procedimientos almacenados en la base de datos, consulte la documentación de la Guía de la API JDBC .

paquete org.wikipedia.examples ;import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ;public class DatabaseExample { private static final String DB_URL = "jdbc:mysql://localhost/mydb" ;public static void main ( String [] args ) { try { Class . forName ( "com.mysql.jdbc.Driver" );Connection conn = DriverManager.getConnection ( DB_URL , "root" , "root" ); Statement stmt = conn.createStatement (); String sql = " INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt.executeUpdate ( sql ) ; System.out.println ( " Registros insertados en la tabla ..." ) ; } catch ( SQLException e ) { System.err.printf ( " Se produjo un error SQL: %s%n" , e.getMessage ( ) ) ; } catch ( Exception e ) { System.err.println ( " Se produjo un error desconocido. " ) ; 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 sistema de gestión de bases de datos (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 se clasifican en uno de los siguientes tipos:

  • Tipo 1 que llama al código nativo del controlador ODBC disponible localmente. (Nota: En JDBC 4.2, se eliminó el puente JDBC-ODBC [ 15 ] )
  • El tipo 2 llama a la biblioteca nativa del proveedor de la base de datos en el lado del cliente. Este código se comunica con la base de datos a través de la red.
  • Tipo 3 , el controlador escrito completamente en Java que se comunica con el middleware del lado del servidor, el cual a su vez se comunica con la base de datos.
  • Tipo 4 , el controlador puramente Java que utiliza el protocolo nativo de la base de datos.

Cabe destacar también un tipo denominado controlador JDBC interno : un controlador integrado en JRE en bases de datos SQL habilitadas para Java. Se utiliza para procedimientos almacenados de Java . Este no se ajusta al esquema de clasificación anterior, aunque probablemente se asemejaría a un controlador de tipo 2 o tipo 4 (dependiendo de si la base de datos 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 establecer 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 se ejecuta como parte de la base de datos a la que se accede, por lo que puede acceder a los datos directamente en lugar de a través de protocolos de red.

Fuentes

  • Oracle proporciona una lista de algunos controladores y proveedores de JDBC.
  • Simba Technologies ofrece un SDK para crear controladores JDBC personalizados para cualquier fuente de datos relacional personalizada o propietaria.
  • CData Software distribuye controladores JDBC de tipo 4 para diversas aplicaciones, bases de datos y API web. [ 17 ]
  • DataDirect Technologies proporciona un conjunto completo de controladores JDBC rápidos de tipo 4 para todas las bases de datos principales que anuncian como de tipo 5 [ 18 ].
  • IDS Software proporciona un controlador JDBC de tipo 3 para el acceso concurrente a todas las bases de datos principales. Las características compatibles incluyen almacenamiento en caché de conjuntos de resultados, cifrado SSL, fuente de datos personalizada, dbShield
  • JDBaccess es una biblioteca de persistencia Java para MySQL y Oracle que define las principales operaciones de acceso a la base de datos en una API fácil de usar sobre JDBC.
  • JNetDirect proporciona un conjunto de controladores JDBC de alto rendimiento con certificación Sun J2EE completa.
  • JDBCR4 es un programa de servicio escrito por Scott Klement para permitir el acceso a JDBC desde RPG en IBM i . [ 19 ]
  • HSQLDB es un sistema de gestión de bases de datos relacionales (RDBMS) con un controlador JDBC y está disponible bajo una licencia BSD.
  • SchemaCrawler [ 20 ] es una API de código abierto que aprovecha JDBC y hace que los metadatos de la base de datos estén disponibles como objetos Java simples y antiguos (POJO).

Véase también

Citas

  1. 1 2 "Sun lanza JDK 1.1: Javabeans incluidos" . www.sun.com . Sun Microsystems . 19 de febrero de 1997. Archivado del 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 y robustas características, incluyendo JDBC para la conectividad de bases de datos.
  2. Especificación de la 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 y JDK 9)" . docs.oracle.com . Consultado el 22 de marzo de 2018 .
  9. 1 2 3 4 Bai 2022 , pág. 74.
  10. Bai 2022 , págs. 122–124, §4.2.3.5 Más información sobre los métodos de ejecución.
  11. 1 2 3 Bai 2022 , pp. 72–74, §3.2 Componentes y arquitectura de JDBC.
  12. Horstmann 2022 , §5.5.3 Escapes SQL.
  13. 1 2 Bai 2022 , pp. 122–124, §4.2.3.5 Componentes y arquitectura de JDBC.
  14. Bai 2022 , pág. 83, §3.5.1 JDBC DataSource.
  15. "API JDBC de Java" . 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.ª ed.). 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 la 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 - CData Software" . CData Software . Consultado el 22 de marzo de 2018 .
  18. "Nuevo controlador JDBC de tipo 5 : DataDirect Connect" . 
  19. "Acceso a bases de datos externas desde RPG con JDBCR4: El meollo del asunto" . 28 de junio de 2012. Consultado el 12 de abril de 2016 .
  20. Sualeh Fatehi. "SchemaCrawler" . GitHub .

Referencias

  • Bai, Ying (2022). Programación de bases de datos SQL Server con Java . Cham: Springer International Publishing . doi : 10.1007/978-3-031-06553-8 . ISBN 978-3-030-92686-1.
  • Horstmann, Cay (15 de abril de 2022). Java central . Prensa Oracle Java. ISBN 978-0-13-787107-0.
  • Guía de la API JDBC
  • java.sqlDocumentación Javadoc de la API
  • javax.sqlDocumentación Javadoc de la API
  • Marco de trabajo JDBC Scala para intermediario O/R
  • SqlTool es una utilidad cliente JDBC genérica de código abierto, para línea de comandos. Funciona con cualquier base de datos compatible con JDBC.
  • Cadenas URL JDBC e información relacionada de todas las bases de datos.