JDBC son las siglas de Java Database Connectivity, que es una API estándar de Java para la conectividad independiente de la base de datos entre el lenguaje de programación Java y una amplia gama de bases de datos.

La arquitectura general JDBC consta de dos capas de la API JDBC (que proporciona la conexión de la aplicación al JDBC Manager) y la API del controlador JDBC (que admite la conexión JDBC Manager-to-Driver).

La API de JDBC consta de las siguientes interfaces y clases DriverManager, Driver, Connection, Statement, ResultSet, SQLException.

JDBC DriverManager es una clase que administra una lista de controladores de bases de datos. Hace coincidir las solicitudes de conexión de la aplicación Java con el controlador de base de datos adecuado mediante el subprotocolo de comunicación.

El controlador JDBC es una interfaz que permite que una aplicación Java interactúe con una base de datos. Para conectarse con bases de datos individuales, JDBC requiere controladores para cada base de datos. El controlador JDBC proporciona la conexión a la base de datos e implementa el protocolo para transferir la consulta y el resultado entre el cliente y la base de datos.

La interfaz de conexión consta de métodos para contactar una base de datos. El objeto de conexión representa el contexto de comunicación.

Sentencia encapsula una sentencia SQL que se pasa a la base de datos para ser analizada, compilada, planificada y ejecutada.

Estos objetos contienen datos recuperados de una base de datos después de ejecutar una consulta SQL utilizando objetos Statement. Actúa como un iterador para permitirle moverse a través de sus datos. La interfaz java.sql.ResultSet representa el conjunto de resultados de una consulta de base de datos.

Hay tres constantes que cuando se definen en el conjunto de resultados pueden mover el cursor en el conjunto de resultados hacia atrás, adelante y también en una fila en particular.

  • ResultSet.TYPE_FORWARD_ONLY - El cursor solo puede avanzar en el conjunto de resultados.

  • ResultSet.TYPE_SCROLL_INSENSITIVE - El cursor puede desplazarse hacia adelante y hacia atrás, y el conjunto de resultados no es sensible a los cambios realizados por otros en la base de datos que ocurren después de que se creó el conjunto de resultados.

  • ResultSet.TYPE_SCROLL_SENSITIVE - El cursor puede desplazarse hacia adelante y hacia atrás, y el conjunto de resultados es sensible a los cambios realizados por otros en la base de datos que ocurren después de que se creó el conjunto de resultados.

Los siguientes son los pasos básicos para crear una aplicación JDBC

  • Importe paquetes que contengan las clases JDBC necesarias para la programación de bases de datos.

  • Registre el controlador JDBC, de modo que pueda abrir un canal de comunicaciones con la base de datos.

  • Abra una conexión con el método DriverManager.getConnection ().

  • Ejecute una consulta utilizando un objeto de tipo Statement.

  • Extraiga datos del conjunto de resultados utilizando el método ResultSet.getXXX () apropiado.

  • Limpie el entorno cerrando todos los recursos de la base de datos que dependen de la recolección de basura de la JVM.

Hay cuatro tipos de controladores JDBC

  • JDBC-ODBC Bridge plus ODBC driver - también llamado Tipo 1 llama al código nativo del controlador ODBC disponible localmente.

  • Native-API, partly Java driver- también llamada biblioteca nativa del proveedor de base de datos de llamadas Tipo 2 en el lado del cliente. Este código luego habla con la base de datos a través de la red.

  • JDBC-Net, pure Java driver - también llamado Tipo 3, el controlador de Java puro que habla con el middleware del lado del servidor que luego habla con la base de datos.

  • Native-protocol, pure Java driver - también llamado Tipo 4, el controlador de Java puro que utiliza el protocolo nativo de la base de datos.

A continuación se muestra una lista de cuándo se pueden utilizar los cuatro tipos de controladores

  • Si accede a un tipo de base de datos, como Oracle, Sybase o IBM, el tipo de controlador preferido es 4.

  • Si su aplicación Java accede a varios tipos de bases de datos al mismo tiempo, el tipo 3 es el controlador preferido.

  • Los controladores de tipo 2 son útiles en situaciones en las que un controlador de tipo 3 o tipo 4 aún no está disponible para su base de datos.

  • El controlador de tipo 1 no se considera un controlador de nivel de implementación y generalmente se usa solo con fines de desarrollo y prueba.

El controlador Java puro de JDBC Net (Tipo 4) es el controlador más rápido porque convierte las llamadas JDBC en llamadas de protocolo específicas del proveedor e interactúa directamente con la base de datos.

No. Solo puede abrir un objeto Statement por conexión cuando utiliza JDBC-ODBC Bridge.

Los niveles de aislamiento estándar son

  • TRANSACTION_NONE

  • TRANSACTION_READ_COMMITTED

  • TRANSACTION_READ_UNCOMMITTED

  • TRANSACTION_REPEATABLE_READ

  • TRANSACTION_SERIALIZABLE

La arquitectura JDBC desacopla una abstracción de su implementación. Por tanto, JDBC sigue un patrón de diseño de puentes. La API de JDBC proporciona la abstracción y los controladores JDBC proporcionan la implementación. Se pueden conectar nuevos controladores a la API de JDBC sin cambiar el código del cliente.

Los tipos de declaraciones son

  • Statement - declaración SQL regular.

  • PreparedStatement - Más eficiente que la declaración debido a la compilación previa de SQL.

  • CallableStatement - para llamar a procedimientos almacenados en la base de datos.

Las declaraciones preparadas ofrecen un mejor rendimiento, ya que están compiladas previamente. Las declaraciones preparadas reutilizan el mismo plan de ejecución para diferentes argumentos en lugar de crear un nuevo plan de ejecución cada vez. Las declaraciones preparadas utilizan argumentos de enlace, que se envían al motor de la base de datos. Esto permite mapear diferentes solicitudes con la misma declaración preparada pero diferentes argumentos para ejecutar el mismo plan de ejecución. Las declaraciones preparadas son más seguras porque usan variables de vinculación, que pueden evitar el ataque de inyección SQL.

  • Class.forName()- Este método carga dinámicamente el archivo de clase del controlador en la memoria, que lo registra automáticamente. Este método es preferible porque le permite hacer que el registro del controlador sea configurable y portátil.

  • DriverManager.registerDriver() - Este método estático se utiliza en caso de que esté utilizando una JVM no compatible con JDK, como la proporcionada por Microsoft.

Aquí hay algunas ventajas de JDBC 4.0

  • Carga automática de la clase de controlador JDBC. En las versiones anteriores, teníamos que registrar y cargar controladores manualmente usando class.forName.

  • Mejoras en la gestión de conexiones. Nuevos métodos agregados a javax.sql.PooledConnection.

  • DataSet Implementación de SQL mediante anotaciones.

  • Soporte SQL XML.

El rendimiento o la rapidez del controlador JDBC depende de una serie de cuestiones La calidad del código del controlador, el tamaño del código del controlador, el servidor de la base de datos y su carga, la topología de la red, la cantidad de veces que su solicitud se traduce a una API diferente.

Cuente su experiencia en tiempo real.

Hay 3 métodos DriverManager.getConnection () sobrecargados para crear un objeto de conexión

getConnection (String url, String user, String password) Usando una URL de base de datos con un nombre de usuario y contraseña. Por ejemplo

String URL = "[email protected]";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
getConnection(String url)Using only a database URL. For example
String URL = "jdbcoraclethinusername/[email protected]";
Connection conn = DriverManager.getConnection(URL);
getConnection(String url, Properties prop)Using a database URL and a Properties object. For example
String URL = "[email protected]";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

Utilice los métodos de DatabaseMetaData supportsOpenStatementsAcrossCommit () y supportsOpenStatementsAcrossRollback () para verificar.

La especificación no menciona ninguna limitación de tamaño para Statement.addBatch (), esto depende del controlador.

Hay varios métodos en la interfaz ResultSet que implican mover el cursor, como beforeFirst (), afterLast (), first (), last (), absoluto (int fila), relativo (int fila), anterior (), siguiente () , getRow (), moveToInsertRow (), moveToCurrentRow ().

La interfaz ResultSet contiene métodos de obtención para cada uno de los tipos de datos posibles, y cada método de obtención tiene dos versiones

  • Uno que incluya un nombre de columna.

  • Uno que incluye un índice de columna.

Por ejemplo, getInt (String columnName), getInt (int columnIndex)

La interfaz ResultSet contiene una colección de métodos de actualización para actualizar los datos de un conjunto de resultados. Cada método de actualización tiene dos versiones para cada tipo de datos

  • Uno que incluya un nombre de columna.

  • Uno que incluye un índice de columna.

Estos métodos cambian las columnas de la fila actual en el objeto ResultSet, pero no en la base de datos subyacente. Para actualizar sus cambios en la fila de la base de datos, debe invocar uno de los siguientes métodos

updateRow (), deleteRow (), refreshRow (), cancelRowUpdates (), insertRow ()

El controlador JDBC convierte el tipo de datos Java al tipo JDBC apropiado antes de enviarlo a la base de datos. Utiliza una asignación predeterminada para la mayoría de los tipos de datos. Por ejemplo, un int de Java se convierte en un INTEGER de SQL.

Se produce "No hay controlador adecuado" durante una llamada al método DriverManager.getConnection, puede deberse a cualquiera de los siguientes motivos

  • Debido a que no se pudieron cargar los controladores JDBC adecuados antes de llamar al método getConnection.

  • Puede especificar una URL JDBC no válida, una que no sea reconocida por el controlador JDBC.

  • Este error puede ocurrir si no se pueden cargar una o más bibliotecas compartidas que necesita el puente.

El uso de SQL de valores NULL y el uso de Java de null son conceptos diferentes. Hay tres tácticas que puedes usar

  • Evite el uso de métodos getXXX () que devuelven tipos de datos primitivos.

  • Utilice clases contenedoras para tipos de datos primitivos y utilice el método wasNull () del objeto ResultSet para probar si la variable de clase contenedora que recibió el valor devuelto por el método getXXX () debe establecerse en nulo.

  • Utilice tipos de datos primitivos y el método wasNull () del objeto ResultSet para probar si la variable primitiva que recibió el valor devuelto por el método getXXX () debe establecerse en un valor aceptable que haya elegido para representar un NULL.

Cuando se crea una conexión, está en modo de confirmación automática. Esto significa que cada declaración SQL individual se trata como una transacción y se confirmará automáticamente inmediatamente después de su ejecución. Al establecer el compromiso automático en falso, no se confirmará ninguna declaración SQL hasta que llame explícitamente al método de compromiso.

Las siguientes son las razones

  • Para aumentar el rendimiento.

  • Mantener la integridad de los procesos comerciales.

  • Utilizar transacciones distribuidas.

Un punto de guardado marca un punto al que se puede revertir la transacción actual. En lugar de revertir todos sus cambios, puede optar por revertir solo algunos de ellos. Por ejemplo, suponga que

  • iniciar una transacción.

  • inserte 10 filas en una tabla.

  • establecer un punto de guardado.

  • inserte otras 5 filas.

  • retroceder al punto de guardado.

  • cometer la transacción.

Después de hacer esto, la tabla contendrá las primeras 10 filas que insertó. Las otras 5 filas habrán sido eliminadas por la reversión. Un punto de guardado es solo un marcador al que se puede revertir la transacción actual.

Los objetos SQLWarning son una subclase de SQLException que se ocupa de las advertencias de acceso a la base de datos. Las advertencias no detienen la ejecución de una aplicación, como lo hacen las excepciones. Simplemente alertan al usuario de que algo no sucedió según lo planeado. Se puede informar una advertencia en un objeto Connection, un objeto Statement (incluidos los objetos PreparedStatement y CallableStatement) o un objeto ResultSet. Cada una de estas clases tiene un método getWarnings.

El procesamiento por lotes le permite agrupar declaraciones SQL relacionadas en un lote y enviarlas con una llamada a la base de datos.

Las secuencias típicas de pasos para utilizar el procesamiento por lotes con el objeto Statement o PrepareStatement son

  • En caso de procesamiento por lotes utilizando el objeto PrepareStatement, cree sentencias SQL con marcadores de posición.

  • Cree un objeto Statement o PrepareStatement utilizando los métodos createStatement () o prepareStatement () respectivamente.

  • Establezca el compromiso automático en falso usando setAutoCommit ().

  • Agregue tantas sentencias SQL como desee al lote usando el método addBatch () en el objeto de declaración creado.

  • Ejecute todas las sentencias SQL usando el método executeBatch () en el objeto de sentencia creado.

  • Finalmente, confirme todos los cambios usando el método commit ().

Un procedimiento almacenado es un grupo de sentencias SQL que forman una unidad lógica y realizan una tarea en particular. Por ejemplo, las operaciones en una base de datos de empleados (contratación, despido, promoción, búsqueda) podrían codificarse como procedimientos almacenados ejecutados por código de aplicación. Los procedimientos almacenados se pueden llamar utilizando la clase CallableStatement en la API de JDBC. Por ejemplo, el siguiente código demuestra esto

CallableStatement cs = con.prepareCall("{call MY_SAMPLE_STORED_PROC}");
ResultSet rs = cs.executeQuery();

La sintaxis de escape le brinda la flexibilidad de utilizar funciones específicas de la base de datos que no están disponibles para usted mediante el uso de métodos y propiedades estándar de JDBC.

El formato de sintaxis de escape SQL general es el siguiente

{keyword 'parameters'}.

JDBC define secuencias de escape que contienen la sintaxis estándar para las siguientes funciones del lenguaje

  • Literales de fecha, hora y marca de tiempo (palabras clave d, t, ts).

  • Funciones escalares como funciones de conversión numéricas, de cadena y de tipo de datos (palabra clave fn).

  • Combinaciones externas (palabra clave oj)

  • Caracteres de escape para comodines utilizados en cláusulas LIKE (palabra clave de escape).

  • Llamadas a procedimiento (palabra clave de llamada).

Una transacción es una unidad lógica de trabajo. Para completar una unidad lógica de trabajo, es posible que sea necesario realizar varias acciones en una base de datos. Las transacciones se utilizan para proporcionar integridad de datos, semántica de aplicación correcta y una vista coherente de los datos durante el acceso simultáneo.

Siga los pasos a continuación

//turn off the implicit commit
Connection.setAutoCommit(false);
//..your insert/update/delete goes here
Connection.Commit();
//a new transaction is implicitly started.

Cuando se emite una solicitud de conexión, DriverManager pregunta a cada controlador cargado si comprende la URL enviada. Cuando la URL pasada no está construida correctamente, se devuelve el mensaje "No hay controlador adecuado".

  • boolean execute() - Ejecuta cualquier tipo de instrucción SQL.

  • ResultSet executeQuery()- Se utiliza generalmente para leer el contenido de la base de datos. La salida tendrá el formato ResultSet. Generalmente se usa la instrucción SELECT.

  • int executeUpdate()- Esto se usa generalmente para alterar las bases de datos. Generalmente, las instrucciones DROP TABLE o DATABASE, INSERT into TABLE, UPDATE TABLE, DELETE from TABLE se utilizarán en esto. La salida tendrá la forma de int, que denota el número de filas afectadas por la consulta.

Debe cerrar el conjunto de resultados, la declaración y la conexión. Si la conexión proviene de un grupo, cerrarla en realidad la envía de vuelta al grupo para su reutilización. Podemos hacer esto en el bloque finalmente {}, de modo que si se lanza una excepción, todavía tienes la oportunidad de cerrarla.

Estos se utilizan para almacenar una gran cantidad de datos en bases de datos como imágenes, películas, etc., que son de tamaño extremadamente grande.

Cada proveedor de base de datos proporciona la implementación de ResultSet y otras interfaces, a través del controlador.

La agrupación de conexiones es una técnica que se utiliza para reutilizar conexiones físicas y reducir la sobrecarga de su aplicación. La funcionalidad de agrupación de conexiones minimiza las costosas operaciones en la creación y el cierre de sesiones. El proveedor de la base de datos ayuda a varios clientes a compartir un conjunto de objetos de conexión en caché que proporciona acceso a una base de datos. Los clientes no necesitan crear una nueva conexión cada vez que interactúan con la base de datos.

Si usa un servidor de aplicaciones como WebLogic, WebSphere, jBoss, Tomcat. , su servidor de aplicaciones proporciona las funciones para configurar la agrupación de conexiones. Si no está utilizando un servidor de aplicaciones, se pueden utilizar componentes como Apache Commons DBCP Component.

java.sql.Blob tiene un mejor rendimiento ya que no extrae ningún dato de la base de datos hasta que se lo solicite explícitamente.

java.sql.Clob tiene un mejor rendimiento ya que no extrae ningún dato de la base de datos hasta que usted lo solicite explícitamente.

Utilice el método Statement.setFetchSize para indicar el tamaño de cada búsqueda de base de datos.

Class.forName ("MyClass")

  • Carga la clase MyClass.

  • Ejecute cualquier código de bloque estático de MyClass.

  • Devuelve una instancia de MyClass.

No, no es así. Una declaración de importación le dice al compilador qué clase buscar. Class.forName () indica a Classclass que busque un cargador de clases y cargue ese objeto Class en particular en la memoria utilizada por la JVM.

La simultaneidad de ResultSet determina si el ResultSet se puede actualizar o solo leer. Un ResultSet puede tener uno de dos niveles de simultaneidad

  • ResultSet.CONCUR_READ_ONLY - significa que el ResultSet solo se puede leer.

  • ResultSet.CONCUR_UPDATABLE - significa que el ResultSet se puede leer y actualizar.

La diferencia entre setFetchSize (int) y setMaxRow (int) son

  • setFetchSize (int) define el número de filas que se leerán de la base de datos cuando el ResultSet necesite más filas. setFetchSize (int) afecta cómo la base de datos devuelve los datos de ResultSet.

  • El método setMaxRows (int) del ResultSet especifica cuántas filas puede contener un ResultSet a la vez. setMaxRows (int) afecta al objeto JDBC del lado del cliente.

Un objeto JDBC RowSet contiene datos tabulares de una manera que los hace más flexibles y fáciles de usar que un conjunto de resultados. Los objetos RowSet son componentes JavaBeans.

Hay dos tipos de RowSet

  • ConnectedUn objeto RowSet conectado es de naturaleza permanente. No termina hasta que se termina la aplicación.

  • DisconnectedUn objeto RowSet desconectado es de naturaleza ad-hoc. Siempre que requiera recuperar datos de la base de datos, establece la conexión y la cierra al finalizar la tarea requerida. Los datos que se modifican durante el estado desconectado se actualizan después de que se restablece la conexión.

En las transacciones típicas de bases de datos, digamos que una transacción lee y cambia el valor mientras que la segunda transacción lee el valor antes de comprometerse o retroceder por la primera transacción. Este proceso de lectura se denomina "lectura sucia". Porque siempre existe la posibilidad de que la primera transacción revierta el cambio que hace que la segunda transacción lea un valor no válido.

TRANSACTION_READ_COMMITTED evita las lecturas sucias.

La API de JDBC tiene dos interfaces de metadatos DatabaseMetaData y ResultSetMetaData. Los metadatos proporcionan información completa sobre la base de datos en su conjunto. Los proveedores de controladores de bases de datos implementan la implementación de estas interfaces para que los usuarios conozcan las capacidades de una base de datos.

Siga los pasos a continuación

Primero configure la nueva fuente de datos ODBC. Vaya a Herramientas administrativas -> Fuentes de datos (ODBC) -> Pestaña DSN del sistema -> Agregar -> Controlador de Microsoft Excel (*. Xls) -> Finalizar. Ahora proporcione el nombre de la fuente de datos (SampleExcel) y la descripción. A continuación, haga clic en Seleccionar libro de trabajo y apunte a su hoja de Excel.

En el código, realice las siguientes adiciones al código

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbcodbcSampleExcel","","");
stmt = conn.createStatement();
sql = "select * from [Sheet1$]";
rs=stmt.executeQuery(sql);

Donde Sheet1 es el nombre de la hoja de Excel.

  • Hibernate es una herramienta de mapeo relacional de objetos. Asigna objetos a datos relacionales.

  • La interfaz de directorio y nombres de Java (JNDI) es una API para acceder a diferentes servicios de directorio y nombres. Lo usa para acceder a algo almacenado en un directorio o servicio de nombres sin tener que codificar específicamente ese servicio de nombres o directorios.

  • La API de Java DataBase Connectivity (JDBC) es una API para acceder a diferentes bases de datos relacionales. Lo usa para acceder a bases de datos relacionales sin incrustar una dependencia de un tipo de base de datos específico en su código.