Saltar al contenido

Conectar Java a una base de datos MySQL

Solución:

Aquí hay una explicación paso a paso de cómo instalar MySQL y JDBC y cómo usarlo:

  1. Descargue e instale el servidor MySQL. Hágalo de la forma habitual. Recuerde el número de puerto siempre que lo cambie. Es por defecto 3306.

  2. Descargue el controlador JDBC y colóquelo en classpath, extraiga el archivo ZIP y coloque el archivo JAR que lo contiene en la ruta de clase. El controlador JDBC específico del proveedor es una implementación concreta de la API JDBC (tutorial aquí).

    Si está utilizando un IDE como Eclipse o Netbeans, puede agregarlo a la ruta de clase agregando el archivo JAR como Biblioteca al Construir camino en las propiedades del proyecto.

    Si lo está haciendo “simple y llanamente” en la consola de comandos, debe especificar la ruta al archivo JAR en el -cp o -classpath argumento al ejecutar su aplicación Java.

    java -cp .;/path/to/mysql-connector.jar com.example.YourClass

    los . está ahí para agregar el Actual directorio a la ruta de clases también para que pueda localizar com.example.YourClass y el ; es el separador de rutas de clases como en Windows. En Unix y clones : debería ser usado.

  3. Crea una base de datos en MySQL. Creemos una base de datos javabase. Por supuesto que quieres World Domination, así que usemos UTF-8 también.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  4. Crea un usuario para Java y concédele acceso. Simplemente porque usando root es una mala práctica.

    CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
    

    Sí, java es el nombre de usuario y password es la contraseña aquí.

  5. Determine la URL de JDBC. Para conectar la base de datos MySQL usando Java, necesita una URL JDBC con la siguiente sintaxis:

    jdbc:mysql://hostname:port/databasename
    • hostname: El nombre de host donde está instalado el servidor MySQL. Si está instalado en la misma máquina donde ejecuta el código Java, entonces puede usar localhost. También puede ser una dirección IP como 127.0.0.1. Si encuentra problemas de conectividad y utiliza 127.0.0.1 en lugar de localhost resuelto, entonces tiene un problema en la configuración de su red / DNS / hosts.

    • port: El puerto TCP / IP donde escucha el servidor MySQL. Esto es por defecto 3306.

    • databasename: El nombre de la base de datos a la que le gustaría conectarse. Esa es javabase.

    Entonces, la URL final debería verse así:

    jdbc:mysql://localhost:3306/javabase
  6. Pruebe la conexión a MySQL usando Java. Cree una clase Java simple con un main() método para probar la conexión.

    String url = "jdbc:mysql://localhost:3306/javabase";
    String username = "java";
    String password = "password";
    
    System.out.println("Connecting database...");
    
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
        System.out.println("Database connected!");
    } catch (SQLException e) {
        throw new IllegalStateException("Cannot connect the database!", e);
    }
    

    Si obtienes un SQLException: No suitable driver, entonces significa que el controlador JDBC no se cargó automáticamente o que la URL de JDBC es incorrecta (es decir, no fue reconocida por ninguno de los controladores cargados). Normalmente, un controlador JDBC 4.0 debe cargarse automáticamente cuando lo suelte en classpath en tiempo de ejecución. Para excluir uno y otro, siempre puede cargarlo manualmente como se muestra a continuación:

    System.out.println("Loading driver...");
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }
    

    Tenga en cuenta que el newInstance() la llamada es no necesario aquí. Es solo para arreglar lo viejo y con errores org.gjt.mm.mysql.Driver. Explicación aquí. Si esta linea arroja ClassNotFoundException, entonces el archivo JAR que contiene la clase del controlador JDBC simplemente no se ha colocado en la ruta de clases.

    Tenga en cuenta que no necesita cargar el controlador cada vez antes de conectando. Solo una vez durante el inicio de la aplicación es suficiente.

    Si obtienes un SQLException: Connection refused o Connection timed out o un MySQL específico CommunicationsException:
    Communications link failure
    , entonces significa que la base de datos no es accesible en absoluto. Esto puede tener una o más de las siguientes causas:

    1. La dirección IP o el nombre de host en la URL de JDBC son incorrectos.

    2. El servidor DNS local no reconoce el nombre de host en la URL de JDBC.
    3. Falta el número de puerto o es incorrecto en la URL de JDBC.
    4. El servidor de base de datos está inactivo.
    5. El servidor de base de datos no acepta conexiones TCP / IP.
    6. El servidor de base de datos se ha quedado sin conexiones.
    7. Algo entre Java y DB está bloqueando las conexiones, por ejemplo, un firewall o proxy.

    Para solucionar uno u otro, siga los siguientes consejos:

    1. Verifíquelos y pruébelos con ping.
    2. Actualice el DNS o utilice la dirección IP en la URL de JDBC en su lugar.
    3. Verifíquelo en base a my.cnf de MySQL DB.
    4. Inicie la base de datos.
    5. Verifique si mysqld se inicia sin el --skip-networking option.
    6. Reinicie la base de datos y corrija su código en consecuencia que cierra las conexiones en finally.
    7. Deshabilite el firewall y / o configure el firewall / proxy para permitir / reenviar el puerto.

    Tenga en cuenta que al cerrar el Connection es extremadamente importante. Si no cierra las conexiones y sigue obteniendo muchas de ellas en poco tiempo, es posible que la base de datos se quede sin conexiones y su aplicación se rompa. Adquiera siempre el Connection en un try-with-resources declaración. O si aún no está en Java 7, ciérrelo explícitamente en finally de un try-finally cuadra. Cerrando en finally es solo para asegurarse de que también se cierre en caso de una excepción. Esto también se aplica a Statement, PreparedStatement y ResultSet.

Eso fue todo en lo que respecta a la conectividad. Puede encontrar aquí un tutorial más avanzado sobre cómo cargar y almacenar objetos de modelo Java completos en una base de datos con la ayuda de una clase DAO básica.


Usar un patrón Singleton para la conexión DB es un mal enfoque. Consulte entre otras preguntas: http://stackoverflow.com/q/9428573/. Este es un error # 1 para los principiantes.

DriverManager es una forma bastante antigua de hacer las cosas. La mejor forma es conseguir un DataSource, ya sea buscando uno que el contenedor de su servidor de aplicaciones ya esté configurado para usted:

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");

o instanciar y configurar uno desde el controlador de su base de datos directamente:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");

y luego obtenga conexiones de él, igual que arriba:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();

Inicializar las constantes de la base de datos

Cree el nombre de usuario, la contraseña, la URL y los controladores de la base de datos de propiedades constantes, el límite de sondeo, etc.

// init database constants
// com.mysql.jdbc.Driver
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
private static final String USERNAME = "root";
private static final String PASSWORD = "";
private static final String MAX_POOL = "250"; // set your own limit

Inicializar conexión y propiedades

Una vez que se establece la conexión, es mejor almacenar para su reutilización.

// init connection object
private Connection connection;
// init properties object
private Properties properties;

Crear propiedades

El objeto de propiedades contiene la información de conexión, verifique si ya está configurado.

// create properties
private Properties getProperties() {
    if (properties == null) {
        properties = new Properties();
        properties.setProperty("user", USERNAME);
        properties.setProperty("password", PASSWORD);
        properties.setProperty("MaxPooledStatements", MAX_POOL);
    }
    return properties;
}

Conectar la base de datos

Ahora conéctese a la base de datos usando las constantes y propiedades inicializadas.

// connect database
public Connection connect() {
    if (connection == null) {
        try {
            Class.forName(DATABASE_DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL, getProperties());
        } catch (ClassNotFoundException | SQLException e) {
            // Java 7+
            e.printStackTrace();
        }
    }
    return connection;
}

Desconectar la base de datos

Una vez que haya terminado con las operaciones de la base de datos, simplemente cierre la conexión.

// disconnect database
public void disconnect() {
    if (connection != null) {
        try {
            connection.close();
            connection = null;
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Todo junto

Usa esta clase MysqlConnect directamente después de cambiar el nombre de la base de datos, el nombre de usuario y la contraseña, etc.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MysqlConnect {
    // init database constants
    private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "";
    private static final String MAX_POOL = "250";

    // init connection object
    private Connection connection;
    // init properties object
    private Properties properties;

    // create properties
    private Properties getProperties() {
        if (properties == null) {
            properties = new Properties();
            properties.setProperty("user", USERNAME);
            properties.setProperty("password", PASSWORD);
            properties.setProperty("MaxPooledStatements", MAX_POOL);
        }
        return properties;
    }

    // connect database
    public Connection connect() {
        if (connection == null) {
            try {
                Class.forName(DATABASE_DRIVER);
                connection = DriverManager.getConnection(DATABASE_URL, getProperties());
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

    // disconnect database
    public void disconnect() {
        if (connection != null) {
            try {
                connection.close();
                connection = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

¿Cómo utilizar?

Inicialice la clase de la base de datos.

// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();

En algún otro lugar de su código …

String sql = "SELECT * FROM `stackoverflow`";
try {
    PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql);
    ... go on ...
    ... go on ...
    ... DONE ....
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    mysqlConnect.disconnect();
}

Esto es todo 🙂 ¡Si hay algo para mejorar, edítalo! Espero que esto sea de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *