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).
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]
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
). DriverManager
se 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:
Statement
– Statement
se envía al servidor de base de datos cada vez. En otras palabras, los Statement
métodos se ejecutan mediante sentencias SQL para obtener un ResultSet
objeto que contiene los datos. [9]PreparedStatement
– PreparedStatement
es una subinterfaz de la Statement
interfaz. [9] La declaració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] PreparedStatement
se utiliza para ejecutar declaraciones SQL precompiladas. [9] La ejecución de declaraciones precompiladas aumenta la eficiencia y el rendimiento de la ejecución de declaraciones. PreparedStatement
A menudo se utiliza para declaraciones dinámicas donde se deben pasar algunos parámetros de entrada a la base de datos de destino. [ 10 ]PreparedStatement
permite que la consulta dinámica varíe dependiendo del parámetro de consulta. [11]
CallableStatement
– CallableStatement
es una subinterfaz de la Statement
interfaz. [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 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]
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, Statement
se puede crear una.
try ( Statement stmt = conn . createStatement ()) { stmt . acquireUpdate ( "INSERT INTO MyTable(name) VALUES ('mi nombre')" ); }
Tenga en cuenta que Connection
s, Statement
s y ResultSet
s a menudo ocupan recursos del sistema operativo , como sockets o descriptores de archivos . En el caso de Connection
s 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 PreparedStatement
consulta que utiliza conn
una 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 SQLException
error . 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 SQLException
traduzca 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 ( ); } } }
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.
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.
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
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.
java.sql
Documentación de API Javadocjavax.sql
Documentación de API Javadoc