¡Java 8 finalmente ha llegado! Operar la base de datos.
El método funcional para procesar datos
Java 8 no solo agrega soporte funcional, sino que también expande la clase de recolección por nuevos datos de procesamiento de funciones.
Por ejemplo, suponga que tiene una colección de colección: Cliente: Cliente:
COLECCIÓN <CLIENTE> Clientes;
Si solo está interesado en los clientes de Bélgica, tendrá todos los objetos del cliente y solo ahorrará lo que necesita.
Colección <Customer> belgians = new ArrayList <() ();
Esto no solo cuesta 5 líneas de código, pero no es muy abstracto. Código roscado para reescribir todo el código.
Con Java 8, solo una línea de código puede lograr las mismas características. Solo haz la filtración.
CLIENTS.stream ().
El código de la versión Java 8 no solo es más corto, sino que también es más fácil de entender. Pasar el tiempo en la interpretación del código en el ciclo de interpretación para comprender lo que está haciendo para sus datos.
¿Qué debo hacer si desea ejecutar este código simultáneamente?
Clientes.ParallelStream ().
Lo que es más emocionante es que este código de estilo funcional también es aplicable a la base de datos
Utilice un método de función en la base de datos
Tradicionalmente, los programadores deben usar una base de datos especial para consultar la declaración para acceder a los datos de la base de datos.
Preparado Stratement S = Con.PrepareStatement ("Seleccionar *" + "del cliente c" + "donde c.country =?");La mayoría de estos códigos son cadenas, lo que hará que el compilador no encuentre errores y este código apresurado causará problemas de seguridad. Proporcione un lenguaje de consulta de bases de datos, puede resolver verificaciones incorrectas y problemas de seguridad. O use la herramienta de mapeo de relaciones de objetos para evitar una gran cantidad de código aburrido, pero solo se pueden usar en el acceso general a las consultas.
Use Java 8 para consultar la base de datos por API funcional. Por ejemplo, Jinq es un proyecto de código abierto, y qué futura API de base de datos que explora puede hacer posible la programación funcional. Aquí hay una consulta de base de datos usando Jinq:
CLIENDES
Este código es casi el mismo que el código que usa una API de transmisión. Cuando se ejecuta el código, Jinq se traducirá automáticamente en un código de consulta de la base de datos, al igual que la consulta JDBC antes.
En este caso, incluso si no ha aprendido un nuevo lenguaje de consulta de bases de datos, puede escribir una consulta de base de datos eficiente. Puede usar el mismo estilo de código para recopilar en Java. No necesita un compilador Java o máquina virtual especial. Toda la compilación de códigos y ejecutándose en Java 8 JDK ordinario. Si su código está mal, el compilador los encontrará e informará a usted, al igual que un código Java ordinario.
Jinq admite la misma consulta compleja que SQL92. El algoritmo del código Java de traducción a una consulta de base de datos es muy flexible, siempre que pueda aceptarlo, puede traducir. Por ejemplo, Jinq puede traducir la consulta de la base de datos a continuación, aunque es complicada.
Customers .Where (C-> C.getCountry (). Equals ("Belgium") .Where (c-> {if (c.getsalarly () <100000) Return c.getsALALALALALALALALALALALALAALAAALAAAALAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA a his a a onectctctctctctctctct his his role work work work Trabajo Trabajo Trabajo Trabajo Trabajo Trabajo Trabajo Trabajo Trabajo TrabajoComo puede ver, la programación funcional de Java 8 es muy adecuada para la consulta de la base de datos. Y la consulta es compacta e incluso las consultas complicadas pueden ser competentes.
Operación interna
Pero, ¿cómo trabajas? ¿Cómo pueden los compiladores de Java ordinarios convertir el código Java en la consulta de la base de datos? ¿Qué tiene de especial Java 8 para hacer esto posible?
La clave para admitir estos nuevos PI de base de datos que admiten estas funciones es un método de análisis de bytecode llamado "ejecución simbólica". Aunque su código es compilado por un compilador Java ordinario y se ejecuta en una máquina virtual Java ordinaria, Jinq puede analizar y construir una consulta de base de datos cuando se le compilan el código Java. Al usar la API Java 8 Streams, a menudo se encuentra que al analizar funciones cortas, el efecto laboral de la ejecución simbólica es el mejor.
Para comprender cómo funciona esta ejecución simbólica, la forma más fácil es usar un ejemplo. Comprobemos cómo Jinq se convierte las siguientes consultas al lenguaje de consultas SQL:
CLIENTES. DONDE (C-> C.GETCOUNTRY (). EQUALS ("Bélgica"))))))) Inicialmente, las variables de los clientes es una colección, y su consulta de base de datos correspondiente es:
Seleccionar * de los clientes c
Luego, se llama el método Where () y se le pasa una función. En el método Where (), Jinq abre el archivo .class de esta función para obtener el código de byte compilado por esta función para el análisis. En este ejemplo, no use el código de byte real, usemos algunas instrucciones simples para representar el código de byte de esta función:
d = c.getCountry () e = "bélgica" e = d.equals (e) return e
Aquí, suponemos que la función ha sido compilada por el compilador Java en estas cuatro instrucciones. Cuando se llama el método Where (), Jinq ve estos. ¿Cómo puede Jinq comprender este código?
Jinq se analiza ejecutando código. Pero Jinq no ejecuta el código directamente. Es un código de operación "abstracto": sin variables reales y valores reales, Jinq usa símbolos para indicar todos los valores al ejecutar código. Es por eso que este análisis se llama "ejecución simbólica".
Jinq ejecuta cada instrucción y rastrea todo lo que todos los efectos secundarios o el código cambian durante el estado del programa. El siguiente es un gráfico que muestra todos los efectos secundarios encontrados cuando Jinq realiza las cuatro líneas de código en ejecución simbólica.
Ejemplo de ejecución simbólica
En la figura, puede ver que después de que se ejecuta la primera instrucción, Jinq descubrió dos efectos secundarios: la variable D ha cambiado y se llamó al método Customer.getCountry (). Debido a que es una ejecución simbólica, la variable D no da un valor real de un real, como "EE. UU." O "Dinamarca", que se asigna a un valor simbólico de C.GetCountry ().
Después de ejecutar todas estas instrucciones, Jinq simplificó los efectos secundarios. Debido a que las variables D y E son variables locales, cualquier variable se descartará después de que la función salga, por lo que estos efectos secundarios pueden ignorarse. Jinq también sabe que customer.getCountry () y string.equals () no modifica ninguna variable ni muestra ninguna salida, por lo que estos métodos pueden ignorarse. Como resultado, Jinq puede concluir que esta función solo producirá un rol, y devolverá C.getCountry ().
Una vez que Jinq ha entendido las funciones que se le pasan en el método Where (), puede mezclar el conocimiento de la consulta de la base de datos y dar una nueva consulta de base de datos en la colección de clientes.
Generar consultas de bases de datos
Así es como Jinq genera una consulta de base de datos desde su código. El uso de la ejecución simbólica significa que este método es bastante poderoso para diferentes modos de código de diferentes compiladores de Java. Si el código encontrado por Jinq tiene los efectos secundarios que no se pueden convertir en una consulta de base de datos, Jinq mantendrá su código sin cambios. Debido a que todo está escrito en el código Java normal, Jinq puede ejecutar ese código directamente, y su código producirá los resultados esperados.
Este simple ejemplo de traducción debería permitirle comprender cómo consultar la traducción de la traducción. Puede estar seguro de que estos algoritmos pueden generar correctamente consultas de bases de datos desde su código.
Hermosa perspectiva
Espero haberlo dejado probar una nueva forma de trabajo de base de datos traída por Java 8 en Java. La programación funcional compatible con Java 8 le permite escribir código para la base de datos para escribir código para la colección Java. Se espera que las API de base de datos existentes se extiendan para admitir este tipo de consulta.