b3t6 - LAB Java avanzado Flashcards
Cuáles son los directorios por defecto que usa Maven, y para qué sirven?
- src/main/java : donde guardaremos nuestras clases java fuente. Debajo de esta carpeta situaremos nuestras clases en distintos paquetes.
- src/main/resources : aquí almacenaremos los recursos (ficheros xml, ficheros de propiedades, imagenes, …) que pueda necesitar las clases java de nuestro proyecto. Igualmente aquí tienen que ir los ficheros de configuración de Spring o Hibernate por ejemplo.
- src/test/java : en dicha carpeta se guardan las clases de test que se encargarán de probar el correcto funcionamiento de nuestra aplicación. Aquí por ejemplo podemos guardar nuestros test unitarios de JUnit.
- src/test/resources : en esta carpeta guardamos los recursos que usan los recursos.
- target: donde deja los compilados
Qué partes tiene principalmente el pom.xml de Maven? Qué campos importantes tiene cada una?
-
Información básica de maven -> tiene la ruta del proyecto, el id del proyecto, la versión del proyecto y el tipo de empaquetado principalmente
– modelVersion -> versión de maven
– groupId -> rutal del proyecto
– artifactId -> id del proyecto
– version -> versión del proyecto
– packaging -> tipo de empaquetado para build del proyecto - Lista de dependencias -> en una lista “dependencies/dependecy/”
– groupId -> grupo de la dependencia en los repositorios maven
– artifactId -> id de la dependencia
– version -> versión de la dependencia
– scope -> El ámbito de aplicación de las dependencias, incluida la compilación, la provisión, el tiempo de ejecución, la prueba, el sistema y las exclusiones
Comandos maven para
- Limpia el directorio de destino eliminando los archivos generados previamente.
- Compila el código fuente del proyecto.
- Ejecuta las pruebas unitarias del proyecto.
- Empaqueta el código compilado y los recursos en un archivo JAR, WAR u otro formato según la configuración del proyecto.
- Instala el paquete en el repositorio local para ser utilizado como dependencia en otros proyectos locales.
- Despliega el paquete en un repositorio remoto para compartirlo con otros desarrolladores.
- Realiza una limpieza, compilación y instalación en un solo comando.
- Realiza una limpieza y empaquetado en un solo comando.
- Realiza una limpieza y ejecución de pruebas en un solo comando.
- Muestra el árbol de dependencias del proyecto.
- Muestra la ayuda y la documentación de Maven.
Aquí tienes una lista de comandos de consola típicos de Maven (MVN):
-
mvn clean
: Limpia el directorio de destino eliminando los archivos generados previamente. -
mvn compile
: Compila el código fuente del proyecto. -
mvn test
: Ejecuta las pruebas unitarias del proyecto. -
mvn package
: Empaqueta el código compilado y los recursos en un archivo JAR, WAR u otro formato según la configuración del proyecto. -
mvn install
: Instala el paquete en el repositorio local para ser utilizado como dependencia en otros proyectos locales. -
mvn deploy
: Despliega el paquete en un repositorio remoto para compartirlo con otros desarrolladores. -
mvn clean install
: Realiza una limpieza, compilación y instalación en un solo comando. -
mvn clean package
: Realiza una limpieza y empaquetado en un solo comando. -
mvn clean test
: Realiza una limpieza y ejecución de pruebas en un solo comando. -
mvn dependency:tree
: Muestra el árbol de dependencias del proyecto. -
mvn help
: Muestra la ayuda y la documentación de Maven.
El el campo scope de una dependecia del pom.xml de maven, qué opciones hay y qué son cada una?
- Compile -> Es la que se usa por defecto si no se pone. Dependencias necesarias para la construcción , por lo que estarán el el classpath de construcción
- Provided -> Dependencias que no aportamos en nuestro proyecto, porque ya están donde se vaya a desplegar el proyecto, por ejemplo en un contenedor web que ya tiene esas librerías
- Runtime -> Para las dependencias que se necesitan en tiempo de ejecución pero no antes, por ejemplo un driver jdbc. Por lo que estarán en el classpath de runtime
- Test -> Depencias que solo se usan en el runtime de los test, no de la aplicación
- System -> Parecido a provided. Deprecado
- Import -> para importar otros pom.xml
Qué fases tiene el ciclo de vida “default” de maven?
1.- validate
2.- compile
3.- test (segun los casos de prueba del directorio src/test/java)
4.- package (jar, war, ear, …)
5.- verify
6.- install (local repository)
7.- deploy (remote repository)
Cuál es el comando para usar la herramienta maven por consola?
mvn
Si hablamos de reflexión en java, cómo se usa en pocas palabras?
qué clases se usarían para manejar los aspectos principales?
Consiste en hacer código muy genérico, declarando métodos que recogen Object, para poder pasarle lo que sea, y luego dentro, obteniendo el nombre de la clase del objeto y el nombre de sus campos, poder hacer cosas con ellos.
objetc.getClass() –> devuelve un Class
clase.getSimpleName() -> devuelve un string con el nombre de la clase
clase.getDeclaredFlieds() -> devuelve un array de Fields, que son los atributos de la clase
atributo.getName() -> devuelve el nombre del Field (atrbuto)
Qué diferencias hay entre los siguientes conceptos de JDBC?
Driver
DriverManager
DataSource
Driver -> es específico del fabricante del SGBD
DriverManager -> Capa de más alto nivel para hacerle peticiones al Driver
DataSource -> Como el DriverManager pero para aplicaciones multiusuario, que internamente le pide al Driver y gestiona un pool de conexiones
Qué pasos usaríamos en JDBC para hacer consultas a una BBDD?
- Cargar en memoria el driver del fabricante -> Class.forName(“com.mysql.jdbc.Driver”
- Pedirle una conexión al Driver (o mediante el Datasource). Para ello se ha de especificar la URL de la BBDD, usuario y contraseña -> Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Ejemplos de URLs de distintos SGDB
// jdbc:oracle:thin:user/password@localhost:1521:SID
// jdbc:mysql://localhost/BD
// jdbc:postgresql://localhost/BD
// jdbc:sqlserver://localhost;instance=SQLEXPRESS;databaseName=BD
// jdbc:mariadb://localhost/BD
// jdbc:h2:mem:BD
// jdbc:hsqldb:mem:BD - Establecer la sentencia a ejecutar con Statement, PreparedStatement (precompiladas y configurable), o CallableStatement (Procedimientos almacenados) -> Statement stmt = conn.createStatement();
- Ejecutar la sentencia -> ResultSet rs = stmt.executeQuery(QUERY);)
- Recorrer el resultado con ResultSet
Cuál es el método de preparedStatement que se usa cuando la query es una select y cuál cuando la query es un insert, update o delete?
.executeQuery() -> devuelve un Resulset
.executeUpdate() -> devuelve el número de filas afeptadas
.execute() -> devuelve ResultSet o número de filas afectadas en función del tipo de sentencia pasada
Qué son los modules en Java9 y en qué fichero se configuran?
Un module permite generar un jar pero sin todas las clases de los paquetes incluídos, evitando tener que incluir todas
Se configura en el fichero module-info.java donde se especifica lo que se exportará en el jar del module -> “export”, y las dependencias del module -> “requires”
module ModuloA {
exports com.arquitecturajava.core;
exports com.arquitecturajava.utils;
requires es.tai.modulo.user;
requires es.tai.modulo.bbdd;
}
En la programación funcional en java, qué anotación se ha inventado y para qué sirve?
La anotación @FunctionalInterface
Es una interfaz de un sólo método abstracto, y puede tener métodos default (métodos implementados) y métodos estáticos (que se pueden llamar como si fuesen de clase, como un método estático en una clase normal)
Se usan para expresiones lambda, aplicando estas funciones sobre streams de objetos, encadenándolas
Se han creado varias especializaciones, como la clase Function
En java8, qué es la palabra default al declarar un método?
default public void g(){}
Se usa en clases abstractas o interfaces, para poder implementar el método a ese nivel, ya que por defecto no se puede en los métodos abstractos
Para qué se usan las siguientes especializaciones de @FunctionalInterface
// Consumer<T> --> metodo accept(T)
// Supplier<T> --> metodo get()
// Predicate<T>
// metodo and(Predicate) --> composicion
// metodo test(T) --> boolean
// Function<T,R>
// metodo apply(T) --> R
// metodo andThen(Function) --> composicion</T></T></T>
// Consumer<T> --> metodo accept(T) --> Función que no devuelve parámetros
// Supplier<T> --> metodo get() -> Función que no acepta parámetros, sólo devuelve
// Predicate<T> -> Función para hacer filtros en base a una condición
// metodo and(Predicate) --> composicion
// metodo test(T) --> boolean
// Function<T,R> -> Función normal
// metodo apply(T) --> R
// metodo andThen(Function) --> composicion</T></T></T>
Para qué sirven los siguientes métodos importantes de la interfaz Stream, que trabajan pasándole objetos funcionales (@FunctionalInterface o sus especializaciones)
// filter(Predicate) --> Stream // map(Function) --> Stream // reduce(BinaryOperator) -> T // forEach(Consumer) --> void
Convertir un List a stream -> nombres.stream()
// filter(Predicate) –> Stream -> Filtrar por una condición
// map(Function) –> Stream -> Mapear dos valores
// reduce(BinaryOperator) -> T -> Aplicar alguna fórmula
// forEach(Consumer) –> void