Conectividad de base de datos Java - Java Database Connectivity
Desarrollador (es) | Oracle Corporation |
---|---|
Lanzamiento estable | JDBC 4.3 / 21 de septiembre de 2017
|
Sistema operativo | Multiplataforma |
Tipo | API de acceso a datos |
Sitio web | Guía de la API de JDBC |
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 de Java. Es 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á orientado a bases de datos relacionales . Un puente de JDBC a ODBC permite conexiones a cualquier fuente de datos accesible a 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. Desde entonces ha sido parte de Java Platform, Standard Edition (Java SE).
Las clases JDBC están incluidas 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 de 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).
JDBC 4.1, está especificado por una versión de mantenimiento 1 de JSR 221 y está incluido en Java SE 7.
JDBC 4.2, está especificado por una versión de mantenimiento 2 de JSR 221 y está incluido en Java SE 8.
La última versión, JDBC 4.3, está especificada por una versión de mantenimiento 3 de JSR 221 y está incluida en Java SE 9.
Funcionalidad
JDBC ('Java Database Connectivity') permite que existan múltiples implementaciones y sean utilizadas por la misma aplicación. La API proporciona un mecanismo para cargar dinámicamente los paquetes Java correctos y registrarlos con JDBC Driver Manager. El Administrador de controladores se utiliza como fábrica de conexiones para crear conexiones JDBC.
Las conexiones JDBC admiten la creación y ejecución de declaraciones. Pueden ser sentencias de actualización como CREATE , INSERT , UPDATE y DELETE de SQL , o pueden ser sentencias de consulta como SELECT . Además, los procedimientos almacenados se pueden invocar a través de una conexión JDBC. JDBC representa declaraciones que utilizan una de las siguientes clases:
-
Statement
- la declaración se envía al servidor de la base de datos cada vez. -
PreparedStatement
- la declaración se almacena en caché y luego la ruta de ejecución está predeterminada en el servidor de la base de datos, lo que permite que se ejecute varias veces de manera eficiente. -
CallableStatement
- utilizado para ejecutar procedimientos almacenados en la base de datos.
Las declaraciones de actualización como INSERT, UPDATE y DELETE devuelven un recuento de actualizaciones que indica cuántas filas se vieron afectadas en la base de datos. Estas declaraciones no devuelven ninguna otra información.
Las sentencias 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 número 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 administran a través de un grupo de conexiones en lugar de obtenerse directamente del controlador.
Tipo de datos de Oracle |
setXXX() Métodos
|
---|---|
CARBONIZARSE |
setString()
|
VARCHAR2 |
setString()
|
NÚMERO |
setBigDecimal()
|
setBoolean()
|
|
setByte()
|
|
setShort()
|
|
setInt()
|
|
setLong()
|
|
setFloat()
|
|
setDouble()
|
|
ENTERO |
setInt()
|
FLOTADOR |
setDouble()
|
CLOB |
setClob()
|
GOTA |
setBlob()
|
CRUDO |
setBytes()
|
LONGRAW |
setBytes()
|
FECHA |
setDate()
|
setTime()
|
|
setTimestamp()
|
Ejemplos de
Cuando una aplicación Java necesita una conexión a la base de datos, DriverManager.getConnection()
se utiliza uno de los métodos para crear una conexión JDBC. La URL utilizada depende de la base de datos particular y del controlador JDBC. Siempre comenzará con el protocolo "jdbc:", pero el resto depende del proveedor en particular.
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword");
try {
/* you use the connection here */
} finally {
//It's important to close the connection when you are done with it
try {
conn.close();
} catch (Throwable e) { /* Propagate the original exception
instead of this one that you want just logged */
logger.warn("Could not close JDBC Connection",e);
}
}
A partir de Java SE 7, puede usar 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")) {
/* you use the connection here */
} // the VM will take care of closing the connection
Una vez que se establece una conexión, se puede crear una declaración.
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("INSERT INTO MyTable(name) VALUES ('my name')");
}
Tenga en cuenta que las conexiones, las declaraciones y los conjuntos de resultados a menudo atan los recursos del sistema operativo , como sockets o descriptores de archivos . En el caso de conexiones a servidores de bases de datos remotos, otros recursos están atados en el servidor, por ejemplo, cursores para ResultSets abiertos actualmente. Es vital para close()
cualquier objeto JDBC tan pronto como haya desempeñado su papel;
no se debe confiar en la recolección de basura . La construcción anterior try-with-resources 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 la base de datos. El siguiente ejemplo muestra la creación de una declaración y la ejecución de una consulta.
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++) {
// Column numbers start at 1.
// Also there are many methods on the result set to return
// the column as a particular type. Refer to the Sun documentation
// for the list of valid conversions.
System.out.println( "COLUMN " + i + " = " + rs.getObject(i));
}
}
}
Un ejemplo de una PreparedStatement
consulta, usando una conn
clase del primer ejemplo.
try (PreparedStatement ps =
conn.prepareStatement("SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?")
) {
// In the SQL statement being prepared, each question mark is a placeholder
// that must be replaced with a value you provide through a "set" method invocation.
// The following two method calls replace the two placeholders; the first is
// replaced by a string value, and the second by an integer value.
ps.setString(1, "Poor Yorick");
ps.setInt(2, 8008);
// The ResultSet, rs, conveys the result of executing the SQL statement.
// Each time you call rs.next(), an internal row pointer, or cursor,
// is advanced to the next row of the result. The cursor initially is
// positioned before the first row.
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// Column numbers start at 1.
// Also there are many methods on the result set to return
// the column as a particular type. Refer to the Sun documentation
// for the list of valid conversions.
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
. Por lo general, es muy poco lo que se puede hacer para recuperarse de un error de este tipo, aparte de registrarlo con el mayor detalle posible. Se recomienda que SQLException se traduzca en una excepción de dominio de aplicación (una sin marcar) que eventualmente resulte en una reversión de la transacción y una notificación al usuario.
Un ejemplo de una transacción de base de datos :
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
/* You execute statements against conn here transactionally */
conn.commit();
} catch (Throwable e) {
try { conn.rollback(); } catch (Throwable e) { logger.warn("Could not rollback transaction", e); }
throw e;
} finally {
try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable e) { logger.warn("Could not restore AutoCommit setting",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 .
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Mydb1 {
static String URL = "jdbc:mysql://localhost/mydb";
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, "root", "root");
Statement stmt = conn.createStatement();
String sql = "INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)";
stmt.executeUpdate(sql);
System.out.println("Inserted records into the table...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Controladores JDBC
Los controladores JDBC son adaptadores del lado del cliente (instalados en la máquina del cliente, no en el servidor) que convierten las solicitudes de los programas Java en un protocolo que el DBMS puede comprender.
Tipos
Los controladores comerciales y gratuitos brindan conectividad a la mayoría de los servidores de bases de datos relacionales. Estos controladores pertenecen a uno de los siguientes tipos:
- Tipo 1 que llama al código nativo del controlador ODBC disponible localmente. (Nota: en JDBC 4.2, se ha eliminado el puente JDBC-ODBC)
- Tipo 2 que llama a la biblioteca nativa del proveedor de la base de datos en el lado del cliente. Este código luego se comunica con la base de datos a través de la red.
- Escriba 3 , el controlador de Java puro que se comunica con el middleware del lado del servidor que luego se comunica con la base de datos.
- Escriba 4 , el controlador de Java puro que utiliza el protocolo nativo de la base de datos.
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 de 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) 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 la admiten). Sin embargo, en el caso de un controlador JDBC interno, el cliente JDBC realmente 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
- Oracle proporciona una lista de algunos controladores y proveedores de JDBC
- Simba Technologies envía un SDK para crear controladores JDBC personalizados para cualquier fuente de datos relacionales personalizada / propietaria
- El software CData incluye controladores JDBC de tipo 4 para diversas aplicaciones, bases de datos y API web.
- Controladores JDBC RSSBus tipo 4 para aplicaciones, bases de datos y servicios web
- DataDirect Technologies proporciona un conjunto completo de controladores JDBC de tipo 4 rápidos para todas las bases de datos principales que anuncian como de tipo 5
- El software IDS proporciona un controlador JDBC de tipo 3 para el acceso simultáneo a las principales bases de datos. Las características admitidas incluyen almacenamiento en caché de conjuntos de resultados, cifrado SSL, fuente de datos personalizada, dbShield
- JDBaccess es una biblioteca de persistencia de Java para MySQL y Oracle que define las principales operaciones de acceso a la base de datos en una API fácil de usar por encima de JDBC
- JNetDirect proporciona un conjunto de controladores JDBC de alto rendimiento totalmente certificados por Sun J2EE.
- JDBCR4 es un programa de servicio escrito por Scott Klement para permitir el acceso a JDBC desde RPG en IBM i .
- HSQLDB es un RDBMS con un controlador JDBC y está disponible bajo una licencia BSD.
- SchemaCrawler 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 antiguos simples (POJO)
Ver también
- Acceso a datos GNU (GDA)
- JDBCFacade
- Conectividad de base de datos abierta (ODBC)
- Mapeo relacional de objetos (ORM)
Referencias
enlaces externos
- Guía de la API de JDBC Esta documentación tiene ejemplos en los que los recursos de JDBC no se cierran correctamente (se tragan las excepciones primarias y pueden causar NullPointerExceptions) y tiene un código propenso a la inyección de SQL.
-
java.sql
Documentación de API Javadoc -
javax.sql
Documentación de API Javadoc - Marco JDBC de O / R Broker Scala
- SqlTool Utilidad de cliente JDBC genérica de código abierto, línea de comandos. Funciona con cualquier base de datos compatible con JDBC.
- Cadenas de URL de JDBC e información relacionada de todas las bases de datos.