Red de conocimiento informático - Aprendizaje de programación - Nuevas funciones en Java SE 6: Java DB&n

Nuevas funciones en Java SE 6: Java DB&n

A finales de año, Sun lanzó la versión oficial final de Java Standard Edition (Java SE) con nombre en código Mustang. En comparación con Tiger (Java SE), Mustang tiene una buena mejora en rendimiento y Tiger en el. Biblioteca API. Aunque las nuevas características de Mustang en la biblioteca API no son demasiadas, también proporciona muchas funciones prácticas y convenientes. Hay buenas características nuevas en scripts, servicios web, compiladores XML, bases de datos API, redes JMX y mejoras de funciones. de artículos presenta principalmente algunas de las nuevas características de Java SE en la biblioteca API. A través de algunos ejemplos y explicaciones, ayuda a los desarrolladores a utilizar mejor Java SE en la práctica de programación para mejorar la eficiencia del desarrollo.

Este artículo es el primero en. una serie de artículos El segundo artículo presenta las nuevas características de Java SE en la programación de bases de datos

Base de datos Java DB en Java

Los programadores que hayan instalado recientemente JDK pueden encontrar esto además del. bin jre tradicional, etc. El directorio JDK ha agregado un nuevo directorio llamado db. Este es un nuevo miembro de Java. Java DB es una implementación Java pura de un sistema de gestión de bases de datos de código abierto (DBMS). nombre de Apache Software Foundation (ASF) Solo tiene un tamaño de MB pequeño en comparación con las bases de datos que pueden alcanzar fácilmente los GB, pero esto no impide que Derby sea completamente funcional y admita las funciones requeridas por casi la mayoría de las aplicaciones de bases de datos. Aún más valioso es que, gracias al fuerte poder comunitario de ASF, Derby ha obtenido el apoyo de IBM y Sun, etc. Con el apoyo de importantes empresas y programadores destacados de todo el mundo, no es de extrañar que Sun elija su versión para incluirla. en el JDK como una base de datos integrada, esto es como inyectar una nueva vitalidad en el JDK. Los programadores de Java ya no necesitan gastar mucha energía para instalar y configurar una base de datos, lo que permite una programación de base de datos estándar, segura y fácil de usar. En este capítulo echaremos un primer vistazo al mundo de Java DB y exploraremos cómo usarlo para escribir programas ricos en funciones

Hola Java DB Derby en modo integrado

<. /p>

Ahora que tenemos una base de datos integrada, comencemos con un ejemplo simple (el código aparece en la lista) e intentemos usarlo. Este programa hace lo que la mayoría de las aplicaciones de bases de datos podrían hacer. llamado helloDB en el DBMS, crea una tabla de datos llamada hellotable, inserta dos datos en la tabla y luego consulta los datos y muestra los resultados, imprime en la consola y finalmente elimina la tabla y la base de datos para liberar recursos.

Lista de código HelloJavaDB

public class HelloJavaDB { public static void main(String[] args) { try { // carga el controlador Class forName( apache derby jdbc EmbeddedDriver ) newInstance(); println(Carga el controlador integrado Conexión conn = null Propiedades props = new);

Propiedades(); props put(usuario usuario); props put(contraseña usuario); //crea y conecta la base de datos llamada helloDB conn=DriverManager getConnection(jdbc:derby:helloDB;create=true props println(create and); conectarse a helloDB); conn setAutoCommit(false); // crear una tabla e insertar o registros Declaración s = conn createStatement(); s ejecutar (crear tabla hellotable(nombre varchar() puntuación int)); holatable); s ejecutar (insertar en valores de holatable (Ruth Cao)); s ejecutar (insertar en valores de holatable (Flora Shi)); puntuación); Sistema fuera println( nombre\t\tscore ); while(rs next()) { Constructor StringBuilder = new StringBuilder(rs getString( )); System out println(builder toString()); // elimina la tabla s ejecutar( drop table hellotable ); System out println( Tabla eliminada rs close(); y declaración); mit(); conn close(); Sistema fuera println( Transacción confirmada y conexión cerrada ); ) { El sistema sale println( La base de datos se cierra normalmente } } catch (Throwable e) { // maneja la excepción } El sistema sale println();

SimpleApp terminado); }}

Luego escribimos el siguiente comando en la línea de comando (este ejemplo es para la plataforma Windows, pero otros sistemas se pueden modificar ligeramente)

Ejecute HelloJavaDB. comando en la lista

java –cp; JAVA_HOME\db\lib\derby jar HelloJavaDB

El programa se ejecutará como esperábamos. La imagen es una captura de pantalla de parte del resultado de la ejecución.

El resultado de la ejecución del programa HelloJavaDB

El programa anterior no es diferente del anterior. La diferencia es que ya no necesitamos preocuparnos por la configuración del DBMS porque Derby. ha creado automáticamente un nuevo directorio llamado helloDB en el directorio actual. Todo lo que necesita hacer para almacenar físicamente datos y registros es prestar atención al problema de nombres. El nombre del controlador en modo integrado debe ser apache derby jdbc EmbeddedDriver. una nueva base de datos, debe agregar create=true después del protocolo. Además, cierre todas las bases de datos y podrá utilizar el motor Derby. El siguiente código

Lista cierra todas las bases de datos y motores Derby

DriverManager getConnection(jdbc:derby:;shutdown=true);

Si solo desea cerrar una base de datos, puede llamar a

Manifest para cerrar una base de datos.

DriverManager getConnection(jdbc:derby:helloDB;shutdown=true);

De esta manera, utilice el modo integrado de mantenimiento Derby y el costo de administrar una base de datos es cercano a esto, lo que Es una buena noticia para las personas que quieren concentrarse en escribir código. Sin embargo, algunas personas no pueden evitar preguntarse por qué la mayoría de los DBMS no adoptan ese modo ya que existe un modo integrado. Hagamos un pequeño experimento cuando ejecutamos el programa HelloJavaDB en dos ventanas de línea de comando al mismo tiempo, el resultado de una es el mismo que antes, pero la otra tiene un error como se muestra en la figura.

Limitaciones del modo en línea

El motivo del error es en realidad muy simple. Cuando se utiliza el modo integrado, Derby no se ejecutará en un proceso separado sino que se ejecutará junto con la aplicación en la misma máquina virtual Java. (JVM) Por lo tanto, Derby es como una aplicación. Los otros archivos jar utilizados también pasan a formar parte de la aplicación. No es difícil entender por qué nuestro programa de muestra puede ejecutarse sin problemas agregando el archivo jar derby al classpath. que solo una JVM puede iniciar la base de datos y dos aplicaciones ejecutadas en diferentes instancias de JVM naturalmente no pueden acceder a la misma base de datos

En vista de las limitaciones anteriores y la necesidad de múltiples conexiones desde diferentes JVM para acceder a una base de datos, la La siguiente sección presentará otro aspecto de Derby. Servidor de red monomodo (Servidor Neork)

Modo de servidor de red

Como se mencionó anteriormente, el modo de servidor de red es un modo cliente/servidor más tradicional. Necesitamos iniciar un Derby. El servidor de red se utiliza para manejar las solicitudes de los clientes, ya sea que estas solicitudes provengan de la misma instancia de JVM o de otra máquina en la red. Al mismo tiempo, el cliente usa DRDA (Arquitectura de base de datos relacional distribuida). protocolo para conectarse al servidor. Este es un ejemplo proporcionado por The Ope.

El diagrama estándar de interacción de la base de datos recomendado por n Group ilustra la estructura general de este modo

Debido a los esfuerzos de los desarrolladores de Derby para reducir la diferencia entre el modo de servidor de red y el modo integrado, solo necesitamos simplemente modificar El programa en la lista se puede implementar. Como se muestra en la lista, hemos agregado una nueva función y algunas variables de cadena a HelloJavaDB. No es difícil ver que el nuevo código solo cambia algunas cadenas señaladas específicamente en la sección anterior. Clase de controlador Para apache derby jdbc ClientDriver, el protocolo para conectarse a la base de datos es jdbc: derby://localhost: / Esta es una cadena similar a una URL. De hecho, el formato de conexión del cliente de red Derby es jdbc: derby. ://server[ :port]/databaseName[;attributeKey=value] En este ejemplo utilizamos la máquina local más simple como servidor y el puerto es el puerto predeterminado de Derby

Figura Arquitectura del modo de servidor de red Derby

 

HelloJavaDB en modo de servidor web manifiesto

public class HelloJavaDB { controlador de cadena estática pública = apache derby jdbc EmbeddedDriver; = jdbc: derby: ; public static void main(String[] args) { // igual que antes } private static void parseArguments(String[] args) { if (args length == || args length gt; ) { return; } if (args[ ] equalsIgnoreCase( derbyclient )) { framework = derbyclient; driver = apache derby jdbc ClientDriver; protocolo = jdbc:derby://localhost:/; es Si no es suficiente, también necesitamos iniciar el servidor de red. La clase que controla el servidor de red en Derby es apache derby drda NeorkServerControl. Si desea saber más sobre NeorkServerControl, simplemente elimine el inicio. parámetro y puede ver la información de ayuda sobre el servidor de red. La implementación está incluida en el jar derbynet mediante Derby

Manifiesto para iniciar el servidor de red

java cp; Files\Java\jdk \db\lib\derby jar; C:\ Program Files\Java\jdk \db\lib\derbynet jar apache derby drda NeorkServerControl start

La implementación del cliente de red correspondiente se incluye en el jar derbyclient, por lo que solo necesita agregar el archivo jar al classpath

El cliente modificado puede leer los datos sin problemas. Intente usar dos ventanas de línea de comando para conectarse a la base de datos nuevamente y obtener el resultado correcto. Si el servidor ya no es necesario, use el parámetro de apagado de NeorkServerControl para apagar el servidor. p> Más

Este artículo presenta Java DB (Derby), un nuevo miembro de Java SE, y también presenta cómo usar Java DB en modo integrado y en modo de servidor de red. Para probarlo, puede encontrar opciones más avanzadas en la documentación de Sun y Derby. Al final de este capítulo, presentaremos brevemente algunos dispositivos de Java DB para acelerar el desarrollo. Todos se encuentran en el paquete de herramientas de Apache Derby. necesita obtener información durante el proceso de desarrollo o las pruebas pueden usar ij, una herramienta para ejecutar scripts SQL, dblook, una herramienta de extracción de esquemas para bases de datos Derby, una herramienta para generar DDL, sysinfo, una clase de herramienta para mostrar información del sistema y Derby. p>

Nuevas funciones de JDBC y nuevas API

Si el capítulo anterior introdujo un nuevo miembro en Java que ya existía pero que no se agregó a JDK, entonces en este capítulo nos centraremos en las nuevas características que tiene. se han agregado a JDBC y su correspondiente Nueva API

Carga automática de controladores

Escribir programas JDBC antes de JDBC requiere agregar el siguiente código algo feo

Lista de JDBC registrados drivers

p>

 Class forName(apache derby jdbc EmbeddedDriver) newInstance();

El mecanismo de implementación interno de Java sql DriverManager determina que dicho código solo puede aparecer buscando primero el archivo de clase. del controlador específico a través de Class forName DriverManager getConnection Este código agrega una carga innecesaria a los programas de escritura. Los desarrolladores de JDK también son conscientes de esto, las aplicaciones ya no necesitan cargar controladores explícitamente para poder realizar esta tarea automáticamente. Como experimento, podemos eliminar el código relevante en la lista, recompilarlo y ejecutarlo en JRE. El resultado será el mismo que el del programa original.

Los lectores curiosos pueden preguntar por qué DriverManager puede cargar Woolen automáticamente. ¿paño? Esto es gracias a un nuevo mecanismo llamado Proveedor de servicios. Los programadores que estén familiarizados con la programación de seguridad de Java pueden estar familiarizados con él, y ahora aparece en el módulo JDBC. La especificación JDBC estipula que todos los archivos jar del controlador JDBC deben contener un controlador SQL de Java. Se encuentra en el directorio META INF/services del archivo jar. Cada línea de este archivo describe una clase de controlador correspondiente. De hecho, la forma de escribir este archivo y escribir una propiedad solo tiene palabras clave (clave) pero ningún valor (valor). ) El texto después del # en el archivo se considera un comentario. Con dicha descripción, DriverManager puede averiguar qué clases debe cargar desde los archivos de controlador actualmente en CLASSPATH si no tenemos ningún archivo de controlador JDBC. el CLASSPATH Descargar y borrar

El código de la lista generará un objeto de tipo sun jdbc odbc JdbcOdbcDriver. Explore el directorio JDK con atención. Este tipo es exactamente lo que se describe en el archivo del controlador java sql en el directorio META INF/services de JAVA_HOME/jre/lib/. jar de recursos. Se dice que este es el controlador predeterminado en el JDK. Si los desarrolladores quieren que DriverManager encuentre sus controladores, solo necesitan agregar los archivos jar correspondientes a CLASSPATH. Por supuesto, para esos archivos de controlador antes de JDBC. solo se puede cargar explícitamente localmente

Lista de controladores JDBC en la máquina local

Enumerationlt; drivers = DriverManager getDrivers(); while(drivers hasMoreElements()) { System out println( drivers nextElement());}

RowId

Las personas que están familiarizadas con DBMS grandes como DB Oracle no estarán ajenas al concepto de ROWID. Es una columna oculta en el. tabla de datos y es único para cada fila. El identificador indica la ubicación física o lógica de esta fila. Debido al uso generalizado del tipo ROWID, el tipo de datos java sql RowId se ha agregado a Java SE para permitir que los programas JDBC accedan a ella. Tipo ROWID en SQL Es cierto que no todos los DBMS admiten el tipo ROWID, incluso si admiten diferentes ROWID también tendrán diferentes ciclos de vida, por lo que es una buena experiencia práctica utilizar DatabaseMetaData getRowIdLifetime para determinar el ciclo de vida del tipo. Después de agregar el siguiente código al programa de lista para obtener la conexión, podemos comprender el estado de soporte del tipo ROWID. Consulte la lista para comprender el estado de soporte.

DatabaseMetaData meta = conn getMetaData(. ); System out println(meta getRowIdLifetime());

La especificación API de Java SE java sql RowIdLifetime estipula diferentes ciclos de vida ROWID_UNSUPPORTED ROWID_VALID_FOREVER ROWID_VALID_OTHER ROWID_VALID_SESSION y ROWID_VALID_TRANSACTION No es difícil entender literalmente que significan que ROWID no es ROWID siempre es válido, etc. Para obtener información específica, también puede consultar el JavaDoc correspondiente. Los lectores pueden intentar conectarse a Derby para realizar experimentos y encontrarán que el resultado de la ejecución es ROWID_UNSUPPORTED, es decir, Derby no admite ROWID.

Dado que se proporcionan nuevos tipos de datos, también se han agregado en Java algunas API nuevas correspondientes para obtener y actualizar el contenido de la tabla de datos. Al igual que otros tipos existentes, llame a get después de obtener ResultSet o CallableStatement. El código para el método /set/update para obtener/configurar/actualizar el ejemplo del objeto RowId se muestra en el listado

Lista de cómo obtener/configurar el objeto RowId

>

// Inicializa una declaración preparada pstmt = conexión prepareStatement( SELECCIONA la puntuación del nombre del ID de fila FROM hellotable WHERE ID de la fila = ? ); // Vincula el ID de la fila a la declaración preparada pstmt setRowId( ID de la fila // Ejecuta la declaraciónResultSet rset = pstmt ejecutarQuery(); ; // Listar los registros while(rs next()) { RowId id = rs getRowId( ); // obtener el objeto rowid inmutable String name = rs getString( ); p> En vista de las diferentes implementaciones de objetos RowID en diferentes DBMS, que generalmente no son portátiles entre diferentes fuentes de datos, la especificación API JDBC no recomienda sacar un objeto RowID de la conexión A y usarlo en la conexión B para evitar errores inexplicables. causado por diferencias en diferentes sistemas En cuanto a los programas DBMS como Derby que no admiten RowId, lanzarán directamente SQLFeatureNotSupportedException en el método setRowId

SQLXML

Introducción al estándar SQL SQL/XML Como. una extensión del estándar SQL, SQL/XML define cómo el lenguaje SQL interactúa con XML, cómo crear datos XML, cómo incrustar expresiones XQuery en declaraciones SQL, etc. Como parte de JDBC, Java agrega el tipo java sql SQLXML para JDBC Puede utilizar este tipo para inicializar y leer los datos XML almacenados. El método createSQLXML de Java SQL Connection puede crear un objeto SQLXML en blanco. Después de obtener este objeto, puede utilizar setString, setBinaryStream, setCharacterStream o setResult y otros métodos. datos XML representados. Tome setCharacterStream como ejemplo. Muestra cómo un objeto SQLXML obtiene el objeto Java io Writer y lee el contenido línea por línea del archivo XML externo para completar la inicialización.

La lista utiliza setCharacterStream. método para inicializar el objeto SQLXML

SQLXML xml = con createSQLXML(); Writerwriter = xml setCharacterStream(); BufferedReader lector = new BufferedReader(new FileReader(test String line= null); (línea = lector readLine() != null) { escritor escribir(línea );}

Debido a SQLXML

Los objetos pueden estar asociados con varios recursos externos y contener estos recursos dentro de una transacción. Para evitar que las aplicaciones se queden sin recursos, Java proporciona un método gratuito para liberar sus recursos. Aparecen diseños similares en java sql Array Clob. p> En cuanto a cómo usar SQLXML para interactuar con la base de datos, el método es muy similar a otros tipos. Puede consultar el ejemplo en la sección RowId y encontrar la construcción del método get/set/update correspondiente en SQLXML en la especificación API. de Java SE No volveremos a describir programas similares aquí

Mejora de SQLExcpetion

Antes de Java SE, no había más de tres tipos de excepción relacionados con JDBC. Esto parece ser insuficiente. Para describir las excepciones de bases de datos cada vez más complejas, los diseñadores de Java SE han realizado mejoras significativas en el sistema de excepciones SQLException basado en Java. Primero, SQLException implementó recientemente la interfaz de lista Throwablegt; programa, recorriendo así de manera concisa cada SQLException y sus causas potenciales (causa)

Lista de SQLException para cada bucle

// Java codecatch (Throwable e) { if (estanceof SQLException) { for (Throwable ex: (SQLException) e){ System err println(ex toString());

Esta figura muestra todo el sistema de excepciones SQLException, excepto las subclases de SQLException originales, la nueva excepción. Las clases en Java se dividen en SQLReoverableException SQLNonTransientException SQLTransientException Hay varias subclases en SQLNonTransientException y SQLTransientException que distinguen en detalle varias condiciones de error que pueden ocurrir en los programas JDBC. La mayoría de las subclases tendrán valores SQLState estándar correspondientes, que integran el estándar SQL y la biblioteca de clases Java. Bien combinados

Figura del sistema de excepción SQLException

Entre las muchas clases de excepción, la SQLFeatureNotSupportedException más común se usa para indicar que el controlador JDBC no es compatible. un determinado JDBC Por ejemplo, si ejecuta el programa en la lista en Derby, encontrará que el controlador Derby no admite la función RowId. También vale la pena mencionar que SQLClientInfoException se hereda directamente de SQLException y representa lo que sucede cuando algún cliente. las propiedades no se pueden configurar en una conexión de base de datos. Excepciones

Resumen de más características y perspectivas nuevas

En este artículo hemos presentado a los lectores algunas de las características nuevas más importantes de JDBC en Java. SE Incluyen Java DB integrado en JDK (Derby) y parte de JDBC. Por supuesto, hay muchas características nuevas que no se han cubierto en este artículo, como la adición de soporte para NCHAR NVARCHAR LONGNVA en el lenguaje SQL.

La compatibilidad con los tipos RCHAR y NCLOB proporciona métodos más flexibles y convenientes para administrar objetos Statement en un entorno de grupo de conexiones de base de datos lishixinzhi/Article/program/Java/JSP/201311/19343