Vous êtes sur la page 1sur 55

public List getUserTest(String username, String password) { List userList = new ArrayList();

Connection connection = null; String rstring = null; Statement stmt = null;///******* ResultSet resultSet = null; try { connection = dataSource.getConnection(); stmt = connection.createStatement();///******* resultSet = stmt.executeQuery("SELECT * FROM users WHERE (username)='" + username + "'" + "AND (password)='" + password + "'");///******* while (resultSet.next()) { UsersTest user = new UsersTest(); user.setId(resultSet.getString("id")); user.setUsername(resultSet.getString("username")); user.setPassword(resultSet.getString("password")); userList.add(user); }

} catch (SQLException e) { System.err.println(e); } finally { try { if (resultSet != null) { resultSet.close(); } if (stmt != null) { stmt.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) {

} } return } userList;

http://stackoverflow.com/questions/6852841/how-to-get-the-first-element-in-resultset

2.1 Conexin Informacin general Una Connection objeto representa una conexin con una base de datos. Una sesin de conexin incluye las sentencias SQL que se ejecutan y los resultados que se devuelven travs de esa conexin. Una nica aplicacin puede tener una o ms conexiones con una sola base de datos, o puede tener conexiones con muchas bases de datos diferentes. Un usuario puede obtener informacin sobre una Connection de base de datos del objeto mediante la invocacin del Connection.getMetaData mtodo. Este mtodo devuelve un DatabaseMetaData objeto que contiene informacin sobre las tablas de la base de datos, la gramtica SQL que soporta, sus procedimientos almacenados, las capacidades de esta conexin, y as sucesivamente. 2.1.1 Apertura de una conexin La forma tradicional de establecer una conexin con una base de datos es para llamar al mtodo DriverManager.getConnection . Este mtodo toma una cadena que contiene una direccin URL. El DriverManagerclase, conocida como la capa de gestin JDBC, intenta localizar un controlador que puede conectarse a la base de datos representada por esa URL. El DriverManager clase mantiene una lista de inscritos Driver clases, y cuando el mtodo getConnection que se llama, se comprueba con cada controlador en la lista hasta que encuentre uno que se puede conectar a la base de datos especificado en la URL. El Driver mtodo deconnect utiliza esta URL para establecer realmente la conexin. Un usuario puede pasar por alto la capa de gestin de JDBC y llamar Driver mtodos directamente. Esto podra ser til en el caso raro que dos

conductores pueden conectarse a una base de datos y el usuario desea seleccionar explcitamente un controlador particular. Normalmente, sin embargo, es mucho ms fcil dejar que el DriverManager mango clase apertura de una conexin. El siguiente cdigo es un ejemplo de la apertura de una conexin a una base de datos ubicado en la URL jdbc:odbc:wombat con un ID de usuario de oboy y 12Java como la contrasea:
String url = "jdbc: odbc: wombat"; Connection con = DriverManager.getConnection (url, "oboy", "12Java");

El JDBC 2.0 Standard Extension API proporciona el DataSource de interfaz como una alternativa a la DriverManager para establecer una conexin. Cuando un DataSource de clase se ha implementado adecuadamente, un DataSource objeto puede ser utilizado para producir Connection de objetos que participan en la agrupacin de conexiones y / o Connection los objetos que pueden participar en transacciones distribuidas. Vase el captulo "DataSource" para obtener ms informacin y ver el cdigo de ejemplo para crear una conexin con un DataSource de objetos. En este captulo se explica tambin por qu utilizar unDataSource objeto es la alternativa preferida para la creacin de una conexin. Una aplicacin utiliza una Connection objeto producido por un DataSource objeto esencialmente de la misma manera en que utiliza una Connection objeto producido por el DriverManager . Existen algunas diferencias, sin embargo. Si la Connection es objeto de una conexin agrupada, la solicitud debe incluir un finally bloque para asegurar que la conexin se cierra, incluso si se produce una excepcin. De esta manera una conexin vlida siempre se pondr de nuevo en la piscina de conexiones disponibles. Si una Connection objetos es parte de una transaccin distribuida, una aplicacin no debera llamar a los mtodos Connection.commit o Connection.rollback , ni debe activar el modo de confirmacin automtica de la conexin. Estos podran interferir con el manejo del gestor de transacciones de la transaccin distribuida. 2.1.2 URLs de uso general Cuando una aplicacin utiliza el DriverManager para crear una Connection objeto, debe proporcionar una direccin URL a la DriverManager.getConnection mtodo. Dado que las direcciones URL a menudo causan una cierta confusin, lo primero que le dar una breve explicacin de las direcciones URL, en general, y luego ir a la discusin de las direcciones URL de JDBC.

Un URL (Uniform Resource Locator) da informacin para la localizacin de un recurso en Internet. Se puede considerar como una direccin. La primera parte de una direccin URL especifica el protocolo utilizado para acceder a la informacin, y siempre es seguido por dos puntos. Algunos protocolos comunes son ftp , que especifica "protocolo de transferencia de archivos," y http , que especifica "Hypertext Transfer Protocol". Si el protocolo es file , se indica que el recurso est en un sistema de archivos local en lugar de en Internet.
ftp://javasoft.com/docs/JDK-1_apidocs.zip http://java.sun.com/products/JDK/CurrentRelease :/ home archivo / haroldw / docs / tutorial.html

El resto de la URL, todo despus de los primeros dos puntos, da informacin sobre dnde est la fuente de datos se encuentra. Si el protocolo es file , el resto de la URL es la ruta del archivo. Para los protocolos ftp yhttp , el resto de la URL identifica el host y, opcionalmente, pueden darle una ruta a un sitio ms especfico. Por ejemplo, aqu est la direccin URL de la pgina principal. Esta URL identifica solo al host:
http://www.java.sun.com

Al navegar en esta pgina, usted puede ir a muchas otras pginas, una de las cuales es la pgina principal de JDBC. La direccin URL de la pgina principal de JDBC es ms especfico y se parece a esto:
http://www.java.sun.com/products/jdbc

2.1.3 JDBC URL Una URL JDBC proporciona una forma de identificar una fuente de datos para que el controlador apropiado lo reconozca y establezca una conexin con l. Escritores de controladores son los que realmente determinan lo que la URL de JDBC que identifica a un conductor en particular ser. Los usuarios no necesitan preocuparse acerca de cmo formar un URL de JDBC, sino que basta con utilizar la direccin URL suministrada con los controladores que estn utilizando. Papel de JDBC es recomendar algunas convenciones para los escritores de controladores para seguir en la estructuracin de sus URL JDBC. Dado que las direcciones URL de JDBC se utilizan con diversos tipos de conductores, las convenciones son, por necesidad, muy flexible. En primer lugar, que permiten a los conductores diferentes de usar diferentes esquemas para

nombrar las bases de datos. El odbc subprotocolo, por ejemplo, permite la URL contienen valores de los atributos (pero no los requieren). En segundo lugar, las direcciones URL de JDBC permiten a los escritores de controladores para codificar toda la informacin de conexin necesaria entre ellos. Esto hace que sea posible, por ejemplo, para un applet que quiere hablar con una determinada base de datos para abrir la conexin de base de datos sin que el usuario a hacer cualquier tarea de administracin del sistema. En tercer lugar, las direcciones URL de JDBC permiten un nivel de direccionamiento indirecto. Esto significa que la URL de JDBC puede referirse a un sistema lgico o el nombre de base de datos que se traduce dinmicamente al nombre real de un sistema de nombres de red. Esto permite a los administradores del sistema para evitar la especificacin de los ejrcitos particulares, como parte del nombre JDBC. Hay un nmero de diferentes servicios de red nombre (como DNS, NIS y DCE), y no hay ninguna restriccin sobre cules pueden ser utilizados. La sintaxis estndar para las direcciones URL de JDBC se muestra aqu. Tiene tres partes, que estn separados por dos puntos.
jdbc: <subprotocol>: <subname>

Las tres partes de un URL de JDBC se desglosan de la siguiente manera: 1. 2. -el protocolo. El protocolo en una URL JDBC es siempre jdbc . <subprotocol> - el nombre del conductor o el nombre de un mecanismo de conectividad de base de datos, que puede ser apoyado por uno o ms conductores. Un ejemplo destacado de un nombre es subprotocolo odbc , que se ha reservado para las direcciones URL que especifican los nombres de ODBC de estilo de fuente de datos, por ejemplo, para acceder a una base de datos a travs de un puente JDBC-ODBC, se puede usar una URL como la siguiente.:
jdbc jdbc: odbc: Fred

3.

En este ejemplo, el subprotocolo es odbc , y el subnombre fred es un local de origen de datos ODBC. Si uno quiere usar un servicio de nombre de red (para que el nombre de base de datos en la URL JDBC no tiene por qu ser su nombre real), el servicio de nombres puede ser el subprotocolo. As, por ejemplo, uno podra tener una URL como:

jdbc: dcenaming: cuentas por pagar-

En este ejemplo, la URL especifica que el servicio DCE denominacin local debe resolver el nombre de base de datos de accounts-payable en una denominacin ms especfica que puede ser utilizado para conectarse a la base de datos real. 4. - una manera de identificar la fuente de datos. El subnombre puede variar, dependiendo del subprotocolo, y puede tener cualquier sintaxis interna del escritor conductor elige, incluyendo un subsubname.El punto de un subnombre es dar la informacin suficiente para localizar el origen de datos. En el ejemplo anterior, fred es suficiente porque ODBC proporciona el resto de la informacin. Un origen de datos en un servidor remoto requiere ms informacin, sin embargo. Si la fuente de datos es accesible a travs de Internet, por ejemplo, la direccin de red debe ser incluido en la URL de JDBC como parte de la subnombre y debe adherirse a la convencin estndar de nomenclatura siguiente URL:
<subname> //hostname:port/subsubname

5.

Suponiendo que dbnet es un protocolo para la conexin a un host en Internet, un URL de JDBC podra tener este aspecto:
jdbc: DBNeT :/ / wombat: 356/fred

2.1.4 El subprotocolo odbc El subprotocolo odbc es un caso especial. Se ha reservado para las direcciones URL que especifican ODBC al estilo de los nombres de origen de datos y tiene la particularidad de que permite cualquier nmero de valores de los atributos que se especificarn despus de la subnombre (el nombre de la fuente de datos). La sintaxis completa para el subprotocolo odbc es:
jdbc: odbc: <data-source-name> [; <attribute-name> <attribute-value> =] *

As, todos los siguientes son vlidos jdbc: odbc nombres:


jdbc: jdbc: jdbc: jdbc: odbc: odbc: odbc: odbc: qeor7 wombat wombat; CacheSize = 20; ExtensionCase = BAJA qeora; UID = KGH; PWD = fooey

2.1.5 Registrar los subprotocols

Un desarrollador de controladores puede reservar un nombre para ser utilizado como el subprotocolo en un URL de JDBC. Cuando el DriverManager clase presenta este nombre a su lista de inscritos, el controlador para el que se reserva este nombre debe reconocer y establecer una conexin con la base de datos que identifica. Por ejemplo, "odbc" se reserva para el puente JDBC-ODBC. Si hubiera un milagro de la Corporacin, es posible que desee registrar "milagro" como el subprotocolo para el controlador JDBC que se conecta a su DBMS Miracle, para que nadie ms podra utilizar ese nombre. Java Soft Ware est actuando como un registro informal para JDBC nombres subprotocolo. Para registrar un nombre de subprotocolo, enve un correo a:
jdbc@eng.sun.com

2.1.6 Envo de Sentencias de SQL Una vez que se establece una conexin, que se usa para pasar sentencias SQL a su base de datos subyacente. El API JDBC no pone ninguna restriccin sobre los tipos de sentencias SQL que se pueden enviar, lo que proporciona una gran flexibilidad, permitiendo el uso de determinadas bases de datos o incluso declaraciones de las declaraciones no son de SQL. Se requiere, sin embargo, que el usuario sea responsable de asegurarse de que la base de datos subyacente puede procesar las sentencias SQL que se envan y sufrir las consecuencias si no se puede. Por ejemplo, una aplicacin que intenta enviar una llamada al procedimiento almacenado a una DBMS que hace procedimientos almacenados no soporta no tendr xito y generar una excepcin. El API JDBC proporciona tres interfaces para el envo de las instrucciones SQL para la base de datos, y los mtodos correspondientes de la Connection interfaz de crear instancias de ellos. Las interfaces para el envo de sentencias SQL y los Connection mtodos que los crean son los siguientes: 1.
Statement

- creado por

los Connection.createStatement mtodos. Una Statement objeto se utiliza para enviar sentencias SQL sin parmetros. 2. PreparedStatement - creada por los Connection.prepareStatement los mtodos A. PreparedStatement objeto se utiliza para sentencias SQL precompiladas. stas pueden tomar uno o ms parmetros como argumentos de entrada (parmetros IN). PreparedStatement tiene un grupo de mtodos que establecen el valor de los parmetros IN, que se envan a la base de datos cuando se ejecuta la instruccin.PreparedStatement ampla Statement y por lo tanto

incluye Statement los mtodos. Un PreparedStatement objeto tiene el potencial de ser ms eficiente que una Statement objeto, ya que se ha precompilado y almacenado para su uso futuro. Por lo tanto, con el fin de mejorar el rendimiento, un PreparedStatement objeto se utiliza a veces para una sentencia SQL que se ejecuta muchas veces. 3. CallableStatement -creado por los Connection.prepareCall mtodos. CallableStatement objetos se utilizan para ejecutar procedimientos almacenados de SQL, un grupo de sentencias SQL que se llama por su nombre, al igual que la invocacin de una funcin. Un CallableStatement objeto hereda los mtodos para el manejo de los parmetros IN de PreparedStatement , sino que aade mtodos para el manejo de los parmetros OUT y INOUT. La siguiente lista nos da una manera rpida de determinar qu Connection mtodo es apropiado para la creacin de diferentes tipos de sentencias SQL:

mtodos-por una simple sentencia SQL (sin parmetros) prepareStatement mtodos-por una sentencia de SQL que se ejecuta con frecuencia
createStatement prepareCall

mtodos-por una llamada a un procedimiento almacenado

Las versiones de estos mtodos que no tienen argumentos crear instrucciones que se producen por defecto ResultSet objetos, es decir, que producen conjuntos de resultados que no son desplazables y que no se puede actualizar. Con la API de JDBC 2.0, es posible crear las declaraciones que se producen conjuntos de resultados que son desplazables y / o actualizar. Esto se hace mediante el uso de las nuevas versiones de los mtodoscreateStatement , prepareStatement y prepareCall que toman parmetros adicionales para especificar el tipo de conjunto de resultados y el nivel de concurrencia del conjunto de resultados se est creando. En el captulo 5 , "ResultSet", la seccin sobre los tipos de ResultSet objetos en la pgina 52 se explican los diferentes tipos de ResultSet objetos y las constantes que les especifique. La seccin "Tipos de concurrencia" en la pgina 53 hace lo mismo para los niveles de concurrencia. "crear diferentes tipos de conjuntos de resultados" en la pgina 55 se dan ejemplos de cmo crear ResultSet objetos utilizando las nuevas versiones de lasConnection mtodos para la creacin de los estados. 2.1.7 Operaciones

Una transaccin consiste en una o ms sentencias que se han ejecutado, terminado, a continuacin, ya sea cometido o se deshace. Cuando el mtodo commit o rollback se llama, la transaccin actual termina y empieza otro. En general, una nueva Connection objeto se encuentra en modo de confirmacin automtica por defecto, lo que significa que cuando una declaracin se ha completado, el mtodo commit se llam a esa declaracin de forma automtica. En este caso, ya que cada estado se compromete de forma individual, una transaccin consiste en una sola declaracin. Si modo de confirmacin automtica se ha desactivado, la transaccin no terminar hasta que el mtodo commit o rollback se llama explcitamente, por lo que se incluyen todas las declaraciones que han sido ejecutadas desde la ltima invocacin de cualquiera commit o rollback . En este segundo caso, todas las declaraciones de la transaccin se confirma o se deshace como un grupo. El inicio de una transaccin no requiere llamada explcita, sino que implcitamente se inici despus de desactivar el modo auto-commit o despus de llamar a los mtodos de commit o rollback el mtodo. commit hace permanentes los cambios de una instruccin SQL hace a una base de datos, y tambin libera todos los bloqueos en manos de la transaccin. El mtodo rollback , se descartarn los cambios. A veces, un usuario no desea que un cambio surta efecto a menos que otra lo hace tambin. Esto se puede lograr mediante la desactivacin de auto-commit y agrupando ambas actualizaciones en una transaccin. Si ambas actualizaciones tienen xito, entonces el commit se llama al mtodo, por lo que los efectos tanto de las actualizaciones permanentes, y si uno falla o no tanto, entonces la rollback se llama al mtodo, la restauracin de los valores que existan antes de que los cambios fueron ejecutados. La mayora de los drivers JDBC se admite transacciones. Para ser designado compatible con JDBC, un driver JDBC debe ser compatible con las transacciones. El JDBC 2.0 Standard Extension API hace posible Connection de objetos a ser parte de una transaccin distribuida, una transaccin que involucra a las conexiones a ms de un servidor DBMS. Cuando unaConnection objetos es parte de una transaccin distribuida, un administrador de transacciones determina el momento en los mtodos de commit o de rollback se llaman en ella. Por lo tanto, cuando una Connectionobjetos est participando en una transaccin distribuida, una aplicacin no debera hacer nada que afecte cuando una conexin comienza o termina.

Con el fin de poder participar en las transacciones distribuidas, una Connection objeto debe ser producida por un DataSource objeto que se ha implementado para trabajar con la infraestructura del servidor de nivel medio de la transaccin distribuida. A diferencia de Connection de objetos producidos por el DriverManager , una Connection objeto producido por un DataSource objeto tendr su modo de confirmacin automtica desactivada por defecto. Una aplicacin tpica de una DataSource objeto, por otro lado, producir Connection objetos que son exactamente los mismos que los producidos por el DriverManager clase. 2.1.8 Niveles de aislamiento de transaccin Si un DBMS soporta el procesamiento de transacciones, tendr alguna forma de gestionar los posibles conflictos que pueden surgir cuando dos transacciones estn operando sobre una base de datos, al mismo tiempo. Un usuario puede especificar un nivel de aislamiento de transaccin para indicar qu nivel de cuidado que el DBMS debe ejercer en la resolucin de posibles conflictos. Por ejemplo, qu sucede cuando una transaccin cambia un valor y una segunda transaccin lee ese valor antes de que el cambio se ha cometido o se deshace? En caso de que se permita, teniendo en cuenta que el valor cambiado ledo por la segunda operacin no ser vlida si la primera transaccin se deshace? Un usuario JDBC puede instruir a la DBMS para permitir que un valor para ser ledo antes de que se ha cometido (una "lectura sucia") con el siguiente cdigo, donde con es la conexin actual:
con.setTransactionIsolation (TRANSACTION_READ_UNCOMMITTED);

Cuanto ms alto sea el nivel de aislamiento, ms cuidado se toma para evitar conflictos. La Connection interfaz define cinco niveles, con el menor que se especifica que las transacciones no son compatibles en absoluto y ms alto que se especifica que, mientras que una transaccin est operando sobre una base de datos, ninguna otra transacciones pueden realizar cambios en los datos ledos por esa transaccin.TRANSACTION_READ_UNCOMMITTED , que se utiliza en el ejemplo anterior, un nivel por encima del nivel ms bajo. Por lo general, cuanto mayor sea el nivel de aislamiento, ms lento se ejecuta la aplicacin (debido a la sobrecarga de bloqueos aumento y disminucin de la concurrencia entre los usuarios). El desarrollador debe equilibrar la necesidad de rendimiento con la necesidad de coherencia de los datos al tomar una decisin acerca de lo que el nivel de aislamiento de utilizar. Por supuesto, el nivel que en realidad puede ser apoyada depende de las capacidades del DBMS subyacente.

Cuando una nueva Connection se crea el objeto, su nivel de aislamiento de la transaccin depende del controlador, pero normalmente es el valor predeterminado para el origen de datos subyacente. Un usuario puede llamar al mtodo setIsolationLevel para cambiar el nivel de aislamiento, y el nuevo nivel estar en vigor durante el resto de la sesin de conexin. Para cambiar el nivel de aislamiento de transaccin para una sola transaccin, hay que ponerlo antes de ejecutar cualquier declaracin en la transaccin y luego se restablece despus de la transaccin termina. Cambiar el nivel de aislamiento de la transaccin durante una transaccin, no se recomienda, ya que dar lugar a una inmediata llame al mtodo commit , provocando los cambios hasta el momento que se hizo permanente. 2.1.9 La liberacin de los recursos DBMS Se recomienda que los programadores de forma explcita cerrar las conexiones y las declaraciones que han creado cuando ya no son necesarios. Un programador de escribir cdigo en el lenguaje de programacin Java y no utilizar los recursos externos que no tiene por qu preocuparse por la gestin de memoria. El recolector de basura elimina automticamente los objetos cuando ya no se utiliza y libera la memoria que estaba utilizando. Cuando la memoria se est agotando, se va a reciclar objetos desechados, por lo que la memoria que ocupan actualmente disponible para su reutilizacin rpida. Sin embargo, si una aplicacin utiliza recursos externos, como lo hace cuando tiene acceso a un DBMS con la API de JDBC, el recolector de basura no tiene manera de saber el estado de esos recursos. Seguir reciclar objetos desechados, pero si hay mucha memoria libre en la pila de Java, puede recoger la basura con frecuencia, a pesar de la cantidad (pequea) de basura de Java mantiene abierto grandes cantidades de recursos de bases de datos costosos. Por lo tanto, es recomienda que los programadores de forma explcita cerrar todas las conexiones (con el mtodo Connection.close ) y declaraciones (con el mtodo Statement.close ) tan pronto como ya no son necesarios, lo que libera recursos DBMS tan pronto como sea posible. Esto se aplica especialmente a las aplicaciones que tienen la intencin de trabajar con DBMS diferentes debido a las variaciones de un DBMS a otro. Tenga en cuenta que el mtodo Connection.isClosed est garantizada para volver true slo cuando se le llama despus de que el mtodo de Connection.close ha sido llamado. Como resultado, un programador no puede depender de este mtodo para indicar si una conexin es vlida o no. En cambio, un tpico cliente JDBC puede determinar que una conexin no es vlida por la

captura de la excepcin que se produce cuando una operacin de JDBC se intenta. 2.1.10 Uso de Mapas de tipo Los dos nuevos tipos SQL3 de datos que son tipos definidos por el usuario (UDT), los tipos de SQL estructurados y DISTINCT tipos, puede ser por encargo asignado a una clase en el lenguaje de programacin Java. Al igual que todos los tipos de datos SQL3, que tienen asignaciones estndar, pero un programador puede crear una asignacin personalizada, as. El hecho de que existe una asignacin personalizada de un UDT particular, se declara en un java.util.Map objeto. Este Map objeto puede ser el que est asociado con una conexin, o puede ser una que se pasa a un mtodo. Un programador declara una asignacin personalizada aadiendo una entrada a un Map de objetos. Esta entrada debe contener dos cosas: (1) el nombre de la UDT que se asignan y (2) la Class de objeto para la clase en el lenguaje de programacin Java a la que la UDT se va a asignar. La clase en s, que debe implementar el SQLData interfaz, contendr las asignaciones especficas. Cada Connection objeto creado usando un driver JDBC 2.0 que admite la asignacin personalizado tendr un tipo de mapa vaca a la que las asignaciones personalizadas, pueden agregarse. Este tipo de mapa es una instancia de la interfaz java.util.Map , que es nuevo en la plataforma Java 2 y reemplaza java.util.Dictionary. Hasta entradas personalizadas mapa se aaden a este tipo de mapa, todas las operaciones paraSTRUCT y DISTINCT valores utilizar las asignaciones estndar (el Struct de interfaz para STRUCT los valores y el tipo de base de DISTINCT valores). El siguiente fragmento de cdigo, en el que con una Connection objeto y ADDRESSES es un tipo estructurado de SQL, muestra cmo se recupera el tipo de mapa asociado con y aadir una nueva entrada a la misma.Despus de que el tipo de mapa se modifica, se establece como el mapa de nuevo tipo de estafa.
Mapa java.util.Map = con.getTypeMap (); map.put ("SchemaName.ADDRESSES", Class.forName ("Direcciones")); con.setTypeMap ();

El Map mapa de objetos, el tipo de mapa asociado con en contra, ahora contiene al menos una asignacin personalizada (o ms si las asignaciones ya se han agregado). El programador se han creado previamente las clasesAddresses , probablemente est utilizando una herramienta para generarlo. Tenga en cuenta que es un error para proporcionar una clase que no implementa la

interfaz SQLData . Las clases Addresses , lo que pone en prctica SQLData , tendrn un campo para cada atributo en ADDRESSES , y cada vez que un valor de tipo ADDRESSES es operado por un mtodo en el lenguaje de programacin Java, el valor por defecto ser para asignar a una instancia de la clase Addresses . El tipo de mapa asociado a una conexin es el tipo de mapa predeterminado en el sentido de que un mtodo va a usar si no hay mapa de otro tipo se pasa explcitamente a ella. Tenga en cuenta que el nombre de la UDT debe ser el nombre completo. Para algunos DBMS, esto ser de la forma catalogName.schemaName.UDTName. DBMS Muchos, sin embargo, no utilice este formulario y, por ejemplo, utilizar un nombre de esquema, pero no el nombre de catlogo. Lo importante es utilizar la forma apropiada para un determinado DBMS. informacin sobre los catlogos de un DBMS, los esquemas, los trminos preferidos, y el separador que utiliza. En lugar de modificar el tipo de mapa existente, una aplicacin puede reemplazarlo con un mapa tipo completamente diferente. Esto se hace con la Connection mtodo setTypeMap , como se muestra en la siguiente fragmento de cdigo. Se crea un mapa de nuevo tipo, le da dos entradas (cada una con un nombre de UDT SQL y la clase a la que los valores de ese tipo debe ser mapeada), y luego instala el mapa de nuevo tipo como el asociado a la Connection con.
java.util.Map newConnectionMap = new java.util.Hashtable (); newConnectionMap.put ( "SchemaName.UDTName1", Class.forName ("className1")); newConnectionMap.put ( "SchemaName.UDTName2", Class.forName ("className2")); con.setTypeMap (newConnectionMap);

El Map objeto newConnectionMap reemplaza ahora el tipo de mapa asociada originalmente con la Connection en contra, y se utiliza para las asignaciones de tipos personalizados a menos que sea a su vez reemplazado.Tenga en cuenta que el ejemplo se utiliza el constructor predeterminado para la clase HashTable para crear el mapa de nuevo tipo. Esta clase es una de las muchas implementaciones de java.util.Map previstas en la plataforma Java 2 del API, y uno de los otros podran haber sido utilizados tambin. En los ejemplos anteriores, el mapa tipo asociado con una conexin fue modificado para contener asignaciones adicionales o configurado para ser un mapa tipo completamente diferente. En cualquier caso, sin embargo, el mapa de la conexin tipo es el valor predeterminado para los tipos de mapas personalizados de JDBC a tipos en el lenguaje de programacin Java. El

siguiente ejemplo muestra cmo reemplazar el mapa de la conexin de tipo mediante el suministro de un mtodo con un tipo de mapa diferente. Mtodos cuya implementacin puede implicar una asignacin personalizada para los UDT tiene dos versiones, una que toma un tipo de mapa y una que no lo hace. Si un mapa tipo se pasa a uno de estos mtodos, el mapa tipo dado se utiliza en lugar del uno asociado a la conexin. Por ejemplo, la Array mtodos getArray y getResultSet tienen versiones que toman un tipo de mapa y las versiones de que no lo hacen. Si un mapa tipo se pasa a un mtodo, se asignan los elementos de la matriz utilizando el mapa tipo dado. Si no hay ningn tipo de mapa se especifica, el mtodo a utilizar el tipo de mapa asociado a la conexin. La capacidad para suministrar un tipo de mapa a un mtodo hace posible que los valores de la misma definido por el usuario tipo de tener diferentes asignaciones. Por ejemplo, si dos aplicaciones estn utilizando la misma conexin y de funcionamiento en el valor de la misma columna, se podra utilizar el tipo de mapa asociado a la conexin, y el otro podra utilizar un mapa diverso tipo mediante el suministro como un argumento para el mtodo apropiado. El siguiente fragmento de cdigo crea un mapa de nuevo tipo y se lo proporciona como un parmetro a la Array mtodo de getArray .
arrayMap java.util.Map java.util.Hashtable = new (); arrayMap.put ("SchemaName.DIMENSIONS", Class.forName ("Dimensiones")); Dimensiones [] D = (Dimensiones []) array.getArray (arrayMap);

En la segunda lnea, el nuevo tipo de mapa arrayMap se da una entrada con el nombre completo de un tipo estructurado de SQL ( SchemaName.DIMENSIONS) y el Java de clase de objeto (Class.forName("Dimensions")) . Esto establece la correspondencia entre el tipo Java Dimensions y el tipo SQL DIMENSIONS . En la tercera lnea, arrayMap se especifica como el tipo de mapa que se utilizar para la cartografa de los contenidos de esta Array objeto, cuyo tipo base es SchemaName.DIMENSIONS . El mtodo getArray se materialicen los elementos de la SQL3 ARRAY valor designado por la matriz, con cada elemento que se asigna de acuerdo a la asignacin especificada en arrayMap. En otras palabras, cada elemento, que es un valor de tipo Schema.DIMENSIONS , se traduce en una instancia de la clase Dimensions mediante la asignacin de los atributos de cada DIMENSIONS valor a los campos de una Dimensions del objeto. Si el tipo base de la matriz no coincide con el nombre en arrayMap UDT, el conductor se convertir elementos de la matriz de acuerdo con el mapeo estndar. Si no hay

ningn tipo de mapa se especifica el mtodogetArray , el controlador utiliza la cartografa se indica en el tipo de mapa de la conexin. Si ese tipo de mapa tiene ninguna entrada para Schema.DIMENSIONS , el controlador usar en su lugar la proyeccin estndar.

DriverManager 3.1 Vista general El DriverManager clase es la capa de gestin tradicional de JDBC, trabajando entre el usuario y los controladores. Se realiza un seguimiento de los controladores que estn disponibles y se encarga de establecer una conexin entre una base de datos y el controlador apropiado. Adems, el DriverManager clase se ocupa de cosas como los lmites de tiempo de inicio de sesin del controlador y la impresin de registro y mensajes de seguimiento. Tenga en cuenta que la javax.sql paquete, tambin conocido como el estndar JDBC 2.0 API de extensin, constituye el DataSource de interfaz, como un medio alternativo y preferido de la conexin a un origen de datos. Sin embargo, el DriverManager instalacin todava se puede utilizar con los controladores que soportan DataSource implementaciones. Para aplicaciones simples, el nico mtodo en el DriverManager clase que un programador en general tiene que utilizar directamente es DriverManager.getConnection . Como su nombre indica, este mtodo establece una conexin con una base de datos. Una aplicacin puede llamar a la DriverManager mtodos getDriver , getDrivers y registerDriver as como el Driver mtodo de connect , pero en la mayora de los casos es mejor dejar que el DriverManager clase de administrar los detalles de establecer una conexin. 3.1.1 Mantener un registro de los controladores

El DriverManager clase mantiene una lista de Driver clases que se hayan registrado mediante una llamada al mtodo de DriverManager.registerDriver . Todos los Driver clases deben ser escritos con una seccin esttica (un inicializador esttico) que crea una instancia de la clase y la registra con el DriverManager clase cuando est cargado. De este modo, un usuario que normalmente no se llamaraDriverManager.registerDriver directamente, sino que se debe llamar de forma automtica por un Driver de clase cuando est cargado. Un Driver clase se carga, y por lo tanto automticamente registrado con elDriverManager , en una de dos maneras: 1. llamando al mtodo Class.forName . Esta carga explcitamente la clase del controlador. Puesto que no depende de ninguna configuracin externa, esta forma de cargar un controlador es el recomendado para el uso del DriverManager marco. El cdigo siguiente, se carga la clase acme.db.Driver :
2. Class.forName ("acme.db.Driver");

Si acme.db.Driver se ha escrito de manera que la carga que provoca una instancia que se crea y se pide tambin DriverManager.registerDriver a esa instancia como parmetro (como debe hacer), entonces es en el DriverManager lista 's de los conductores y disponible para la creacin de una conexin. 3. agregando el Driver de clase para los java.lang.System propiedad jdbc.drivers . Esta es una lista de nombres de clases de controladores, separados por dos puntos, que los DriverManager clase de cargas. Cuando el DriverManager clase es inicializada, lo busca en el sistema de propiedad " jdbc.drivers , "y si el usuario ha introducido uno o ms conductores, los DriverManager intentos de la clase para cargarlos. El cdigo siguiente muestra cmo un programador puede entrar en tres clases de controlador en ~ / .hotjava / propiedades (HotJava los carga en la lista de propiedades del sistema en el arranque):
jdbc.drivers = foo.bah.Driver: wombat.sql.Driver: bad.test.ourDriver

La primera llamada a un DriverManager mtodo automticamente har que estas clases de controladores que se cargan. Tenga en cuenta que esta segunda forma de los conductores de carga requiere un entorno predefinido que es persistente. Si hay alguna duda al respecto es el caso, lo ms seguro es llamar al mtodo Class.forName para cargar explcitamente a

cada conductor. Este es tambin el mtodo correcto a utilizar para traer a un conductor particular, ya una vez que el DriverManager clase ha sido inicializada, nunca volver a inspeccionar eljdbc.drivers lista de propiedades. En ambos casos, es responsabilidad de la nueva carga Driver de clase para registrarse llamando DriverManager.registerDriver . Como se mencion, esto debe hacerse de forma automtica cuando se carga la clase. Por razones de seguridad, la capa de gestin JDBC un seguimiento de los cargador de clases que proporcionan conductor. Luego, cuando el DriverManager clase es abrir una conexin, se utilizar slo los conductores que vienen del sistema de archivos local o desde el cargador de la misma clase que el cdigo de emisin de la solicitud de conexin. 3.1.2 Establecimiento de una conexin Una vez que los Driver clases se han cargado y registrado con el DriverManager clase, que estn disponibles para establecer una conexin con una base de datos. Cuando una solicitud de conexin se realiza con una llamada a la DriverManager.getConnection mtodo, el DriverManager prueba cada controlador a su vez, para ver si se puede establecer una conexin. A veces puede ser el caso de que ms de un driver JDBC es capaz de conectarse a una determinada URL. Por ejemplo, cuando se conecta a una base de datos remoto determinado, podra ser posible utilizar un controlador puente JDBCODBC, JDBC uno-a-genrica de la red de protocolo del conductor, o un controlador suministrado por el proveedor de base de datos. En tales casos, el orden en que los conductores se ponen a prueba es importante porque el DriverManager usar el primer piloto que compruebe que puede conectarse correctamente a la direccin dada. En primer lugar el DriverManager intenta usar cada piloto en el orden en que fue registrado. (Los pilotos que figuran en el jdbc.drivers siempre se inscriben en primer lugar.) se saltar todos los controladores que son el cdigo no es de confianza, a menos que se han cargado de la misma fuente como el cdigo que est tratando de abrir la conexin. Pone a prueba los controladores mediante una llamada al mtodo de Driver.connect en cada uno, a su vez, pasa a la direccin URL que el usuario original se pasa al mtodo DriverManager.getConnection . El primer conductor que reconoce la direccin hace la conexin.

A primera vista esto puede parecer ineficiente, pero se requiere slo unas pocas llamadas a procedimientos y comparaciones de cadena por conexin, ya que es poco probable que decenas de conductores se cargan al mismo tiempo. El cdigo siguiente es un ejemplo de todo lo que normalmente se necesita para establecer una conexin con un controlador como un controlador puente JDBCODBC.
Class.forName ("jdbc.odbc.JdbcOdbcDriver"); / / carga el controlador String url = "jdbc: odbc: fred"; Connection con = DriverManager.getConnection ( url, "ID de usuario", "password");

La variable representa Con una conexin a la fuente de datos "Fred" que se puede utilizar para crear y ejecutar sentencias SQL. Con la adicin del 2,0 JDBC estndar Extensin de API, un DataSource objeto se puede utilizar para establecer una conexin con una fuente de datos. El DriverManager se puede seguir utilizando, pero unDataSource de objetos ofrece varias ventajas sobre el DriverManager y es la alternativa preferida. Los desarrolladores que escriben los componentes Enterprise JavaBeans, sin embargo, siempre debe utilizar unDataSource de objetos en lugar de la DriverManager . Usando una correcta aplicacin de DataSource objeto es la nica manera de conseguir las conexiones que se juntan y que pueden participar en transacciones distribuidas. 3.1.3 Los mtodos DriverManager son estticos Todos los DriverManager mtodos se declaran static , lo que significa que operan en la clase como un todo y no en casos particulares. De hecho, el constructor de DriverManager se declara private para evitar que los usuarios crear instancias de ella. Lgicamente, hay una instancia de la DriverManager clase. Esto significa que los mtodos son llamados por calificarlos con DriverManager , como en la siguiente lnea de cdigo.
DriverManager.setLogWriter (a);

Declaracin

NOTA: El material de este captulo est basado en JDBC TM API tutorial y de referencia, Segunda edicin: Universal Data Access de Java TM 2 Platform, publicado por Addison Wesley, como parte de la serie de Java, ISBN 0-201-43328-1. 4.1 Declaracin de Resumen Una Statement objeto se utiliza para enviar sentencias SQL a una base de datos. En realidad, hay tres tipos de Statement los objetos, todos los cuales actan como contenedores para la ejecucin de sentencias SQL en una conexin dada: Statement , PreparedStatement , que hereda de Statement y CallableStatement , que hereda de PreparedStatement . Estn especializados para el envo de determinados tipos de sentencias SQL, una Statement objeto se utiliza para ejecutar una sentencia SQL simple sin parmetros, un PreparedStatement objeto se utiliza para ejecutar una sentencia SQL precompilado con o sin parmetros IN, y un CallableStatement objeto se utiliza para ejecutar una llamada a una base de datos del procedimiento almacenado. La Statement interfaz proporciona mtodos bsicos para la ejecucin de sentencias y recuperar resultados. El PreparedStatement aade interfaz de mtodos para tratar con los parmetros IN, elCallableStatement aade interfaz de mtodos para tratar con parmetros OUT. En el ncleo de JDBC 2.0 API, el ResultSet interfaz tiene un conjunto de nuevas updateXXX mtodos y otros mtodos relacionados con las nuevas que hacen que sea posible actualizar los valores de columna de tabla mediante programacin. Esta nueva API tambin aade los mtodos para la Statement la interfaz (y PreparedStatement y CallableStatement interfaces) de manera que las instrucciones de actualizacin se puede ejecutar como un lote en lugar de por separado. 4.1.1 Creacin de objetos de Declaracin Una vez que una conexin a una base de datos particular, se ha establecido, esa conexin puede ser utilizada para enviar sentencias SQL A. Statement objeto se crea con la Connection mtodo createStatement , como en el siguiente fragmento de cdigo:

Connection con = DriverManager.getConnection (url, "soleado", ""); Statement stmt = con.createStatement ();

La sentencia SQL que ser enviada a la base de datos se suministra como argumento a una de las execute los mtodos de un Statement objeto. Esto se demuestra en el ejemplo siguiente, que utiliza el mtodoexecuteQuery :
ResultSet rs = stmt.executeQuery ("SELECT a, b, c DE Tabla2");

La variable rs referencias un conjunto de resultados que no se puede actualizar y en el que el cursor se puede mover slo hacia adelante, que es el comportamiento predeterminado de ResultSet objetos. El ncleo de la API de JDBC 2.0 aade una nueva versin del mtodo Connection.createStatement que hace posible la creacin de Statement los objetos que producen conjuntos de resultados que son desplazables y / o actualizar. 4.1.2 Las declaraciones de ejecucin mediante objetos de Declaracin La Statement interfaz proporciona tres mtodos diferentes para ejecutar sentencias SQL: executeQuery y executeUpdate , y execute . El mtodo a utilizar es determinado por lo que la sentencia de SQL produce. El mtodo executeQuery est diseado para los estados que producen un nico conjunto de resultados, tales como SELECT declaraciones. El mtodo executeUpdate se utiliza para ejecutar INSERT , UPDATE , o DELETE y tambin las declaraciones de SQL DDL (Data Definition Language) declaraciones como CREATE TABLE , DROP TABLE , y ALTER TABLE. El efecto de un INSERT , UPDATE , o DELETE instruccin es una modificacin de una o ms columnas en cero o ms filas de una tabla. El retorno valor de executeUpdate es un nmero entero (referido como el recuento de actualizacin) que indica el nmero de filas que se vieron afectadas. Por declaraciones como CREATE TABLE o DROP TABLE , que no operan en las filas, el valor devuelto por executeUpdate es siempre cero. El mtodo de execute se utiliza para ejecutar sentencias que devuelven ms de un conjunto de resultados, ms que un recuento de actualizaciones, o una combinacin de los dos. Debido a que es una caracterstica avanzada que la mayora de los programadores nunca va a usar, se explica en su propia seccin ms adelante en este resumen.

Todos los mtodos para la ejecucin de sentencias cerrar la llamada Statement de resultados actual del objeto establecer si hay uno abierto. Esto significa que cualquier transformacin de la corriente ResultSet objeto necesita ser completada antes de una Statement objeto se vuelve a ejecutar. Cabe sealar que el PreparedStatement interfaz, que hereda todos los mtodos de la Statement la interfaz, tiene sus propias versiones de los mtodos executeQuery y executeUpdate y execute . Statement los objetos no se contiene una sentencia SQL, por lo tanto, uno debe incluirse como el argumento de que los Statement.execute mtodos. PreparedStatement objetos no suministran una sentencia SQL como parmetro a estos mtodos porque ya hay una sentencia SQL precompilado. CallableStatement objetos heredan las PreparedStatement las formas de estos mtodos. El suministro de un parmetro a los PreparedStatemento CallableStatement versiones de estos mtodos se producir una SQLException para ser echada. 4.1.3 Declaracin de Terminacin Cuando una conexin est en modo auto-commit, las declaraciones que se est ejecutando dentro de ella se confirma o se revierte cuando se hayan completado. Una declaracin se considera completa cuando se ha ejecutado y todos sus resultados han sido devueltos. Para el mtodo executeQuery , que devuelve un conjunto de resultados, la declaracin se completa cuando todas las filas del ResultSet objetos han sido recuperados. Para el mtodo executeUpdate , una declaracin se completa cuando se ejecuta. En los raros casos en que el mtodo de execute que se llama, sin embargo, una declaracin no est completa hasta que todos los conjuntos de resultados o cuentas de actualizacin que gener han sido recuperados. Algunos DBMS tratan cada sentencia en un procedimiento almacenado en una declaracin aparte, mientras que otros tratan el procedimiento entero como una instruccin compuesta. Esta diferencia es importante cuando de confirmacin automtica est habilitada, ya que afecta cuando el mtodo commit que se llama. En el primer caso, cada sentencia individual se ha comprometido, en el segundo, todos estn comprometidos juntos. 4.1.4 Declaraciones de clausura los objetos se cerrar automticamente por el recolector de basura de Java. No obstante, se recomienda como buena prctica de programacin que se cerrar de forma explcita cuando ya no son necesarios.Esto libera recursos DBMS inmediatamente y ayuda a evitar posibles problemas de memoria.
Statement

4.1.5 SQL sintaxis de escape en los estados objetos pueden contener sentencias SQL que utilizan la sintaxis de escape SQL. Escapar de las seales de sintaxis al conductor de que el cdigo dentro de l deben ser manejados de manera diferente. Cuando el proceso de escape est habilitada (llamando al Statement.setEscapeProcessing(true) o RowSet.setEscapeProcessing(true) ), el controlador buscar por cualquier sintaxis de escape y traducirla en la base de datos de cdigo que entienda. Esto hace que la sintaxis de escape de DBMS independiente y permite al programador usar caractersticas que de otro modo no podran estar disponibles.
Statement

Una clusula de escape se delimitan mediante llaves y una palabra clave, lo que indica el tipo de clusula de escape.
{Palabra clave. . . parmetros. . . }

Las siguientes palabras se utilizan para identificar las clusulas de escape:

COMO escapar por los caracteres de escape El signo de porcentaje signo de porcentaje (%) de comodn> ( % ) y subrayado subrayado (_) de comodn> ( _ ) funcionan como caracteres comodn en SQL LIKEclusulas ( % concuerda con cero o ms caracteres, y _ coincide exactamente con un carcter). Con el fin de interpretarlos literalmente, pueden ser precedidos por una barra invertida ( \ ), que es un carcter de escape especial en cadenas. Se puede especificar el carcter que se utilizar como carcter de escape mediante la inclusin de la siguiente sintaxis en el extremo de una consulta:
{escape 'escape-character'}

Por ejemplo, la siguiente consulta, utilizando la barra inversa como carcter de escape, encuentra nombres de los identificadores que comienzan con un guin bajo.
stmt.executeQuery ("SELECT nombre de identificadores WHERE id LIKE ' \% _ ' {fuga ' \ ' } ");

fn para funciones escalares

Casi todos los DBMS tienen numricos, de cadena, fecha, hora, sistema y funciones de conversin sobre valores escalares. Una de estas funciones se pueden utilizar colocndolas en sintaxis de escape con la palabra clave fn seguida del nombre de la funcin deseada y sus argumentos. Por ejemplo, el siguiente cdigo llama a la funcin concat con dos argumentos que se concatenan:
{Fn concat ("Hot", "Java")};

El nombre del usuario de la base actual se puede obtener con la sintaxis siguiente:
{Fn user ()};

Las funciones escalares puede ser apoyado por diferentes DBMS con sintaxis ligeramente diferente, y no puede ser apoyado por todos los conductores. Varios DatabaseMetaData mtodos mostrar una lista de las funciones que son compatibles. Por ejemplo, el mtodo getNumericFunctions devuelve una lista separada por comas de los nombres de la CLI Open grupo de funciones numricas, el mtodogetStringFunctions vuelve funciones de cadena y as sucesivamente. El conductor, ni un mapa de la llamada a la funcin escap a la sintaxis adecuada o aplicar directamente a la funcin en s. Sin embargo, el conductor est obligado a implementar nicamente las funciones escalares que el DBMS soporta.

d, t, y el TS de fecha y literales de hora DBMS difieren en la sintaxis que utilizan para la fecha, hora, y los literales de fecha y hora. La API JDBC es compatible con el formato ISO estndar para la sintaxis de estos literales, utilizando una clusula de escape que el conductor debe traducir a la representacin de DBMS. Por ejemplo, una fecha se especifica en un comunicado JDBC de SQL con la siguiente sintaxis:
{D 'aaaa-mm-dd'}

En esta sintaxis, yyyy es el ao, mm es el mes y dd es el da. El conductor reemplazar a la clusula de salvaguardia con el equivalente DBMS especfico de representacin. Por ejemplo, el conductor podra reemplazar {d 1999-02-28} con '28-FEB-99' si ese es el formato ms

apropiado para la base de datos subyacente hay clusulas de escape para los anlogos. TIME y TIMESTAMP :
{T 'hh: mm: ss'} {Aaaa-mm-aaaa ts 'hh: mm: ss.f. . . '}

Las fracciones de segundo ( .f del TIMESTAMP puede omitirse.

. . .

) de las porciones

llamar o? = llamada para procedimientos almacenados Si una base de datos admite procedimientos almacenados, que pueden ser invocados desde JDBC con la sintaxis que se muestra a continuacin. Ntese que los corchetes ( [ ] ) indican que lo que entre ellos es opcional, y no son parte de la sintaxis.
{Call [(?,?, ...)]}

o, cuando un procedimiento devuelve un parmetro resultado:


{? = Llamada procedure_name [(?,?, ...)]}

Los argumentos de entrada pueden ser tanto literales o parmetros. Vea la seccin "Numeracin de los parmetros" en la pgina 81 para ms informacin. Uno puede llamar al mtodoDatabaseMetaData.supportsStoredProcedures para ver si la base de datos admite procedimientos almacenados.

DO para combinaciones externas La sintaxis de una combinacin externa es la siguiente:


{Oj outer-join}

En esta sintaxis, outer-join tiene la forma


la tabla {left | right | FULL OUTER JOIN} {table | outer-join} ON search-condition

(Tenga en cuenta que las llaves ( {} ) en la lnea anterior indica que uno de los elementos entre ellos debe ser utilizado;. que no son parte de la sintaxis) El siguiente SELECT instruccin utiliza la sintaxis de escape para una combinacin externa.
Statement stmt = con.createStatement ("SELECT * FROM {oj TABLA1

LEFT OUTER JOIN tabla2 ON DEPT_NO = 003420930} ");

Las combinaciones externas son una caracterstica avanzada y no son compatibles con todos los DBMS, consultar la gramtica de SQL para obtener una explicacin de ellos. JDBC proporciona tresDatabaseMetaData mtodos para determinar los tipos de uniones externas de un controlador de soportes: supportsOuterJoins y supportsFullOuterJoins y supportsLimite dOuterJoins . El mtodo Statement.setEscapeProcessing resulta escapar de procesamiento de encendido o apagado, con el valor predeterminado de. Un programador puede apagarlo para reducir el tiempo de procesamiento cuando el rendimiento es de suma importancia, pero normalmente se enciende. Cabe sealar que el mtodo setEscapeProcessing no funciona para PreparedStatement objetos porque la instruccin pueden ya han sido enviados a la base de datos antes de que pueda ser llamado. Vea la pgina 69 , el panorama general de la PreparedStatement de la interfaz, en relacin con la precompilacin. 4.1.6 El envo de actualizaciones por lotes La instalacin de actualizacin por lotes proporcionados por el ncleo de JDBC 2.0 API permite a un Statement objeto de presentar varios comandos de actualizacin en conjunto como una sola unidad, o por lotes, a la DBMS subyacente. Esta posibilidad de enviar varias actualizaciones como un lote en lugar de tener que enviar cada actualizacin individual puede mejorar el rendimiento en gran medida en algunas situaciones. El siguiente fragmento de cdigo muestra cmo enviar una actualizacin por lotes a una base de datos. En este ejemplo, una nueva fila se inserta en tres tablas diferentes con el fin de aadir un nuevo empleado a una base de datos de compaa. El fragmento de cdigo empieza por apagar la Connection Con objeto de modo auto-commit con el fin de permitir que mltiples sentencias para ser enviados juntos como una transaccin. Despus de crear la Statement stmt objeto, que aade tres SQL INSERT INTO comandos para el lote con el mtodo addBatch y luego enva el lote a la base de datos con el mtodo executeBatch . El cdigo es el siguiente:
Statement stmt = con.createStatement ();

con.setAutoCommit (false); stmt.addBatch ("INSERT INTO VALORES empleados (1000, 'Joe Jones)"); stmt.addBatch ("INSERT INTO VALORES departamentos (260, 'Zapatillas')"); stmt.addBatch ("INSERT INTO VALORES emp_dept (1000, '260 ')"); int [] updateCounts stmt.executeBatch = ();

Debido a la conexin del modo de confirmacin automtica est desactivada, la aplicacin es libre de decidir si procede o no confirmar la transaccin, si se produce un error o si algunos de los comandos del lote dejar de ejecutar. Por ejemplo, la aplicacin no puede confirmar los cambios si alguna de las inserciones no, evitando as la situacin en la que la informacin del empleado existe en algunas mesas pero no en otros. En el ncleo de JDBC 2.0 API, una Statement objeto se crea con una lista de comandos asociados. Esta lista est vaca, para empezar, los comandos se agregan a la lista con la Statement mtodo addBatch . Los comandos aadidos a la lista de todos debe devolver slo un recuento simple actualizacin. Si, por ejemplo, uno de los comandos es una consulta (un SELECT declaracin), que devolver un conjunto de resultados, el mtodo executeBatch lanzar un BatchUpdateException . Una Statement lista de objetos de comandos pueden ser vaciados por una llamada al mtodo clearBatch en l. En el ejemplo anterior, el mtodo executeBatch presenta lista de stmt de comandos para el DBMS subyacente para su ejecucin. El DBMS ejecuta cada comando en el orden en que se aadi al lote y devuelve un recuento de actualizacin para cada comando en el lote, tambin en orden. Si uno de los comandos no devuelve un recuento de actualizaciones, su valor de retorno no se puede aadir a la matriz de cuentas de actualizacin que el mtodo executeBatch devoluciones. En este caso, el mtodo executeBatch lanzar un BatchUpdateException . Esta excepcin se realiza un seguimiento de las cuentas de actualizacin para los comandos que ejecutaron con xito antes de producirse el error, y el orden de estas actualizaciones de cuenta del mismo modo sigue el orden de los comandos del lote. En el siguiente fragmento de cdigo, una aplicacin utiliza un try / catch de bloque, y si un BatchUpdateException se lanza, se recupera la excepcin de la variedad de cuentas de actualizacin para descubrir lo que los comandos de una actualizacin por lotes ejecutado con xito antes de que el BatchUpdateException objeto fue lanzado.

try { stmt.addBatch ("INSERT INTO empleados VALORES (" + "1000," Joe Jones ') "); stmt.addBatch ("INSERT INTO VALORES departamentos (260, 'Zapatillas')"); stmt.addBatch ("INSERT INTO VALORES emp_dept (1000, '260 ')"); int [] updateCounts stmt.executeBatch = (); } Catch (BatchUpdateException b) { System.err.println ("cuentas de actualizacin de los comandos de xito:"); int [] = updateCounts b.getUpdateCounts (); for (int i = 0; i <updateCounts.length; i + +) { System.err.print (updateCounts [i] + ""); } System.err.println (""); }

Si una copia impresa se ha generado y tenan un aspecto similar al siguiente, los dos primeros comandos de xito y no el tercero.
Actualizacin de cargos de comandos de xito: 1 1

Drivers JDBC no estn obligados a apoyar a las actualizaciones por lotes, por lo que un conductor particular, no puede implementar los mtodos addBatch , clearBatch y executeBatch . Normalmente, un programador sabe si un controlador que l / ella est trabajando admite actualizaciones por lotes, pero si una aplicacin quiere ver, se puede llamar a los DatabaseMetaData mtodo supportsBatchUpdates para averiguarlo. En el siguiente fragmento de cdigo, una actualizacin por lotes se utiliza slo si el controlador es compatible con actualizaciones por lotes, de lo contrario, cada actualizacin se enva como una declaracin separada. La conexin de modo de confirmacin automtica est desactivada de manera que en cualquier caso, todas las actualizaciones estn incluidas en una sola transaccin.
con.setAutoCommit (false); if (dbmd.supportsBatchUpdates) { stmt.addBatch ("INSERT INTO ..."); stmt.addBatch ("Eliminar ..."); stmt.addBatch ("INSERT INTO ..."); . . . stmt.executeBatch (); Else {} System.err.print ("Driver no es compatible con actualizaciones por lotes;"); System.err.println ("el envo de actualizaciones en declaraciones por separado.");

stmt.executeUpdate ("INSERT INTO ..."); stmt.executeUpdate ("Eliminar ..."); stmt.executeUpdate ("INSERT INTO ..."); . . . con.commit ();

4.1.7 dar indicios de rendimiento La Statement la interfaz contiene dos mtodos para dar consejos de rendimiento para el conductor: setFetchDirection y setFetchSize . Estos mtodos tambin estn disponibles en el ResultSet de interfaz y hacer exactamente lo mismo. La diferencia es que las Statement los mtodos de establecer el valor predeterminado para todos los ResultSet objetos producidos por una determinada Statement objeto, mientras que los ResultSet mtodos pueden ser llamados en cualquier momento durante la vida del ResultSet objeto para cambiar la direccin de buscar o el tamao de captura. Vea la seccin "Proporcionar sugerencias de rendimiento" en la pgina 54 para una discusin completa de estos mtodos. Tanto la Statement y el ResultSet interfaces tienen las correspondientes get mtodos: getFetchDirection y getFetchSize . Si Statement. getFetchDirection se llama antes de buscar una direccin se ha establecido, el valor devuelto es de aplicacin especfica, es decir, corresponde al conductor. Lo mismo es cierto para el mtodo Statement.getFetchSize . 4.1.8 Ejecucin de los tipos especficos de los estados La execute mtodo debe usarse slo cuando es posible que una declaracin puede devolver ms de un ResultSet objeto, ms que un recuento de actualizaciones, o una combinacin de ResultSet objetos y actualizaciones. Estas mltiples posibilidades para obtener resultados, aunque poco frecuentes, son posibles cuando una se est ejecutando determinados procedimientos almacenados o la ejecucin de una dinmica desconocida cadena SQL (es decir, desconocido para el programador de la aplicacin en tiempo de compilacin). Por ejemplo, un usuario puede ejecutar un procedimiento almacenado (mediante unCallableStatement objeto), y que el procedimiento almacenado podra realizar una actualizacin, y luego una seleccin, luego de una actualizacin, a continuacin, una seleccin, y as sucesivamente. En las situaciones ms tpicas, alguien que usa un procedimiento almacenado ya se sabe lo que devuelve.

ResultSet

NOTA: El material de este captulo est basado en JDBC TM API tutorial y de referencia, Segunda edicin: Universal Data Access de Java TM 2 Platform, publicado por Addison Wesley, como parte de la serie de Java, ISBN 0-201-43328-1. 5.1 Descripcin de resultados Un ResultSet es un objeto de Java que contiene los resultados de la ejecucin de una consulta SQL. En otras palabras, que contiene las filas que satisfacen las condiciones de la consulta. Los datos almacenados en unResultSet objeto se recupera a travs de un conjunto de get mtodos que permite el acceso a las distintas columnas de la fila actual. El ResultSet.next mtodo se utiliza para desplazarse a la fila siguiente delResultSet , por lo que es la fila actual. La forma general de un conjunto de resultados es una tabla con encabezados de columna y los valores correspondientes devueltos por una consulta. Por ejemplo, si su consulta es SELECT a, b, c FROM Table1 , su resultado tendr la forma siguiente:
A b c --------------------------------12345 Cupertino 2459723,495 83472 Redmond 1.0 83492 Boston 35,069,473.43

El siguiente fragmento de cdigo es un ejemplo de la ejecucin de una sentencia SQL que devolver una coleccin de filas, con una columna de a como un int , columna b , como una String , y la columna c como un float:
java.sql.Statement stmt = con.createStatement (); ResultSet rs = stmt.executeQuery ("SELECT a, b, c FROM Tabla1"); while (rs.next ()) { / / Recuperar e imprimir los valores de la fila actual int i = rs.getInt ("a"); String s = rs.getString ("b"); float f = rs.getFloat ("c"); System.out.println ("FILA =" + i + "" + s + "" + f); }

5.1.1 filas y columnas Una base de datos relacional se compone de tablas, cada tabla que consta de filas y columnas. Una fila en una tabla de base de datos relacional puede considerarse como la representacin de una instancia de la entidad que representa a la mesa. Por ejemplo, si hay una tabla de los empleados, cada fila contendr la informacin sobre un empleado en particular. Cada pieza de informacin acerca de que el empleado se almacena en una columna, por lo que, por ejemplo, la tabla de empleados podra tener columnas para un nmero de identificacin, un nombre, un salario, y una fecha de contratacin. Las columnas de una fila que contiene el nmero de identificacin, nombre, salario y fecha de contratacin de un empleado en particular. Un conjunto de resultados es tambin una tabla con filas y columnas, pero slo contiene los valores de las columnas de una tabla de base de datos que satisfacen las condiciones de una consulta. En otras palabras, la hoja de resultados contendrn un subconjunto de las columnas de la tabla de base de datos subyacente (a menos que la consulta selecciona todo en la mesa, en cuyo caso la tabla de conjunto de resultados incluir todos los valores de las columnas para cada fila de la base de datos tabla). En el pasado, un valor de columna en una tabla de base de datos relacional (y por consiguiente en una tabla de conjunto de resultados) tena que ser atmico, es decir, que podra ser slo un valor indivisible. Por ejemplo, una matriz no podra ser un valor de la columna debido a una matriz puede estar compuesta de varios elementos. Con el advenimiento de SQL3 tipos de datos, sin embargo, el contenido permisible de columnas de la tabla se ha expandido dramticamente. Ahora es posible para un arreglo o incluso un usuario tipo estructurado definido por ser un valor de columna.Debido a que esta nueva funcin permite a una base de datos relacional para almacenar instancias de los tipos complejos como los valores de columna, se hace una base de datos relacional ms como una base de datos de objeto, borrando la distincin

entre bases de datos relacionales y objeto. Los programadores pueden aprovechar estos nuevos tipos de datos si se utiliza un controlador de JDBC 2.0 que soporta los tipos SQL3. 5.1.2 Cursores Un ResultSet mantiene un cursor objeto, lo que apunta a la fila actual de datos. El cursor se mueve una fila hacia abajo cada vez que el mtodo de next se llama. Cuando un ResultSet objeto se crea por primera vez, el cursor se coloca antes de la primera fila, as que la primera llamada a la next mtodo coloca el cursor en la primera fila, por lo que es la fila actual. ResultSet filas puede ser recuperada en la secuencia de arriba a abajo que el cursor se mueve una fila hacia abajo con cada llamada sucesiva con el mtodo next . Esta capacidad de mover su cursor slo hacia delante es el comportamiento predeterminado de un ResultSet y es el nico movimiento del cursor es posible con los controladores que implementan slo el API JDBC 1.0. Este tipo de conjunto de resultados tiene el tipo ResultSet.TYPE_FORWARD_ONLY y se conoce como un conjunto de resultados slo hacia delante. Si el conductor aplica los mtodos de movimiento del cursor en el ncleo de JDBC 2.0 API, sus conjuntos de resultados se puede desplazar. Un conjunto de resultados del cursor desplazable puede moverse hacia adelante y hacia atrs, as como a una fila en particular. Los siguientes mtodos mueve el cursor hacia atrs, a la primera fila, a la ltima fila, a un determinado nmero de fila, a un nmero especificado de filas de la fila actual, y as sucesivamente: previous , first , last , absolute , relative , afterLast , y beforeFirst . Una explicacin y el ejemplo de cmo hacer que un conjunto de resultados desplazable ser presentado en la seccin de "Creacin de diferentes tipos de conjuntos de resultados" en la pgina 55 . Cuando el cursor se coloca en una fila en un ResultSet objeto (no antes de la primera fila o despus de la ltima fila), esa fila se convierte en la fila actual. Esto significa que los mtodos llamados, mientras que el cursor se coloca en la fila se (1) operar en los valores de la fila (de mtodos tales como getXXX y updateXXX ), (2) operar en la fila como un todo (como el mtodos updateRow , insertRow , deleteRow , refresh-Row ), o (3) utilizar esa fila como punto de partida para pasar a otras filas (por ejemplo, el mtodo de relative ). Un cursor sigue siendo vlida hasta que el ResultSet objeto o su casa matriz Statement objeto est cerrado.

5.1.3 Ejemplos de movimiento del cursor Como se indica en la seccin anterior, el movimiento del cursor estndar para conjuntos de resultados de slo avance es utilizar el mtodo next para recorrer cada fila del resultado en vez de arriba a abajo. Con los conjuntos de resultados desplazables, es posible volver a una fila o para recorrer el conjunto de resultados en mltiples ocasiones. Esto es posible porque el cursor se puede mover antes de la primera fila en cualquier momento (con el mtodo beforeFirst mtodo ( ResultSet interfaz)> beforeFirst ). El cursor se puede iniciar otra iteracin a travs del conjunto de resultados con el mtodo next . Las posiciones el siguiente ejemplo el cursor antes de la primera fila y luego se repite hacia adelante a travs de los contenidos del conjunto de resultados. Los mtodos getString y getFloat recuperar los valores de las columnas para cada fila hasta que no hay ms filas, momento en que el mtodo next devuelve el valor false .
rs.beforeFirst (); while (rs.next ()) { System.out.println (rs.getString ("EMP_NO") + "" + Rs.getFloat ("Salario"); }

Tambin es posible para recorrer un conjunto de resultados hacia atrs, como se muestra en el ejemplo siguiente. El cursor se mueve primero hasta el final del conjunto de resultados (con el mtodo afterLast ) y, a continuacin el mtodo previous se invoca dentro de un while de bucle para recorrer el contenido del conjunto de resultados moviendo a la fila anterior con cada iteracin. El mtodo de previous declaraciones falsecuando no hay ms filas, por lo que el bucle termina despus de que todas las filas han sido visitados.
rs.afterLast (); mientras que (rs.previous ()) { System.out.println (rs.getString ("EMP_NO") + "" + Rs.getFloat ("Salario"); }

La interfaz ResultSet ofrece otras maneras para recorrer las filas de un conjunto de resultados desplazable. Se debe tener cuidado, sin embargo, para evitar alternativas incorrectamente, como la ilustrada en el siguiente ejemplo:
/ / Incorrecto! while (! rs.isAfterLast ()) { rs.relative (1); System.out.println ( rs.getString ("EMP_NO") + "" + rs.getFloat ("Salario")); }

En este ejemplo se intenta iterar hacia adelante a travs de un conjunto de resultados desplazable y es incorrecta por varias razones. Un error es que si ResultSet.isAfterLast se llama cuando el conjunto de resultados est vaco, se devolver un valor de false ya que no hay ltima fila. El cuerpo del bucle se ejecutar, lo que no es lo que se quiere. Un problema adicional se produce cuando el cursor est situado antes de la primera fila de un conjunto de resultados que contiene datos. En este caso, llamando rs. relative(1) es errnea, porque no hay fila actual. El mtodo de relative se mueve el cursor al nmero especificado de filas de la fila actual, y que se debe invocar solamente cuando el cursor est en la fila actual. El fragmento de cdigo siguiente se corrige los problemas en el ejemplo anterior. He aqu una llamada al mtodo ResultSet.first se utiliza para distinguir el caso de un conjunto de resultados vaco de uno que contiene los datos. Debido a que ResultSet.isAfterLast se llama slo cuando el conjunto de resultados no est vaco, el lazo de control funciona correctamente. Desde ResultSet. first method ( ResultSet
interface)>first ResultSet. first method ( ResultSet interface)>first ResultSet. first method ( ResultSet interface)>first ResultSet. first method ( ResultSet

principio posiciona el cursor en la primera fila, el mtodo ResultSet.relative(1) medidas a travs de las filas del conjunto de resultados como se esperaba.
interface)>first if (rs.first ()) { while (! rs.isAfterLast ()) { System.out.println ( rs.getString ("EMP_NO") + "" + rs.getFloat ("Salario")); rs.relative (1); } }

5.1.4 La determinacin del nmero de filas de un conjunto de resultados Con los mtodos de movimiento del cursor nuevos, es fcil ver cuntas filas un desplazamiento ResultSet objeto contiene. Todo lo que hay que hacer es ir a la ltima fila del conjunto de resultados y obtener el nmero de la fila. En el siguiente ejemplo, rs tendr una fila por cada empleado.
ResultSet rs = stmt.executeQuery ( "SELECT APELLIDOS, nombre FROM EMPLEADOS"); rs.last (); int numeroDeFilas rs.getRow = (); System.out.println ("XYZ, Inc. tiene" + + "numeroDeFilas empleados"); rs.beforeFirst (); while (siguiente ()) {

. }

/ / Recuperar el nombre y apellido de cada empleado

Aunque no es tan conveniente, tambin es posible averiguar el nmero de filas de un conjunto de resultados no desplazable tiene. El siguiente ejemplo muestra una forma de determinar el nmero de filas.
ResultSet rs = stmt.executeQuery ("SELECT COUNT (*) FROM EMPLEADOS"); rs.next (); int cuenta = rs.getInt (1); System.out.println ("XYZ, Inc. tiene" + contador + "Empleados"); ResultSet rs2 = stmt.executeQuery ( "SELECT APELLIDOS, nombre FROM EMPLEADOS"); mientras que (rs2.next ()) { . . . / / Recuperar el nombre y apellido de cada empleado }

Con el conjunto de resultados desplazable, el cursor se reposicion slo para empezar a iterar a travs de la mismo conjunto de resultados para recuperar sus datos. En el ejemplo anterior, sin embargo, una consulta es necesaria para obtener el recuento, y la otra consulta es necesaria para obtener un conjunto de resultados con los datos que se desea. Ambas consultas se deben, por supuesto, producir conjuntos de resultados del mismo tamao de la cuenta para ser exactos. Una segunda manera de determinar el nmero de filas en un conjunto de resultados slo hacia delante es para recorrer el conjunto de resultados, aumento de una variable en cada iteracin, que se muestra en el siguiente ejemplo. Debido a que una aplicacin puede iterar a travs de un resultado de slo avance configurar una sola vez, la misma consulta tiene que ser ejecutado dos veces. En la iteracin a travs de la primera RS, el nmero de filas se cuenta; en la iteracin a travs del segundo RS, se recuperan los datos.
ResultSet rs = stmt.executeQuery ( "SELECT APELLIDOS, nombre FROM EMPLEADOS"); int cuenta = 0; while (rs.next ()) { cuenta + +; } System.out.println ("la Compaa XYZ tiene" count + "los empleados."); rs = stmt.executeQuery ( "SELECT APELLIDOS, nombre FROM EMPLEADOS"); while (rs.next ()) { . . . / / Recuperar el nombre y apellido de cada empleado }

5.1.5 Recuperacin de los valores de columna

Los ResultSet.getXXX mtodos proporcionan los medios para recuperar los valores de la columna de la fila actual. Para una mxima portabilidad con conjuntos de resultados de slo avance, los valores deben ser recuperados de izquierda a derecha, y los valores de las columnas debe ser ledo slo una vez. Con los conjuntos de resultados desplazables, sin embargo, no existen tales restricciones. O bien el nombre de la columna o el nmero de columna puede ser usado para designar a la columna de la que para recuperar datos. Por ejemplo, si la segunda columna de un ResultSet rs objeto se denomina TITLE , y almacena los valores como cadenas, una de las siguientes va a recuperar el valor almacenado en esa columna:
String s = rs.getString (2); String s = rs.getString (" TITLE ");

Tenga en cuenta que las columnas estn numeradas de izquierda a derecha comenzando por la columna 1. Adems, los nombres de columna utilizados como entrada para getXXX mtodos son sensibles a maysculas. La opcin de utilizar el nombre de la columna se proporciona para que un usuario que especifica los nombres de columna en una consulta puede utilizar los mismos nombres que los argumentos de getXXX mtodos. Si, por otro lado, el SELECT declaracin no especifica los nombres de columna (como en " SELECT * FROM TABLE1 "o en los casos en que se deriva de una columna), nmeros de columna debe ser utilizado. En tales situaciones, no hay manera de que el usuario conozca a ciencia cierta cules son los nombres de columna son. En algunos casos, es posible que una consulta SQL para devolver un conjunto de resultados que tiene ms de una columna con el mismo nombre. Si un nombre de la columna se utiliza como el parmetro para una getXXXmtodo, getXXX devolver el valor del nombre de la primera columna coincidente. As, si hay varias columnas con el mismo nombre, uno tiene que utilizar un ndice de columna para estar seguro de que el valor de la columna correcta se recupera. Tambin puede ser ligeramente ms eficaz utilizar nmeros de columna. Si el nombre de una columna se conoce, pero no su ndice, el mtodo findColumn puede ser utilizado para encontrar el nmero de columna. La informacin sobre las columnas de un ResultSet est disponible llamando al mtodo ResultSet.getMetaData . El ResultSetMetaData objeto devuelto proporciona el nmero, tipos y propiedades de suResultSet columnas objeto.

5.1.6 Qu mtodo utilizar getXXX Los drivers JDBC soportan la conversin de tipos. Cuando un getXXX se invoca el mtodo, el conductor intenta convertir los datos subyacentes del tipo XXX en el lenguaje de programacin Java y devuelve un valor adecuado. Por ejemplo, si el getXXX mtodo es getString , y el tipo de datos de los datos en la base de datos subyacente es VARCHAR , el controlador compatible con JDBC convierte el VARCHAR valor a una Stringobjetos en el lenguaje de programacin Java. Esa String objeto ser el valor devuelto por getString . El API JDBC 2.0 aade nuevas ResultSet.getXXX mtodos para recuperar los nuevos tipos de datos SQL3. Estos mtodos funcionan de la misma manera los getXXX mtodos en el trabajo de JDBC 1.0 API, es decir, asignar el tipo de SQL3 JDBC a un tipo en el lenguaje de programacin Java y devolver ese tipo. Por ejemplo, el mtodo getClob recupera un JDBC CLOB valor de la base de datos y devuelve un Clob objeto, que es un ejemplo de la java.sql.Clob interfaz. El mtodo getObject va a recuperar cualquier tipo de datos. Esto es posible porque Object , siendo el tipo del que se deriva cada tipo de objeto en el lenguaje de programacin Java, es el tipo ms genrico. Esto es especialmente til cuando el tipo de datos subyacente es un tipo de base de datos especfica, o cuando una aplicacin genrica tiene que ser capaz de aceptar cualquier tipo de datos. El mtodo getObject , como cabra esperar de su nombre, devuelve un Java Object que debe estrecharse si es para ser usado como un tipo ms especfico. En otras palabras, debe ser lanzado desde su genrico Object tipo a su tipo ms derivado antes de que pueda ser utilizado como que tipo derivado. El siguiente fragmento de cdigo muestra el uso del mtodo getObject para recuperar una Struct valor de la columna ADDRESS en la fila actual del ResultSet rs objeto.El Object que getObject devuelve se reduce a una Struct antes de asignarlo a la direccin de la variable.
Struct address = (struct) rs.getObject ("Direccin");

El mtodo getObject no slo es el nico mtodo capaz de recuperar los valores de cualquier tipo de datos, sino tambin el nico ResultSet.getXXX mtodo que hace la asignacin personalizada. Por lo tanto, que ser por encargo asignado, un tipo de datos tiene que ser recuperados con el mtodo getObject . Los dos tipos de datos SQL que puede ser personalizado asignados son los tipos definidos por el usuario, SQL tipos estructurados y DISTINCT tipos. Un JDBC DISTINCT que suele utilizarse para recuperar con el getXXX mtodo apropiado para su tipo de subyacente, pero si tiene una asignacin personalizada, debe ser recuperada por el mtodo getObject con el fin de ser por encargo asignado. Un

JDBC STRUCT slo se puede recuperar con el mtodo getObject , lo que garantiza que si hay una asignacin personalizada para un JDBC STRUCT valor, se va a utilizar.

Una "x" indica que el getXXX mtodo puede usarse legalmente para recuperar el tipo JDBC.

Una "X" indica que el getXXX es el mtodo recomendado para recuperar el tipo JDBC. 5.1.7 Tipos de conjuntos de resultados Los conjuntos de resultados pueden tener diferentes niveles de funcionalidad. Por ejemplo, pueden ser desplazable o no desplazable. Un conjunto de resultados desplazable tiene un cursor que se mueve hacia adelante y hacia atrs y se puede mover a una fila determinada. Adems, los conjuntos de resultados puede ser sensible o insensible a los cambios realizados al mismo tiempo que estn abiertos, es decir, que pueden o no reflejar los cambios en los valores de columna que se modifican en la base de datos. Un desarrollador debe tener siempre en cuenta el hecho de que la adicin de capacidades para un ResultSet objeto incurre en una sobrecarga adicional, por lo que debe hacerse slo cuando sea necesario. Con base en las capacidades de desplazamiento y sensibilidad a los cambios, hay tres tipos de conjuntos de resultados disponibles con el ncleo de JDBC 2.0 API. Las siguientes constantes, definidas en el ResultSet de la interfaz, se utilizan para especificar estos tres tipos de conjuntos de resultados:
1. TYPE_FORWARD_ONLY o El conjunto de resultados es desplazable, su cursor se mueve slo hacia adelante, de arriba a abajo. o El punto de vista de los datos en el conjunto de resultados depende de si el DBMS se materializa los resultados de forma incremental. 2. TYPE_SCROLL_INSENSITIVE o El conjunto de resultados es desplazable: Su cursor se puede mover hacia delante o hacia atrs y se puede mover a una fila o una fila cuya posicin es relativa a su posicin actual. o El conjunto de resultados por lo general no muestra cambios en la base de datos subyacente que se hacen mientras est abierto. El nmero de miembros, el orden y los valores de columna de las filas suelen ser fijos, cuando el conjunto de resultados se crea. 3. TYPE_SCROLL_SENSITIVE o El conjunto de resultados es desplazable, su cursor se puede mover hacia delante o hacia atrs y se puede mover a una fila o una fila cuya posicin es relativa a su posicin actual. o El conjunto de resultados es sensible a los cambios realizados mientras est abierto. Si los valores de las columnas subyacentes se modifican, los nuevos valores son visibles, lo que proporciona una visin dinmica de los datos subyacentes. La composicin y ordenacin de las filas del conjunto de resultados que se establezca o no, dependiendo de la implementacin.

5.1.8 Tipos de concurrencia Un conjunto de resultados puede tener diferentes capacidades de actualizacin. Al igual que con scrollability, haciendo un ResultSet actualizable gastos objeto de aumentos y se debe hacer slo cuando sea necesario.Dicho esto, a menudo es ms conveniente para realizar actualizaciones mediante programacin, y que slo se puede hacer si un conjunto de resultados se pueden actualizar. El ncleo de JDBC 2.0 API ofrece dos funciones de actualizacin, especificadas por las siguientes constantes en el ResultSet de la interfaz:
1. CONCUR_READ_ONLY o Indica un conjunto de resultados que no se puede actualizar mediante programacin o La concurrencia a disposicin de los conductores que implementan slo el API JDBC 1.0 de tipo o Ofrece el ms alto nivel de concurrencia (que permite el mayor nmero de usuarios simultneos). Cuando un ResultSet con el objeto de slo lectura de concurrencia tiene que establecer un bloqueo, se utiliza un bloqueo de slo lectura. Esto permitir a los usuarios leer los datos pero no para cambiarlo. Debido a que no hay lmite para el nmero de slo lectura cerraduras que pueden ser mantenidos en datos en un tiempo, no hay lmite para el nmero de usuarios simultneos a menos que el DBMS o conductor impone una. 2. CONCUR_UPDATABLE o Indica un conjunto de resultados que se pueden actualizar mediante programacin o Disponible a los conductores que implementan la API central JDBC 2.0 o Reduce el nivel de concurrencia. Conjuntos de resultados actualizables pueden utilizar slo escritura cerraduras para que slo un usuario a la vez tiene acceso a un elemento de datos. Esto elimina la posibilidad de que dos o ms usuarios pueden cambiar los mismos datos, garantizando as la consistencia de bases de datos. Sin embargo, el precio de esta coherencia es una reduccin del nivel de concurrencia.

Para permitir un mayor nivel de concurrencia, un conjunto de resultados actualizable puede ser implementado de forma que utiliza un esquema de control de concurrencia optimista. Esta implementacin supone que los conflictos son raros, y evita el uso de slo escritura cerraduras, lo que permite a ms usuarios el acceso simultneo a los datos. Antes de cometer cualquier actualizacin, determina si un conflicto se ha producido mediante la comparacin de las filas, ya sea por valor o por un nmero de versin. Si ha habido un conflicto de actualizacin entre dos operaciones, una de las operaciones se interrumpir el fin de mantener la coherencia.Implementaciones de control de concurrencia optimista puede aumentar la concurrencia, sin embargo, si hay demasiados conflictos, que en realidad puede reducir el rendimiento.

5.1.9 Proporcionar sugerencias de rendimiento Muchos DBMS y los controladores estn optimizados para proporcionar el mejor rendimiento en distintas circunstancias, lo que significa que por lo general un programador de bases de datos es ms aconsejable utilizar los valores predeterminados. Sin embargo, para los programadores que quieran buen desempeo de bases de datos sintona para una aplicacin particular, el API JDBC 2.0 proporciona mtodos que dan consejos para el conductor para hacer el acceso a los datos del conjunto de resultar ms eficiente. Estas sugerencias de rendimiento son exactamente eso, slo indicios, un controlador compatible con JDBC puede optar por hacer caso de ellos. Las siguientes dos notas dan las sugerencias de controladores para mejorar el rendimiento: 1. El nmero de filas que se deben obtener de la base de datos de cada fila de tiempo se necesitan nuevas El nmero de filas a captar que se llama el tamao de captura, y se puede configurar de dos formas diferentes: Statement. setFetchSize y ResultSet. setFetchSize . La afirmacin de que crea un ResultSet objeto establece el valor por defecto para ese tamao de captura ResultSet objeto, utilizando la Statement mtodo setFetchSize . El siguiente fragmento de cdigo establece el tamao de captura para los ResultSet rs objeto a 25. Hasta el tamao de la lectura se cambia, cualquier conjunto de resultados creado por la Statement stmt objeto automticamente tendr un tamao de captura de 25.
2. 3. 4. Statement stmt = con.createStatement (); stmt.setFetchSize (25); ResultSet rs = stmt.executeQuery (SELECT * FROM empleados);

Un conjunto de resultados puede, en cualquier momento, cambiar su tamao de captura por defecto mediante el establecimiento de un nuevo tamao de captura con el ResultSet versin del mtodosetFetchSize . Continuando con el fragmento de cdigo anterior, la siguiente lnea de cdigo cambia el tamao de captura de la RS a 50:
rs.setFetchSize (50);

Normalmente, el tamao de captura ms eficiente ya es el predeterminado para el conductor. El mtodo setFetchSize slo permite a un programador que experimentar para ver si un determinado tamao

de recuperacin es ms eficiente que el valor por defecto para una aplicacin particular. 5. La direccin en la que las filas sern procesados La interfaz ResultSet define los siguientes tres constantes para especificar la direccin en la que para procesar filas: FETCH_FORWARD , FETCH_REVERSE , y FETCH_UNKNOWN. Al igual que con el tamao de captura, hay dos mtodos para establecer la direccin recoger, una en la interfaz de Statement , y el otro en la interfaz ResultSet . La afirmacin de que crea el conjunto de resultados determina el valor por defecto direccin de captacin mediante la Statement mtodo setFetchDirection . El siguiente fragmento de cdigo establece la direccin de captacin para el ResultSet rs objeto para que se procesan las filas de abajo hacia arriba. Hasta que la direccin a buscar se cambia, cualquier conjunto de resultados creado por la Statement stmt objeto automticamente tendr una direccin de recuperar versiones anteriores.
Statement stmt = con.createStatement (); stmt.setFetchDirection (FETCH_REVERSE); ResultSet rs = stmt.executeQuery (SELECT * FROM empleados);

Un conjunto de resultados puede, en cualquier momento, cambiar su direccin predeterminada para la recuperacin mediante el establecimiento de una nueva direccin de captacin con el ResultSet mtodosetFetchDirection . Continuando con el fragmento de cdigo anterior, la siguiente lnea de cdigo cambia la direccin a buscar de rs que transmita.
rs.setFetchDirection (FETCH_FORWARD);

El ResultSet rs objeto se dan a entender que las filas de proceso del controlador en una direccin hacia adelante. Esta pista estar en vigor hasta que el mtodo ResultSet.setFetchDirection se volvi a pedir a RS para cambiar la direccin de captacin propuesto. Al igual que con el tamao de captura, los conductores suelen optimizado para utilizar la ms eficiente direccin de captacin, y cambiar el valor por defecto en realidad puede trabajar en contra de esta optimizacin.El

mtodo setFetchDirection slo permite a un programador para tratar de afinar una solicitud para obtener un rendimiento an mejor. 5.1.10 crear diferentes tipos de conjuntos de resultados Un conjunto de resultados se crea mediante la ejecucin de una consulta, y el tipo de conjunto de resultados depende de los argumentos que se suministran a la Connection mtodo createStatement (oprepareStatement o prepareCall ). El siguiente fragmento de cdigo, que slo utiliza la API JDBC 1.0, proporciona ningn argumento al mtodo createStatement y por lo tanto crea un valor predeterminadoResultSet objeto, que es de slo avance y utiliza la concurrencia de slo lectura.
Connection con = DriverManager.getConnection ( "Jdbc: my_subprotocol: my_subname"); Statement stmt = con.createStatement (); ResultSet rs = stmt.executeQuery ( "SELECT EMP_NO, SUELDO DE LOS EMPLEADOS");

La variable rs representa un ResultSet objeto que contiene los valores de las columnas EMP_NO y SALARY de cada fila de la tabla EMPLOYEES . Este conjunto de resultados no es desplazable, de modo que slo el mtodonext se puede utilizar para mover el cursor de arriba hacia abajo a travs de las filas del conjunto de resultados. El ResultSet rs objeto no se puede actualizar, y ya que no se les dio consejos de rendimiento, el conductor es libre de hacer lo que se piensa que va a producir el mejor rendimiento. El nivel de aislamiento de la transaccin no fue fijada igualmente, por lo que rs utilizar la transaccin por defecto nivel de aislamiento de la base de datos subyacente. (Ver "Los niveles de aislamiento de transacciones" en la pgina 22 para una explicacin de los niveles de aislamiento de transaccin.) El siguiente ejemplo utiliza el nuevo ncleo de JDBC 2.0 API para crear un conjunto de resultados desplazable que es sensible a los cambios (especificando ResultSet.TYPE_SCROLL_SENSITIVE ) y que es actualizable (especificando ResultSet.CONCUR_UPDATABLE ).
Connection con = DriverManager.getConnection ( "Jdbc: my_subprotocol: my_subname"); Statement stmt = con.createStatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); stmt.setFetchSize (25); ResultSet rs2 = stmt.executeQuery ( "SELECT EMP_NO, SUELDO DE LOS EMPLEADOS");

La rs2 variable contiene los mismos valores que R, del ejemplo anterior, pero a diferencia de RS, es desplazable y actualizable, y sensible a los cambios en los datos de la tabla subyacente. Tambin insina que el conductor debe buscar a 25 filas de la base de datos cada vez que los nuevos registros son necesarios. Cada vez que la Statement stmt objeto se ejecuta, se crear un conjunto de resultados que es desplazable, es actualizable, es sensible a los cambios en sus datos, y tiene un tamao de captura de 25. El conjunto de resultados puede cambiar su tamao de captura, pero no puede cambiar el tipo o la concurrencia. Como se dijo anteriormente, hay un costo para hacer un conjunto de resultados desplazable o actualizable, por lo que es una buena prctica para crear conjuntos de resultados con estas caractersticas slo cuando sea necesario. 01/05/11 Con una declaracin preparada para crear conjuntos de resultados Debido a que PreparedStatement y CallableStatement objetos heredan los mtodos definidos en la Statement la interfaz, que, tambin, puede crear diferentes tipos de ResultSet objetos. El siguiente fragmento de cdigo crea un conjunto de resultados utilizando un PreparedStatement objeto en lugar de una Statement objeto. El conjunto de resultados tiene los mismos atributos que en el ejemplo anterior, excepto que un nivel de aislamiento de transaccin se establece para la conexin.
Connection con = DriverManager.getConnection ( "Jdbc: my_subprotocol: my_subname"); con.setTransactionIsolation (TRANSACTION_READ_COMMITTED); Pstmt PreparedStatement con.prepareStatement = ( "SELECT EMP_NO, SUELDO DE LOS EMPLEADOS EN EMP_NO =?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); pstmt.setFetchSize (25); pstmt.setString (1, "1000010"); ResultSet RS3 = pstmt.executeQuery ();

El RS3 variable contiene los valores de las columnas EMP_NO y SALARY para la fila en el valor de EMP_NO es 1000010 . El ResultSet objeto RS3 es como rs2 en el que es desplazable, es actualizable, es sensible a los cambios en sus datos, y sugerencias que el conductor debera obtener 25 filas a la vez de la base de datos. Es diferente, ya que su conexin especifica que las lecturas sucias (la lectura de los valores antes de que se han comprometido) se pueden

prevenir. Debido a que ningn nivel de aislamiento de la transaccin se fij para el RS2, que tendr por defecto el nivel de aislamiento de la base de datos subyacente. 5.1.12 Caractersticas solicitando que no son compatibles Con la adicin de nuevas funcionalidades de la API de JDBC 2.0, es posible que una aplicacin para solicitar caractersticas que un DBMS o el controlador no son compatibles. Si el controlador no es compatible con los conjuntos de resultados desplazables, por ejemplo, se puede devolver un conjunto de resultados de slo avance. Adems, algunas consultas que devuelven un conjunto de resultados que no se puede actualizar, por lo que solicita un conjunto de resultados actualizable no tendra ningn efecto para esas consultas. Una regla general es que una consulta debe incluir la clave principal como una de las columnas que selecciona, y se debe hacer referencia a una sola tabla. Nuevos mtodos en la API de JDBC 2.0 permiten una aplicacin descubrir qu conjunto de resultados cuenta con un controlador es compatible. Si hay alguna duda sobre si una caracterstica es compatible, es aconsejable llamar a estos mtodos antes de solicitar la caracterstica. Los siguientes DatabaseMetaData mtodos indican si un controlador es compatible con un tipo de resultado o de un conjunto dado de concurrencia conjunto de resultados dado:

- devuelve un boolean que indica si el controlador es compatible con el tipo de resultado conjunto dado DatabaseMetaData.supportsResultSetConcurrency - devuelve un boolean que indica si el controlador es compatible con el tipo de concurrencia administra en combinacin con el tipo de resultado conjunto dado
DatabaseMetaData.supportsResultSetType

Los siguientes ResultSet mtodos devuelven el tipo de conjunto de resultados y la concurrencia del conjunto de resultados para el conjunto de resultados concreto en el que se llama el mtodo:

- devuelve el tipo de este conjunto de resultados ResultSet.getConcurrency - devuelve el modo de simultaneidad de este conjunto de resultados
ResultSet.getType

Si una aplicacin especifica un conjunto de resultados desplazable y el controlador no admite el desplazamiento, el conductor emitir una advertencia en la Connection objeto que produce la declaracin y devolver un conjunto de resultados es de slo avance. Incluso si el controlador es compatible con los conjuntos de resultados desplazables, es posible que una solicitud para pedir un tipo de desplazamiento que el controlador no es compatible. En tal caso, el conductor emitir un SQLWarning en la Connection objeto que produce la declaracin y devuelven un resultado desplazable conjunto de un tipo que hace de soporte, incluso si ste es distinto del tipo exacto requerido. Por ejemplo, si una aplicacin solicita un TYPE_SCROLL_SENSITIVE conjunto de resultados y el controlador no es compatible con ese tipo, podra devolver un TYPE_SCROLL_INSENSITIVEconjunto de resultados si es compatible con ese tipo. El conductor tambin alertara a la aplicacin que no se devolver el tipo exacto solicitado mediante la emisin de un SQLWarning en la Connection objeto que produce la declaracin que solicita el tipo de conjunto de resultados sin soporte. Del mismo modo, si una aplicacin especifica un conjunto de resultados actualizable, un controlador que no es compatible con los conjuntos de resultados actualizables emitir un SQLWarning en la Connection objeto que produce la declaracin y devolver un conjunto de resultados de slo lectura. Si las solicitudes de aplicacin tanto en un tipo no compatible conjunto de resultados y un tipo de concurrencia sin apoyo, el conductor debe elegir el tipo de primer conjunto de resultados. En algunas situaciones, un conductor que tenga que elegir un conjunto alternativo tipo de resultado o de la concurrencia tipo en tiempo de ejecucin de la declaracin. Por ejemplo, un SELECT declaracin que contiene una combinacin en mltiples tablas pueden producir un conjunto de resultados no es actualizable. En tal situacin, el conductor emitir un SQLWarning en la Statement , PreparedStatement o CallableStatementobjeto que trat de crear el conjunto de resultados en lugar de emitir que en la Connection del objeto. El conductor entonces elegir un adecuado conjunto de resultados de tipo y / o el tipo de concurrencia de acuerdo con las directrices en los dos prrafos anteriores. 5.1.13 Uso de mtodos de updateXXX Un ResultSet objeto puede ser actualizada (tienen sus filas modificadas, insertadas o eliminadas) mediante programacin si el tipo de concurrencia es CONCUR_UPDATABLE . El API JDBC 2.0 aade updateXXX mtodos y varios otros mtodos para el ResultSet interfaz de modo que las filas se pueden actualizar mediante programacin, tanto en el ResultSet objeto y la base de datos.

Los nuevos updateXXX mtodos permiten actualizar los valores en un conjunto de resultados sin necesidad de utilizar comandos SQL. Hay una updateXXX mtodo para cada tipo de datos, y al igual que con los getXXX ysetXXX mtodos, la XXX es un tipo de datos en el lenguaje de programacin Java. Al igual que con los setXXX mtodos, el controlador convierte este tipo de datos a un tipo de datos de SQL antes de enviarlos a la base de datos. As, por ejemplo, el mtodo updateBoolean enva un JDBC BIT valor a la base de datos, y el mtodo updateCharacterStream enva un JDBC LONGVARCHAR valor a la base de datos. Los updateXXX mtodos toman dos parmetros, el primero para indicar que la columna se va a actualizar, y el segundo para dar el valor a asignar a la columna especificada. Como sucede con los getXXX mtodos, la columna se puede especificar, dando su nombre o su ndice. Si una aplicacin recupera un valor de un conjunto de resultados utilizando el nombre de la columna, por lo general se utiliza el nombre de la columna cuando se quiere actualizar ese valor. Igualmente, si el getXXX mtodo se le dio un ndice de columna para recuperar un valor, el correspondiente updateXXX mtodo generalmente se utiliza el ndice de columna para actualizar ese valor. Tenga en cuenta que el ndice de columna se utiliza con ResultSet mtodos se refiere al nmero de columna en el conjunto de resultados, no el nmero de columna en la tabla de base de datos, que bien podra ser diferente. (Los nmeros de columna ser el mismo slo en el caso en todas las columnas de una tabla se seleccionan.) En ambas tablas del conjunto de resultados y las tablas de base de datos, el ndice de la primera columna es 1 , el ndice de la segunda columna es 2 , y as sucesivamente. En el siguiente fragmento de cdigo, el valor en la tercera columna del ResultSet rs objeto se recupera mediante el mtodo getInt , y el mtodo updateInt se utiliza para actualizar ese valor de la columna con un intvalor de 88 :
int n = rs.getInt (3) / / n contiene el valor en la columna 3 de la RS . . . rs.updateInt (3, 88); / / el valor de la columna 3 de la RS se encuentra a 88 int n = rs.getInt (3) / / n = 88

Si la tercera columna se llama SCORES , las siguientes lneas de cdigo tambin se actualizar la tercera columna del ResultSet rs objeto asignndole el int valor de 88 :
int n = rs.getInt ("Decenas");

. . . rs.updateInt ("Decenas", 88);

Los updateXXX mtodos de actualizar un valor en la fila actual del conjunto de resultados, pero no actualiza el valor en la tabla de base de datos subyacente. Es el mtodo updateRow que actualiza la base de datos. Es muy importante que el updateRow mtodo se llama cuando el cursor se encuentra todava en la fila actual (en la fila para ser actualizado). De hecho, si una aplicacin se mueve el cursor antes de llamar updateRow , el conductor debe descartar la actualizacin, y ni el conjunto de resultados, ni la base de datos ser actualizada. La solicitud expresa de cancelar los cambios a una fila llamando al mtodo cancelRowUpdates . Para entrar en vigor, debe ser llamado despus de que el mtodo de updateXXX se llama y antes de que el mtodoupdateRow se llama. Si cancelRowUpdates se llama en cualquier otro momento, no tiene ningn efecto. El siguiente ejemplo muestra la actualizacin de las columnas segunda y tercera en la cuarta fila del ResultSet rs objeto. Ya que las actualizaciones afectan a la fila actual, el cursor se mueve a la primera fila para ser actualizado, que en este caso es la cuarta fila. A continuacin, el mtodo de updateString is llamado a cambiar el valor de la segunda columna de la RS de 321 Kasten . El mtodo updateFloat cambia el valor en la tercera columna de la RS a 10101.0 . Finalmente, el mtodo updateRow est llamada a actualizar la fila de la base de datos que contiene los dos valores de las columnas modificadas.
rs.absolute (4); rs.updateString (2, "321 Kasten"); rs.updateFloat (3, 10101.0f); rs.updateRow ();

Si la segunda columna se denomina ADDRESS y la tercera columna se denomina AMOUNT , el cdigo siguiente tendr exactamente el mismo efecto que el ejemplo anterior.
rs.absolute (4); rs.updateString ("Direccin", "321 Kasten"); rs.updateFloat ("cantidad", 10101.0f); rs.updateRow ();

Adems de hacer actualizaciones mediante programacin, el ncleo de JDBC 2.0 API proporciona la posibilidad de enviar actualizaciones por lotes. La instalacin de actualizacin por lotes opera a travs de unaStatement objeto, que se explica en la seccin "Envo de actualizaciones por lotes" en la pgina 39 .

5.1.14 Eliminacin de una fila El JDBC 2.0 proporciona el mtodo deleteRow de manera que una fila en un ResultSet objeto puede ser eliminada mediante los mtodos en el lenguaje de programacin Java. Este mtodo elimina la fila actual, as que antes de llamar a deleteRow , una aplicacin debe situar el cursor en la fila que quiere eliminar. A diferencia de los updateXXX mtodos, que afectan slo a una fila en el conjunto de resultados, este mtodo afecta tanto a la fila actual del conjunto de resultados y la fila que subyace en la base de datos. Las siguientes dos lneas de cdigo quitar la primera fila de la ResultSet objeto rs y tambin eliminar la fila subyacente de la base de datos (que puede o puede no ser la primera fila de la tabla de base).
rs.first (); rs.deleteRow ();

5.1.15 Insertar filas Las nuevas filas se pueden insertar en una tabla de conjunto de resultados y en la tabla de base de datos subyacente utilizando nuevos mtodos en la JDBC 2,0 ncleo API. Para hacer esto posible, la API define el concepto de una fila de insercin. Esta es una fila especial, asociado con el conjunto de resultados, pero no forman parte de ella, que sirve como un rea de ensayo para la construccin de la fila que se va a insertar. Para acceder a la fila de insercin, una aplicacin llama al ResultSet mtodo moveToInsertRow , que posiciona el cursor en la fila de insercin. A continuacin, llama a los correspondientes updateXXX mtodos para agregar valores de la columna a la fila de insercin. Cuando todas las columnas de la fila que se inserta se han establecido, la aplicacin llama al mtodo insertRow . Este mtodo agrega la fila de insercin tanto para el conjunto de resultados y la base de datos subyacente de forma simultnea. Por ltimo, la aplicacin necesita para colocar el cursor en una fila en el conjunto de resultados. El siguiente fragmento de cdigo muestra estos pasos para insertar una fila de una aplicacin escrita en el lenguaje de programacin Java.
rs.moveToInsertRow (); rs.updateObject (1, myArray); rs.updateInt (2, 3857); rs.updateString (3, "Misterios"); rs.insertRow (); rs.first ();

Varios detalles merecen atencin. En primer lugar, es posible recuperar los valores de la fila de insercin utilizando las ResultSet.getXXX mtodos. Hasta un valor ha sido asignado a la fila de insercin con unaupdateXXX mtodo, sin

embargo, su contenido no estn definidos. Por lo tanto, si un getXXX mtodo se llama despus de la moveToInsertRow mtodo ha sido llamado, pero antes de un updateXXX mtodo ha sido llamado, el valor que devuelve ser indefinido. En segundo lugar, llamar a un updateXXX mtodo en la fila de insercin es diferente de llamarlo en una fila en the ResultSet objeto. Cuando el cursor se encuentra en una fila de un conjunto de resultados, una llamada a un updateXXX mtodo cambia un valor en el conjunto de resultados. Cuando el cursor est en la fila de insercin, una llamada a un updateXXX mtodo actualiza un valor en la fila de insercin, pero no hace nada para el conjunto de resultados. En ambos casos, sin embargo, la updateXXX mtodo no tiene ningn efecto sobre la base de datos subyacente. En tercer lugar, una llamada al mtodo insertRow , lo que aade la fila de insercin tanto para el conjunto de resultados y la base de datos, puede iniciar una SQLException si el nmero de columnas en la fila de insercin no coincide con el nmero de columnas en la tabla de base de datos. Por ejemplo, si una columna no se le da un valor llamando a un updateXXX mtodo, una SQLException ser lanzado a menos que la columna permite valores nulos. Adems, si el conjunto de resultados no se encuentra una columna, que tambin se producir una SQLException para ser echada a menos que la columna permite valores nulos. En cuarto lugar, un conjunto de resultados no pierde de vista que su cursor se coloca cuando el cursor se mueve a la fila de insercin. Como resultado, una llamada al mtodo ResultSet . moveToCurrentRow devolver el cursor a la fila que era la fila actual inmediatamente antes del mtodo moveToInsertRow fue llamado. Los mtodos de otros movimientos del cursor tambin trabajan desde la fila de insercin, incluyendo aquellos que utilizan el posicionamiento relativo a la fila actual. 5.1.16 actualizaciones posicionadas Antes del JDBC 2.0 API hizo cambios programticos disponibles en el lenguaje de programacin Java, la nica manera de cambiar una fila que se haba exagerado con un conjunto de resultados era utilizar lo que se llama una actualizacin posicionada. Una actualizacin de posicin se hace con comandos SQL y requiere de un cursor llamado para indicar la fila del conjunto de resultados en el que las actualizaciones se deben hacer. La Statement la interfaz proporciona el mtodo setCursorName , lo que permite a una aplicacin especificar un nombre de cursor para que el cursor asociado con el

siguiente conjunto de resultados producidos por un comunicado. Este nombre se puede utilizar en la actualizacin de SQL o DELETE de posicin para identificar la fila actual en el ResultSet generado por objeto la declaracin. Con el fin de permitir una actualizacin o eliminacin posicionada en un conjunto de resultados, la consulta que lo produce debe tener la siguiente forma:
SELECT. . . DE. . . WHERE. . . FOR UPDATE. . .

Incluyendo las palabras " FOR UPDATE "asegura que el cursor tiene el nivel de aislamiento adecuado para apoyar una actualizacin. Despus de que el mtodo executeQuery que se ha llamado en la declaracin, el nombre del cursor para el resultado ResultSet objeto puede ser obtenida llamando a la ResultSet mtodo getCursorName . Si un DBMS permite actualizaciones o eliminaciones posicionadas posicionados, el nombre del cursor puede ser suministrado como un parmetro al comando SQL para las actualizaciones o eliminaciones. Una Statement otro objeto que el que cre el ResultSet objeto debe ser utilizado para la actualizacin de posicin. El siguiente fragmento de cdigo, en el que stmt y instr2 dos diferentes Statement los objetos, se muestra la forma de nombrar a un cursor y luego usarlo en una instruccin de actualizacin de SQL:
stmt.setCursorName ("x"); ResultSet rs = stmt.executeQuery ( "SELECT ... FROM ... WHERE ... FOR UPDATE ...") Cadena CursorName = rs.getCursorName; int UpdateCount stmt2.executeUpdate = ( "UPDATE ... WHERE CURRENT OF" + CursorName);

Tenga en cuenta que slo porque el mtodo getCursorName ha sido invocada en un ResultSet objeto no significa necesariamente que se puede actualizar utilizando los ResultSet.updateXXX mtodos disponibles en la API central de JDBC 2.0. Con el fin de actualizar un ResultSet objeto utilizando las updateXXX mtodos, el executeQuery declaracin que produce el conjunto de resultados debe incluir las especificacionesCONCUR_UPDATABLE . actualizaciones posicionadas, sin embargo, son posibles para un conjunto de resultados creado sin esta especificacin si todos los pasos adecuados: ( 1) un cursor se llama, (2) la consulta SQL que produce el conjunto de resultados es de la forma SELECT. . . DE. . . WHERE. . . FOR UPDATE. . ., Y (3) la instruccin de actualizacin de SQL es de la forma UPDATE . . . WHERE CURRENT OF
<cursorName>UPDATE . . . WHERE CURRENT OF <cursorName> UPDATE . . . WHERE CURRENT OF <cursorName>

No todos los DBMS admite actualizaciones posicionadas. Para verificar que un DBMS soporta actualizaciones posicionadas, una aplicacin puede llamar a la DatabaseMetaData mtodossupportsPositionedDelete y supportsPositionedUpd ate para descubrir si una conexin particular es compatible con estas operaciones. Cuando cuentan con el apoyo, el DBMS / conductor debe asegurarse de que las filas seleccionadas estn bien cerrada para que las actualizaciones posicionadas no dan lugar a anomalas de actualizacin u otros problemas de concurrencia. 5.1.17 consultas que producen conjuntos de resultados actualizables Algunas consultas se producen conjuntos de resultados que no se pueden actualizar sin importar el tipo de conjunto de resultados. Por ejemplo, una consulta que no se selecciona la columna de clave principal podra generar un conjunto de resultados que no se puede actualizar. Debido a las diferencias en las implementaciones de bases de datos, el ncleo de la API de JDBC 2.0 no especifica un conjunto exacto de consultas SQL que deben ser tales que los conjuntos de resultados actualizables. En su lugar, define un conjunto de criterios, que generalmente producen conjuntos de resultados actualizables para los conductores de que la capacidad de actualizacin compatible con JDBC apoyo. Si las consultas se adhieren a las directrices siguientes, en general, un desarrollador puede esperar que van a producir conjuntos de resultados actualizables: 1. La consulta hace referencia nicamente una sola tabla en la base de datos 2. La consulta no contiene una operacin de unin o un GROUP BY clusula de 3. La consulta selecciona la clave principal de la tabla que hace referencia Si inserta deben llevarse a cabo en el conjunto de resultados, una consulta SQL debe satisfacer las condiciones de uno a tres, adems de las siguientes tres condiciones adicionales: 4. El usuario ha de lectura / escritura privilegios de base de datos sobre la mesa 5. La consulta selecciona todas las columnas no admiten valores NULL en la tabla subyacente 6. La consulta selecciona todas las columnas que no tienen un valor por defecto

Las condiciones cuarta y quinta son necesarias debido a una fila que se inserta en una tabla debe tener un valor para cada columna de la tabla a menos que la columna acepta valores nulos o valores por defecto. Si el conjunto de resultados en los que las operaciones de insercin se van a realizar no contiene todas las columnas que necesita un valor, la insercin se producir un error. Resultado establece creado por otros medios distintos de la ejecucin de una consulta, como los devueltos por varios mtodos en la DatabaseMetaData interfaz, no son desplazable o actualizable, ni estn obligados a ser. 5.1.18 Utilizar secuencias de los valores de fila muy grandes Dos nuevas interfaces en el ncleo de JDBC 2.0 API, Blob y Clob , son el mapeo de la SQL3 los tipos de datos BLOB (Binary Large Object) y CLOB (LargeObject caracteres) en el lenguaje de programacin Java. Con la disponibilidad de estos tipos de datos, bases de datos, sin duda, comenzar a utilizarlas para almacenar binarios muy grandes u objetos de carcter. Si este es el caso, el ResultSet mtodos getBlob y getClob se debe utilizar para recuperarlos. Usando slo el API JDBC 1.0, un ResultSet objeto todava hace posible para recuperar arbitrariamente grande LONGVARBINARY o LONGVARCHAR datos. Los mtodos getBytes y getString de datos de retorno como una gran parte (hasta los lmites impuestos por el valor de retorno de Statement.getMaxFieldSize ). Es posible recuperar esta gran parte de los datos en pequeas y de tamao fijo trozos. Esto se logra haciendo que los ResultSet clase de retorno java.io.Input corrientes de la cual los datos pueden ser ledos en trozos. Tenga en cuenta que estos flujos se debe acceder de forma inmediata, ya que se cerrar automticamente cuando el prximo getXXX mtodo es llamado en el ResultSet objeto. (Este comportamiento no es una limitacin de la API de JDBC, sino ms bien una limitacin en el acceso a gran burbuja impuesta por las implementaciones subyacentes en algunos sistemas de bases de datos.) El API JDBC 1.0 tiene tres mtodos diferentes para obtener los arroyos, cada uno con un valor de retorno distinto:

- devuelve una secuencia que slo proporciona los bytes sin formato a partir de la base de datos sin ningn tipo de conversin getAsciiStream - devuelve una secuencia que provee de un byte, caracteres ASCII. Este mtodo puede ser ms eficiente para un DBMS que almacena caracteres en formato ASCII.
getBinaryStream

- devuelve una secuencia que proporciona caracteres de dos bytes Unicode. Este mtodo, aunque todava est disponible, ha sido desaprobado en favor del nuevo mtodogetCharacterStream . (Ver ms abajo.)
getUnicodeStream

El siguiente mtodo para la recuperacin de las corrientes de caracteres ASCII y Unicode es nuevo en el ncleo de JDBC 2.0 API:

- devuelve una java.io.Reader objeto que proporciona caracteres Unicode. No importa cmo algunos personajes DBMS tiendas, el conductor va a volver como una secuencia de caracteres Unicode.
getCharacterStream

Obsrvese que la secuencia devuelta por getAsciiStream devuelve una secuencia de bytes en el que cada byte es un carcter ASCII. Esto difiere de getCharacterStream , que devuelve una secuencia de caracteres de dos bytes Unicode. El mtodo getCharacterStream se puede utilizar para caracteres ASCII y Unicode porque el conductor se convertir caracteres ASCII a Unicode antes de que vuelva un Reader objeto. Si tiene que usar getUnicodeStream debido a su DBMS y el controlador no son compatibles con el API JDBC 2.0, tenga en cuenta tambin que las corrientes de JDBC Unicode big-endian regresar de datos, es decir, que esperan que los datos con el byte alto primero y el segundo byte bajo Esto se ajusta a. la norma endian definido por el lenguaje de programacin Java, lo cual es importante si un programa es para ser porttil. Consulte la especificacin de Java TM Virtual Machine, de Tim Lindholm y Yellin Frank, para obtener informacin ms detallada sobre el big-endian orden. El siguiente fragmento de cdigo muestra cmo utilizar el getAsciiStream mtodo.
stmt = java.sql.Statement con.createStatement (); ResultSet rs = stmt.executeQuery ("SELECT * FROM Tabla 2 x"); / / Ahora recuperar la columna 1 resultados en 4 trozos K: byte [] buf = new byte [4096]; while (rs.next ()) { java.io.InputStream aleta = rs.getAsciiStream (1); para (; ;) { int size = fin.read (buff); if (tamao == -1) {/ / al final de la secuencia de break; } / / Enviar el buffer de nuevo lleno hasta cierto flujo de salida ASCII output.write (buff, 0, tamao);

} }

5.1.19 Valores de resultado nulo Para determinar si un valor resultado dado es JDBC NULL , primero hay que leer la columna y, a continuacin utilice el mtodo ResultSet.wasNull . Esto es cierto porque un JDBC NULL recuperado por uno de losResultSet.getXXX mtodos pueden ser convertidos a cualquiera null , 0 , o false , segn el tipo del valor. La siguiente lista muestra los valores devueltos por las distintas getXXX mtodos cuando se han recuperado un JDBC NULL .

-para aquellos getXXX mtodos que devuelven los objetos en el lenguaje de programacin Java y getRef ) 0 (cero)-para getByte , getShort , getInt , getLong , getFloat y getDouble false -de getBoolean
null

Por ejemplo, si el mtodo getInt devuelve 0 en una columna que permite null los valores, la solicitud no se puede saber a ciencia cierta si el valor de la base de datos era 0 o NULL hasta que se llama al mtodo wasNull, como se muestra en el siguiente fragmento de cdigo, donde rs es un ResultSet objeto.
int n = rs.getInt (3); boolean b = rs.wasNull ();

Si b es true , el valor almacenado en la tercera columna de la fila actual de rs es JDBC NULL . El mtodo wasNull comprueba slo el ltimo valor recuperado, por lo que para determinar si n es NULL , wasNull tuvo que ser llamado antes de que otro getXXX mtodo ha sido invocado. 05/01/20 Cierre de un objeto ResultSet Normalmente, no hay que hacer para cerrar un ResultSet objeto, que se cierra automticamente por la Statement objeto que se genera cuando la Statement objeto est cerrado, se vuelve a ejecutar, o se utiliza para recuperar el siguiente resultado de una secuencia de mltiples resultados . El mtodo de close se proporciona para que un ResultSet objeto puede ser cerrada de forma explcita, por lo que de inmediato la liberacin de los recursos mantenidos por el ResultSet objeto. Esto podra ser necesaria cuando varias declaraciones estn siendo utilizados y el cierre automtico no se produce lo suficientemente pronto para prevenir los conflictos de base de datos de recursos.

5.1.21 JDBC Cumplimiento Los conductores que sean compatible con JDBC normalmente admite conjuntos de resultados desplazables, pero no estn obligados a hacerlo. La intencin es que los drivers JDBC para ejecutar conjuntos de resultados desplazable mediante el apoyo prestado por los sistemas de bases de datos subyacentes. Si el DBMS no proporciona soporte para scrollability, el controlador puede omitir esta caracterstica. Hacer opcional scrollability no est destinado a alentar a la omisin de la misma. Es simplemente la intencin de minimizar la complejidad de la aplicacin de drivers JDBC para fuentes de datos que no son compatibles scrollability. En efecto, la alternativa, se recomienda para un controlador para aplicar scrollability como una capa en la parte superior del DBMS. Una forma de hacerlo es poner en prctica un conjunto de resultados como un conjunto de filas. El RowSet interfaz, que proporciona mtodos para hacer esto, es parte de la extensin estndar JDBC API.

Vous aimerez peut-être aussi