Conecte Java a una base de datos MySQL

322

¿Cómo se conecta a una base de datos MySQL en Java?

Cuando lo intento, me sale

java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)

O

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

O

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
abson
fuente
Aquí hay un breve video tutorial de 3 minutos que demuestra el uso de MySQL desde Java. Compruébelo aquí: Tutorial rápido: Conexión a la base de datos MySQL usando Java
drorw

Respuestas:

208

DriverManagerEs una forma bastante antigua de hacer las cosas. La mejor manera es obtener una DataSource, ya sea buscando una que el contenedor del servidor de aplicaciones ya haya configurado para usted:

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

o crear instancias y configurar una desde el controlador de la base de datos directamente:

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

y luego obtener 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();
Sean Owen
fuente
1
¿Cómo es que usan los otros ejemplos com.mysql.jdbc.Driver? ¿Es este método mejor?
Jason S
77
Creo que esta es la clase de controlador de estilo antiguo que funciona con el mecanismo de controlador de estilo antiguo. MysqlDataSourceimplementa javax.sql.DataSourcecuál es el mecanismo más nuevo.
Sean Owen
1
Hola @SeanOwen Me pregunto, ¿por qué cerramos rsy stmt? ¿Por qué no solo conn?
Kamuran Sönecek
3
Tal vez debería agregar dataSource.setDatabaseName ("base de datos").
Myoch
1
Es una buena práctica cerrar () las cosas explícitamente, aunque es más código. Cualquier buena implementación tendría que cerrar los recursos cuando se cierre la conexión, sí. Sin embargo, tenga en cuenta otros contextos en los que desea reutilizar una declaración o conexión. En la prueba de recursos de Java 7, obtienes este comportamiento gratis de todos modos:
Sean Owen
476

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

  1. Descargue e instale el servidor MySQL . Solo hazlo de la manera habitual. Recuerde el número de puerto siempre que lo haya cambiado. Es por defecto3306.

  2. Descargue el controlador JDBC y póngalo en classpath , extraiga el archivo ZIP y coloque el archivo JAR que contiene en el classpath. 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 a la Ruta de compilación en las propiedades del proyecto.

    Si lo está haciendo "vainilla simple" en la consola de comandos, entonces debe especificar la ruta al archivo JAR en el argumento -cpo -classpathcuando ejecute su aplicación Java.

    java -cp.; / ruta / a / mysql-connector.jar com.example.YourClass

    El .solo está allí para agregar el directorio actual al classpath también para que pueda ubicarlo com.example.YourClassy ;es el separador del classpath como está en Windows. En Unix y clones se :deben utilizar.

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

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Cree un usuario para Java y concédale acceso . Simplemente porque usarrootes una mala práctica.

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

    Sí, javaes el nombre de usuario y passwordla contraseña aquí.

  5. Determine la URL de JDBC . Para conectar la base de datos MySQL utilizando Java, necesita una URL JDBC en 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, puede usarlo localhost. También puede ser una dirección IP como 127.0.0.1. Si encuentra problemas de conectividad y usa en 127.0.0.1lugar de localhostresolverlo, entonces tiene un problema en su configuración de 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 desea conectarse. Eso es javabase.

    Entonces la URL final debería verse así:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Probar la conexión a MySQL usando Java . Cree una clase Java simple con unmain()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 obtiene un SQLException: No suitable driver, significa que el controlador JDBC no se cargó automáticamente o que la URL JDBC es incorrecta (es decir, ninguno de los controladores cargados lo reconoció). Normalmente, un controlador JDBC 4.0 debe cargarse automáticamente cuando lo suelta en classpath en tiempo de ejecución. Para excluir uno y otro, siempre puede cargarlo manualmente de la siguiente manera:

    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 la newInstance()llamada no es necesaria aquí. Es solo para arreglar lo viejo y con errores org.gjt.mm.mysql.Driver. Explicación aquí . Si se lanza esta línea ClassNotFoundException, entonces el archivo JAR que contiene la clase de controlador JDBC simplemente no se ha colocado en el classpath.

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

    Si obtiene un SQLException: Connection refusedo Connection timed outun MySQL específico CommunicationsException: Communications link failure, significa que no se puede acceder al DB 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 JDBC son incorrectos.
    2. El servidor DNS local no reconoce el nombre de host en la URL JDBC.
    3. Falta el número de puerto o es incorrecto en la URL 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 resolver uno u otro, siga los siguientes consejos:

    1. Verifíquelos y pruébelos con ping.
    2. Actualice DNS o use la dirección IP en la URL JDBC en su lugar.
    3. Verifíquelo en base a my.cnfMySQL DB.
    4. Inicia 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 para que cierre las conexiones finally.
    7. Deshabilite el firewall y / o configure el firewall / proxy para permitir / reenviar el puerto.

    Tenga en cuenta que cerrar el Connectiones extremadamente importante. Si no cierra las conexiones y sigue obteniendo muchas en poco tiempo, la base de datos puede quedarse sin conexiones y su aplicación puede fallar. Siempre adquiere el Connectionen una try-with-resourcesdeclaración . O si aún no está en Java 7, ciérrelo explícitamente en finallyun try-finallybloque. Cerrar finallyes solo para asegurarse de que también se cierre en caso de una excepción. Esto también se aplica a Statement, PreparedStatementy ResultSet.

Eso fue todo lo que concierne a la conectividad. Puede encontrar aquí un tutorial más avanzado sobre cómo cargar y almacenar objetos de modelo Java 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 de arranque # 1.

BalusC
fuente
39

Inicializar constantes de base de datos

Cree propiedades constantes de nombre de usuario, contraseña, URL y controladores, 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 fines de 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;
}

Conecta 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

Use esta clase MysqlConnectdirectamente después de cambiar nombre_base_datos, nombre de usuario y 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 base de datos.

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

En otro lugar de tu 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 útil.

Madan Sapkota
fuente
Mark, ¿necesita cada clase mantener su propia instancia de MysqlConnect abierta en todo momento, suponiendo que necesitan interactuar con los datos? Me pregunto cómo funciona esta configuración entre clases.
Michael Sims
en lugar de com.mysql.jdbc.Driveresto jdbc:mysql://localhost:3306/stocksdebe usarse ya que el primero está en desuso.
Chaudhry Waqas
Si va a conectar el nombre de la cuenta, la contraseña, el nombre de la base de datos, etc., esta forma es muy torpe. Simplemente ponga todos esos detalles en la cadena de URL JDBC. (Incluyendo el tamaño de la piscina ...)
Stephen C
24
String url = "jdbc:mysql://127.0.0.1:3306/yourdatabase";
String user = "username";
String password = "password";

// Load the Connector/J driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
// Establish connection to MySQL
Connection conn = DriverManager.getConnection(url, user, password);
Heffaklump
fuente
¿Cuál es su base de datos aquí? ¿nombre de la base de datos?
Koray Tugay
newInstance () no es necesario. ¿Lo es?
Mohamed Ennahdi El Idrissi
No No lo es Y desde Java 6, todo este enfoque está desactualizado. Y el nombre de la clase del conductor ha cambiado y ...
Stephen C
12

Aquí está lo mínimo que necesita para obtener datos de una base de datos MySQL:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection
   ("jdbc:mysql://localhost:3306/foo", "root", "password");

Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM `FOO.BAR`");
stmt.close();
conn.close();

Agregue manejo de excepciones, configuración, etc. al gusto.

Kilian Foth
fuente
3
¿por qué necesita Class.forName(...).newInstance()?
Don Cheadle
55
@mmcrae No lo haces, desde 2007.
Marqués de Lorne
3

Conexión MySQL JDBC con useSSL.

private String db_server = BaseMethods.getSystemData("db_server");
private String db_user = BaseMethods.getSystemData("db_user");
private String db_password = BaseMethods.getSystemData("db_password");

private String connectToDb() throws Exception {
   String jdbcDriver = "com.mysql.jdbc.Driver";
   String dbUrl = "jdbc:mysql://" + db_server  +
        "?verifyServerCertificate=false" +
        "&useSSL=true" +
        "&requireSSL=true";
    System.setProperty(jdbcDriver, "");
    Class.forName(jdbcDriver).newInstance();

    Connection conn = DriverManager.getConnection(dbUrl, db_user, db_password);
    Statement statement = conn.createStatement();
    String query = "SELECT EXTERNAL_ID FROM offer_letter where ID =" + "\"" + letterID + "\"";
    ResultSet resultSet = statement.executeQuery(query);
    resultSet.next();
    return resultSet.getString(1);
}
AJC
fuente
2

necesita tener el conector del conector mysql en su classpath.

en Java JDBC API hace todo con bases de datos. usando JDBC podemos escribir aplicaciones Java para
1. Enviar consultas o actualizar SQL a DB (cualquier base de datos relacional) 2. Recuperar y procesar los resultados de DB

con los siguientes tres pasos podemos recuperar datos de cualquier base de datos

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table");

while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
}
kapil das
fuente
2

Código corto y dulce.

try {       
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","");
    //Database Name - testDB, Username - "root", Password - ""
    System.out.println("Connected...");         
} catch(Exception e) {
    e.printStackTrace();
}

Para SQL Server 2012

try {
    String url = "jdbc:sqlserver://KHILAN:1433;databaseName=testDB;user=Khilan;password=Tuxedo123"; 
    //KHILAN is Host    and 1433 is port number     
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection(url);
    System.out.println("Connected...");
} catch(Exception e) {
    e.printStackTrace();
}
KhiLan PaTeL
fuente
1

ConnectionEstaba usando hace algún tiempo, parecía la forma más fácil, pero también había recomendaciones para hacer una ifdeclaración, exactamente

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);
if (con != null){
 //..handle your code there 
}

O algo así de esa manera :)

Probablemente hay algún caso, mientras que getConnectionpuede volver null :)

xxxvodnikxxx
fuente
1

Puede ver todos los pasos para conectar la base de datos MySQL desde la aplicación Java aquí . Para otra base de datos, solo necesita cambiar el controlador solo en el primer paso. Asegúrese de proporcionar la ruta correcta a la base de datos y el nombre de usuario y contraseña correctos.

Visite http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

Jwalant
fuente
1
CÓMO
  • Para configurar el controlador para ejecutar una muestra rápida
1. Go to https://dev.mysql.com/downloads/connector/j/, get the latest version of Connector/J

2. Remember to set the classpath to include the path of the connector jar file.
If we don't set it correctly, below errors can occur:

No suitable driver found for jdbc:mysql://127.0.0.1:3306/msystem_development

java.lang.ClassNotFoundException: com.mysql.jdbc:Driver
  • Para configurar el CLASSPATH

Método 1: establezca la variable CLASSPATH.

export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile

En el comando anterior, configuré CLASSPATH en la carpeta actual y el archivo mysql-connector-java-VERSION.jar. Entonces, cuando se java MyClassFileejecuta el comando, el iniciador de aplicaciones Java intentará cargar toda la clase Java en CLASSPATH. Y descubrió que la Driveclase => errores de BOOM había desaparecido.

Método 2:

java -cp .:mysql-connector-java-VERSION.jar MyClassFile

Nota: Class.forName ("com.mysql.jdbc.Driver"); Esto está en desuso en este momento 2019 Abr.

¡Espero que esto pueda ayudar a alguién!

Nhat Dinh
fuente
-1

Conexión MySql JDBC:

Class.forName("com.mysql.jdbc.Driver");     

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName","Username","Password");         
Statement stmt=con.createStatement();            
stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("Select * from Table");  
Sarat Chandra
fuente
-1

Descargar JDBC Driver

Enlace de descarga (Seleccione plataforma independiente): https://dev.mysql.com/downloads/connector/j/

Mueva el controlador JDBC a la unidad C

Descomprima los archivos y muévase a C: \ drive. Su ruta del conductor debe ser comoC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Ejecute su Java

java -cp "C:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19.jar" testMySQL.java

testMySQL.java

import java.sql.*;
import java.io.*;

public class testMySQL {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        try
        {  
            Class.forName("com.mysql.cj.jdbc.Driver");  
            Connection con=DriverManager.getConnection(  
                "jdbc:mysql://localhost:3306/db?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root","");  
            Statement stmt=con.createStatement();  
            ResultSet rs=stmt.executeQuery("show databases;");  
            System.out.println("Connected");  
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

    }  

}

ingrese la descripción de la imagen aquí

Chew Zai
fuente
-2

Código corto

public class DB {

    public static Connection c;

    public static Connection getConnection() throws Exception {
        if (c == null) {
            Class.forName("com.mysql.jdbc.Driver");
            c =DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASE", "USERNAME", "Password");
        }
        return c;
    }

    // Send data TO Database
    public static void setData(String sql) throws Exception {
        DB.getConnection().createStatement().executeUpdate(sql);
    }

    // Get Data From Database
    public static ResultSet getData(String sql) throws Exception {
        ResultSet rs = DB.getConnection().createStatement().executeQuery(sql);
        return rs;
    }
}
Corrupted_S.K
fuente