Conceptos Esenciales de Programación Java: JDBC, POO y Control de Errores

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 9,81 KB

JDBC: Conexión a Bases de Datos con Java

Conexión de Java con MySQL desde Cero

Pasos Clave para la Conexión (Mnemotecnia: "DJEC"):

  1. Descargar el archivo .jar del conector de MySQL (MySQL Connector/J).

  2. Juntar el archivo .jar al proyecto en el IDE (botón derecho → Build Path → Add External Archives).

  3. Escribir el código de conexión.

  4. Conectar con DriverManager.getConnection(...).

Ejemplo básico:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/miBD", "usuario", "contraseña");

La Clase ResultSet en JDBC

Representa el resultado de una consulta SQL (SELECT).

Puedes recorrer sus filas con .next() y acceder a columnas con .getString("columna"), .getInt("columna"), etc.

while (rs.next()) {
    System.out.println(rs.getString("nombre"));
}

Uso de ResultSet en Sentencias SQL

📌 Solo se usa con sentencias SELECT, porque devuelve resultados (filas y columnas).

try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/miBD", "usuario", "contraseña");
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT nombre FROM jugadores")) {

    while (rs.next()) {
        System.out.println(rs.getString("nombre"));
    }

} catch (SQLException e) {
    e.printStackTrace();
}

Manejo de Recursos con try-with-resources

Es una versión del try que cierra automáticamente recursos como Connection, ResultSet, etc.

A diferencia de try-catch-finally, no hace falta escribir finally { recurso.close(); }.

try (Connection conn = ...; ResultSet rs = ...) {
    // uso normal
} catch (SQLException e) {
    e.printStackTrace();
}

Ejemplo Completo: Conexión, ResultSet y try-with-resources

try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bd", "user", "pass");
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT * FROM jugadores")) {
    while (rs.next()) {
        System.out.println(rs.getString("nombre"));
    }
} catch (SQLException e) {
    e.printStackTrace();
}

Excepciones Personalizadas en Java

Una excepción personalizada permite crear errores específicos para tu aplicación.

class MiExcepcion extends Exception {
    public MiExcepcion(String mensaje) {
        super(mensaje);
    }
}

public class PruebaExcepcion {
    public static void main(String[] args) {
        try {
            lanzarExcepcion();
        } catch (MiExcepcion e) {
            System.out.println("Error personalizado: " + e.getMessage());
        }
    }

    public static void lanzarExcepcion() throws MiExcepcion {
        throw new MiExcepcion("Algo salió mal en el partido");
    }
}

Conceptos de Programación Orientada a Objetos (POO)

Sobrecarga de Métodos (Polimorfismo en Tiempo de Compilación)

Consiste en tener métodos con el mismo nombre pero diferente firma (parámetros distintos).

class Calculadora {
    int sumar(int a, int b) {
        return a + b;
    }

    double sumar(double a, double b) {
        return a + b;
    }
}

Uso de super() y super en Herencia

super() llama al constructor de la clase padre.

super.variable o super.metodo() llama a miembros heredados.

class Persona {
    String nombre;

    Persona(String nombre) {
        this.nombre = nombre;
    }
}

class Jugador extends Persona {
    Jugador(String nombre) {
        super(nombre);  // llama al constructor de Persona
    }

    void mostrarNombre() {
        System.out.println("Jugador: " + super.nombre);
    }
}

Polimorfismo y su Implementación en Java

El polimorfismo es la capacidad que tiene un objeto de comportarse de diferentes formas según el contexto, especialmente cuando se usa una clase padre como tipo de referencia.

📌 Se basa en la herencia y en la sobrescritura de métodos (@Override).

class Animal {
    void hacerSonido() {
        System.out.println("Sonido genérico");
    }
}

class Perro extends Animal {
    @Override
    void hacerSonido() {
        System.out.println("Guau");
    }
}

Estructuras Repetitivas (Bucles) en Java

Bucle for

Se utiliza cuando se conoce el número exacto de iteraciones.

for (int i = 0; i < 5; i++) {
    System.out.println("Valor de i: " + i);
}

Bucle while

El bucle while se usa cuando no sabes exactamente cuántas veces repetir, pero tienes una condición lógica.

int i = 0;
while (i < 5) {
    System.out.println("i vale: " + i);
    i++;
}

Bucle do-while

Igual que while, pero garantiza al menos una ejecución.

int i = 0;
do {
    System.out.println("Ejecutado al menos una vez. i: " + i);
    i++;
} while (i < 5);

Manejo de Ficheros en Java: Detección de Black SEO

public class DetectarBlackSEO {
    public static void main(String[] args) {
        String rutaFichero = "html.txt";  // Nombre del archivo que contiene el HTML

        try (BufferedReader lector = new BufferedReader(new FileReader(rutaFichero))) {
            String linea;
            int numeroLinea = 1;

            while ((linea = lector.readLine()) != null) {
                // Comprobamos si hay black SEO en esta línea
                if (linea.contains("display:none")) {
                    System.out.println("⚠️ Black SEO detectado en línea " + numeroLinea + ": display:none");
                }
                if (linea.contains("font-size:0px")) {
                    System.out.println("⚠️ Black SEO detectado en línea " + numeroLinea + ": font-size:0px");
                }
                if (linea.contains("visibility:hidden")) {
                    System.out.println("⚠️ Black SEO detectado en línea " + numeroLinea + ": visibility:hidden");
                }
                numeroLinea++;
            }

        } catch (IOException e) {
            System.out.println("❌ Error al leer el archivo: " + e.getMessage());
        }
    }
}

Programación Orientada a Objetos (POO) en Java: Conceptos Fundamentales

public class Coche {
    // 1. Atributos (propiedades)
    String marca;
    String modelo;
    int año;
    boolean encendido;

    // 2. Constructor (se usa para crear objetos)
    public Coche(String marca, String modelo, int año) {
        this.marca = marca;
        this.modelo = modelo;
        this.año = año;
        this.encendido = false;  // al principio está apagado
    }

    // 3. Métodos (comportamientos)
    public void encender() {
        if (!encendido) {
            encendido = true;
            System.out.println("🚗 El coche se ha encendido.");
        } else {
            System.out.println("⚠️ El coche ya estaba encendido.");
        }
    }

    public void apagar() {
        if (encendido) {
            encendido = false;
            System.out.println("🔌 El coche se ha apagado.");
        } else {
            System.out.println("⚠️ El coche ya estaba apagado.");
        }
    }

    public void mostrarInfo() {
        System.out.println("Coche: " + marca + " " + modelo + " (" + año + ")");
        System.out.println("¿Encendido?: " + encendido);
    }
}

Ejemplo de Uso de POO: Clase Principal

public class Principal {
    public static void main(String[] args) {
        Coche miCoche = new Coche("Toyota", "Corolla", 2020);

        miCoche.mostrarInfo();  // Ver info del coche
        miCoche.encender();     // Encenderlo
        miCoche.apagar();       // Apagarlo
    }
}

Manejo de Excepciones en Java

Este ejemplo muestra cómo manejar diferentes tipos de excepciones al realizar una división.

import java.util.InputMismatchException;
import java.util.Scanner;

public class CalculadoraDivision {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numerador = 0;
        int denominador = 0;
        boolean correcto = false;

        while (!correcto) {
            try {
                // Pedimos los números
                System.out.print("Introduce el numerador: ");
                numerador = sc.nextInt();

                System.out.print("Introduce el denominador: ");
                denominador = sc.nextInt();

                // Intentamos dividir
                int resultado = numerador / denominador;
                System.out.println("✅ Resultado: " + resultado);

                correcto = true;  // Salimos del bucle si todo va bien

            } catch (ArithmeticException e) {
                System.out.println("❌ Error: No se puede dividir entre cero.");
                sc.nextLine(); // limpiamos el salto de línea
            } catch (InputMismatchException e) {
                System.out.println("❌ Error: Debes introducir un número entero.");
                sc.nextLine(); // limpiamos el texto que metió mal
            }
        }

        System.out.println("Programa terminado.");
        sc.close(); // Cerrar el scanner
    }
}

Entradas relacionadas: